github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/bddtests/steps/endorser_util.py (about)

     1  
     2  import os
     3  import json
     4  from contexthelper import ContextHelper
     5  import bdd_test_util
     6  import bdd_grpc_util
     7  import bootstrap_util
     8  from peer import chaincode_pb2
     9  from peer import chaincode_proposal_pb2
    10  from peer import proposal_pb2
    11  from peer import peer_pb2_grpc
    12  import identities_pb2
    13  
    14  from common import common_pb2 as common_dot_common_pb2
    15  
    16  from OpenSSL import crypto
    17  
    18  def getChaincodeSpec(ccType, path, name, args):
    19  	# make chaincode spec for chaincode to be deployed
    20  	ccSpec = chaincode_pb2.ChaincodeSpec(type=chaincode_pb2.ChaincodeSpec.Type.Value(ccType),
    21  		chaincode_id = chaincode_pb2.ChaincodeID(path=path, name=name, version="test"),
    22  		input = chaincode_pb2.ChaincodeInput(args = args))
    23  	return ccSpec
    24  
    25  def createPropsalId():
    26  	return 'TODO proposal Id'
    27  
    28  def createInvokeProposalForBDD(context, ccSpec, chainID, signersCert, Mspid, type):
    29      import binascii
    30  
    31      "Returns a deployment proposal of chaincode type"
    32      lc_chaincode_invocation_spec = chaincode_pb2.ChaincodeInvocationSpec(chaincode_spec = ccSpec)
    33  
    34      # Create
    35      ccHdrExt = proposal_pb2.ChaincodeHeaderExtension(chaincode_id=ccSpec.chaincode_id)
    36  
    37      ccProposalPayload = proposal_pb2.ChaincodeProposalPayload(input=lc_chaincode_invocation_spec.SerializeToString())
    38  
    39      bootstrapHelper = ContextHelper.GetHelper(context=context).getBootrapHelper(chainId=chainID)
    40  
    41      serializedIdentity = identities_pb2.SerializedIdentity(Mspid=Mspid, IdBytes=crypto.dump_certificate(crypto.FILETYPE_PEM, signersCert))
    42  
    43      nonce = bootstrap_util.BootstrapHelper.getNonce()
    44  
    45      sigHdr = bootstrapHelper.makeSignatureHeader(serializedIdentity.SerializeToString(), nonce)
    46      
    47      # Calculate the transaction ID
    48      tx_id = binascii.hexlify(bootstrap_util.computeCryptoHash(nonce + serializedIdentity.SerializeToString()))
    49  
    50      chainHdr = bootstrapHelper.makeChainHeader(type=common_dot_common_pb2.HeaderType.Value(type),
    51                                                 txID=tx_id, extension=ccHdrExt.SerializeToString())
    52  
    53      header = common_dot_common_pb2.Header(channel_header=chainHdr, signature_header=sigHdr)
    54  
    55      # make proposal
    56      proposal = proposal_pb2.Proposal(header=header.SerializeToString(), payload=ccProposalPayload.SerializeToString())
    57  
    58  
    59      return proposal
    60  
    61  
    62  def signProposal(proposal, entity, signersCert):
    63  	import binascii
    64  	# Sign the proposal
    65  	proposalBytes = proposal.SerializeToString()
    66  	signature = entity.sign(proposalBytes)
    67  	#Verify the signature
    68  	entity.verifySignature(signature=signature, signersCert=signersCert, data=proposalBytes)
    69  	# print("Proposal Bytes signature= \n{0}\n\n".format(binascii.hexlify(bytearray(signature))))
    70  	signedProposal = proposal_pb2.SignedProposal(proposal_bytes=proposalBytes, signature=signature)
    71  	return signedProposal
    72  
    73  
    74  def createDeploymentChaincodeSpecForBDD(ccDeploymentSpec, chainID):
    75      lc_chaincode_spec = getChaincodeSpec(ccType="GOLANG", path="", name="lccc",
    76                                           args=['deploy', chainID, ccDeploymentSpec.SerializeToString()])
    77  	# lc_chaincode_spec = chaincode_pb2.ChaincodeSpec(type = chaincode_pb2.ChaincodeSpec.GOLANG,
    78  	# 									 chaincode_id = chaincode_pb2.ChaincodeID(name="lccc"),
    79  	# 									 input = chaincode_pb2.ChaincodeInput(args = ['deploy', chainID, ccDeploymentSpec.SerializeToString()]))
    80      return lc_chaincode_spec
    81  
    82  def getEndorserStubs(context, composeServices):
    83      stubs = []
    84      for composeService in composeServices:
    85          ipAddress = bdd_test_util.ipFromContainerNamePart(composeService, context.compose_containers)
    86          channel = bdd_grpc_util.getGRPCChannel(ipAddress)
    87          newEndorserStub = peer_pb2_grpc.EndorserStub(channel)
    88          stubs.append(newEndorserStub)
    89      return stubs
    90  
    91  def getExample02ChaincodeSpec():
    92      return getChaincodeSpec("GOLANG", "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02", "example02", ["init","a","100","b","200"])
    93  
    94  
    95  
    96  def _createDeploymentSpecAsFile(ccSpec, outputPath):
    97      '''peer chaincode package -n myCC -c '{"Args":["init","a","100","b","200"]}' -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 --logging-level=DEBUG test.file'''
    98      myEnv = os.environ.copy()
    99      myEnv['CORE_PEER_MSPCONFIGPATH'] = "./../msp/sampleConfig"
   100      nameArgs = ["-n", ccSpec.chaincode_id.name]
   101      ctorArgs = ["-c", json.dumps({'Args' : [item for item in ccSpec.input.args]})]
   102      pathArgs = ["-p", ccSpec.chaincode_id.path]
   103      versionArgs = ["-v", ccSpec.chaincode_id.version]
   104      output, error, returncode = \
   105          bdd_test_util.cli_call(["peer","chaincode","package"] + nameArgs + ctorArgs + pathArgs + versionArgs + [outputPath], expect_success=True, env=myEnv)
   106      return output
   107  
   108  
   109  def createDeploymentSpec(context, ccSpec):
   110      contextHelper = ContextHelper.GetHelper(context=context)
   111      contextHelper.getBootrapHelper(chainId="test")
   112      cacheDeploymentSpec = contextHelper.isConfigEnabled("cache-deployment-spec")
   113      fileName = "deploymentspec-{0}-{1}-{2}".format(chaincode_pb2.ChaincodeSpec.Type.Name(ccSpec.type), ccSpec.chaincode_id.path, ccSpec.chaincode_id.name)
   114      outputPath, fileExists = contextHelper.getTmpPathForName(name=fileName,
   115                                                               copyFromCache=cacheDeploymentSpec)
   116      if not fileExists:
   117          _createDeploymentSpecAsFile(ccSpec=ccSpec, outputPath=outputPath)
   118          if cacheDeploymentSpec:
   119              contextHelper.copyToCache(fileName)
   120      ccDeploymentSpec = chaincode_pb2.ChaincodeDeploymentSpec()
   121      with open(outputPath, 'rb') as f:
   122          ccDeploymentSpec.ParseFromString(f.read())
   123      return ccDeploymentSpec