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