def createGenesisBlock(context, chainId, networkConfigPolicy, consensusType): 'Generates the genesis block for starting the oderers and for use in the chain config transaction by peers' #assert not "bootstrapGenesisBlock" in context,"Genesis block already created:\n{0}".format(context.bootstrapGenesisBlock) directory = getDirectory(context) assert len( directory.ordererAdminTuples) > 0, "No orderer admin tuples defined!!!" bootstrapHelper = BootstrapHelper(chainId=chainId, consensusType=consensusType) configItems = [] configItems.append(bootstrapHelper.encodeBatchSize()) configItems.append(bootstrapHelper.encodeConsensusType()) configItems.append(bootstrapHelper.encodeChainCreators()) configItems.append(bootstrapHelper.encodeAcceptAllPolicy()) configItems.append(bootstrapHelper.lockDefaultModificationPolicy()) configEnvelope = common_dot_configuration_pb2.ConfigurationEnvelope( Items=configItems) payloadChainHeader = bootstrapHelper.makeChainHeader( type=common_dot_common_pb2.HeaderType.Value( "CONFIGURATION_TRANSACTION")) #Now the SignatureHeader serializedCreatorCertChain = None nonce = None payloadSignatureHeader = common_dot_common_pb2.SignatureHeader( creator=serializedCreatorCertChain, nonce=bootstrapHelper.getNonce(), ) payloadHeader = common_dot_common_pb2.Header( chainHeader=payloadChainHeader, signatureHeader=payloadSignatureHeader, ) payload = common_dot_common_pb2.Payload( header=payloadHeader, data=configEnvelope.SerializeToString()) envelope = common_dot_common_pb2.Envelope( payload=payload.SerializeToString(), signature=None) blockData = common_dot_common_pb2.BlockData( Data=[envelope.SerializeToString()]) block = common_dot_common_pb2.Block( Header=common_dot_common_pb2.BlockHeader( Number=0, PreviousHash=None, DataHash=bootstrapHelper.computeBlockDataHash(blockData), ), Data=blockData, Metadata=None, ) # Add this back once crypto certs are required for nodeAdminTuple in directory.ordererAdminTuples: userCert = directory.ordererAdminTuples[nodeAdminTuple] certAsPEM = crypto.dump_certificate(crypto.FILETYPE_PEM, userCert) # print("UserCert for orderer genesis:\n{0}\n".format(certAsPEM)) # print("") return block
class BootstrapHelper: KEY_CONSENSUS_TYPE = "ConsensusType" KEY_CHAIN_CREATION_POLICY_NAMES = "ChainCreationPolicyNames" KEY_ACCEPT_ALL_POLICY = "AcceptAllPolicy" KEY_INGRESS_POLICY = "IngressPolicyNames" KEY_EGRESS_POLICY = "EgressPolicyNames" KEY_HASHING_ALGORITHM = "HashingAlgorithm" KEY_BATCH_SIZE = "BatchSize" KEY_BATCH_TIMEOUT = "BatchTimeout" KEY_CREATIONPOLICY = "CreationPolicy" KEY_MSP_INFO = "MSP" KEY_ANCHOR_PEERS = "AnchorPeers" KEY_NEW_CONFIGURATION_ITEM_POLICY = "NewConfigurationItemPolicy" DEFAULT_CHAIN_CREATORS = [KEY_ACCEPT_ALL_POLICY] DEFAULT_NONCE_SIZE = 24 def __init__(self, chainId="TestChain", lastModified=0, msgVersion=1, epoch=0, consensusType="solo", batchSize=10, batchTimeout="10s", absoluteMaxBytes=100000000, preferredMaxBytes=512 * 1024, signers=[]): self.chainId = str(chainId) self.lastModified = lastModified self.msgVersion = msgVersion self.epoch = epoch self.consensusType = consensusType self.batchSize = batchSize self.batchTimeout = batchTimeout self.absoluteMaxBytes = absoluteMaxBytes self.preferredMaxBytes = preferredMaxBytes self.signers = signers @classmethod def getNonce(cls): return rand.bytes(BootstrapHelper.DEFAULT_NONCE_SIZE) @classmethod def addSignatureToSignedConfigItem(cls, signedConfigItem, (entity, cert)): sigHeader = common_dot_common_pb2.SignatureHeader( creator=crypto.dump_certificate(crypto.FILETYPE_ASN1, cert), nonce=BootstrapHelper.getNonce()) sigHeaderBytes = sigHeader.SerializeToString() # Signature over the concatenation of configurationItem bytes and signatureHeader bytes signature = entity.sign(signedConfigItem.ConfigurationItem + sigHeaderBytes) # Now add new signature to Signatures repeated field newConfigSig = signedConfigItem.Signatures.add() newConfigSig.signatureHeader = sigHeaderBytes newConfigSig.signature = signature
def _testAccessPBMethods(): channel_header = common_pb2.ChannelHeader(channel_id=TEST_CHAIN_ID, type=common_pb2.ENDORSER_TRANSACTION) header = common_pb2.Header(channel_header=channel_header.SerializeToString(), signature_header=common_pb2.SignatureHeader().SerializeToString()) payload = common_pb2.Payload(header=header, data="Functional test: {0}".format(datetime.datetime.utcnow())) envelope = common_pb2.Envelope(payload=payload.SerializeToString()) return envelope
def generateMessageEnvelope(): channel_header = common_pb2.ChannelHeader(channel_id=endorser_util.TEST_CHANNEL_ID, type=common_pb2.ENDORSER_TRANSACTION) header = common_pb2.Header(channel_header=channel_header.SerializeToString(), signature_header=common_pb2.SignatureHeader().SerializeToString()) payload = common_pb2.Payload(header=header, data=str.encode("Functional test: {0}".format(datetime.datetime.utcnow())) ) envelope = common_pb2.Envelope(payload=payload.SerializeToString()) return envelope
def _defaultDataFunction(index): payload = common_pb2.Payload( header=common_pb2.Header( chainHeader=common_pb2.ChainHeader( chainID=TEST_CHAIN_ID, type=common_pb2.ENDORSER_TRANSACTION, ), signatureHeader=common_pb2.SignatureHeader(), ), data=str("BDD test: {0}".format(datetime.datetime.utcnow())), ) envelope = common_pb2.Envelope(payload=payload.SerializeToString()) return envelope
def createSeekInfo(chainID = TEST_CHAIN_ID, start = 'Oldest', end = 'Newest', behavior = 'FAIL_IF_NOT_READY'): return common_pb2.Envelope( payload = common_pb2.Payload( header = common_pb2.Header( channel_header = common_pb2.ChannelHeader( channel_id = chainID ).SerializeToString(), signature_header = common_pb2.SignatureHeader().SerializeToString(), ), data = ab_pb2.SeekInfo( start = seekPosition(start), stop = seekPosition(end), behavior = ab_pb2.SeekInfo.SeekBehavior.Value(behavior), ).SerializeToString(), ).SerializeToString(), )
class BootstrapHelper: KEY_CONSENSUS_TYPE = "ConsensusType" KEY_CHAIN_CREATORS = "ChainCreators" KEY_ACCEPT_ALL_POLICY = "AcceptAllPolicy" KEY_INGRESS_POLICY = "IngressPolicy" KEY_EGRESS_POLICY = "EgressPolicy" KEY_BATCH_SIZE = "BatchSize" KEY_CREATIONPOLICY = "CreationPolicy" DEFAULT_MODIFICATION_POLICY_ID = "DefaultModificationPolicy" DEFAULT_CHAIN_CREATORS = [KEY_ACCEPT_ALL_POLICY] DEFAULT_NONCE_SIZE = 24 def __init__(self, chainId="TestChain", lastModified=0, msgVersion=1, epoch=0, consensusType="solo", batchSize=10, absoluteMaxBytes=100000000, signers=[]): self.chainId = str(chainId) self.lastModified = lastModified self.msgVersion = msgVersion self.epoch = epoch self.consensusType = consensusType self.batchSize = batchSize self.absoluteMaxBytes = absoluteMaxBytes self.signers = signers @classmethod def getNonce(cls): return rand.bytes(BootstrapHelper.DEFAULT_NONCE_SIZE) @classmethod def addSignatureToSignedConfigItem(cls, signedConfigItem, (signingKey, cert)): sigHeader = common_dot_common_pb2.SignatureHeader( creator=crypto.dump_certificate(crypto.FILETYPE_ASN1, cert), nonce=BootstrapHelper.getNonce()) sigHeaderBytes = sigHeader.SerializeToString() # Signature over the concatenation of configurationItem bytes and signatureHeader bytes signature = signingKey.sign(signedConfigItem.ConfigurationItem + sigHeaderBytes) # Now add new signature to Signatures repeated field newConfigSig = signedConfigItem.Signatures.add() newConfigSig.signatureHeader = sigHeaderBytes newConfigSig.signature = signature
def createConfigTxEnvelope(chainId, signedConfigEnvelope): bootstrapHelper = BootstrapHelper(chainId=chainId) payloadChainHeader = bootstrapHelper.makeChainHeader( type=common_dot_common_pb2.HeaderType.Value( "CONFIGURATION_TRANSACTION")) #Now the SignatureHeader serializedCreatorCertChain = None nonce = None payloadSignatureHeader = common_dot_common_pb2.SignatureHeader( creator=serializedCreatorCertChain, nonce=bootstrapHelper.getNonce(), ) payloadHeader = common_dot_common_pb2.Header( chainHeader=payloadChainHeader, signatureHeader=payloadSignatureHeader, ) payload = common_dot_common_pb2.Payload( header=payloadHeader, data=signedConfigEnvelope.SerializeToString()) envelope = common_dot_common_pb2.Envelope( payload=payload.SerializeToString(), signature=None) return envelope
def makeSignatureHeader(self, serializeCertChain, nonce): return common_dot_common_pb2.SignatureHeader( creator=serializeCertChain, nonce=nonce)