def _send_tx_proposal(channel_id, tx_context, peers, cc_type=CC_TYPE_GOLANG): request = tx_context.tx_prop_req args = [] if request.fcn: args.append(proto_b(request.fcn)) else: args.append(proto_b(CC_INVOKE)) for arg in request.args: if isinstance(arg, bytes): args.append(arg) else: args.append(proto_b(arg)) cc_id = chaincode_pb2.ChaincodeID() cc_id.name = request.cc_name if request.prop_type not in (CC_QUERY, CC_INVOKE): cc_id.version = request.cc_version cc_input = chaincode_pb2.ChaincodeInput() cc_input.args.extend(args) cc_spec = chaincode_pb2.ChaincodeSpec() cc_spec.type = chaincode_pb2.ChaincodeSpec.Type.Value(cc_type) cc_spec.chaincode_id.CopyFrom(cc_id) cc_spec.input.CopyFrom(cc_input) extension = proposal_pb2.ChaincodeHeaderExtension() extension.chaincode_id.name = request.cc_name cc_invoke_spec = chaincode_pb2.ChaincodeInvocationSpec() cc_invoke_spec.chaincode_spec.CopyFrom(cc_spec) channel_header = build_channel_header( common_pb2.ENDORSER_TRANSACTION, tx_context.tx_id, channel_id, current_timestamp(), tx_context.epoch, extension=extension.SerializeToString()) header = build_header(tx_context.identity, channel_header, tx_context.nonce) # chaincode real proposal proposal = build_cc_proposal(cc_invoke_spec, header, request.transient_map) signed_proposal = utils.sign_proposal(tx_context, proposal) responses = [peer.send_proposal(signed_proposal) for peer in peers] # chaincode proposal without transient map # https://jira.hyperledger.org/browse/FAB-12536?focusedCommentId=52438&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-52438 # noqa proposal = build_cc_proposal(cc_invoke_spec, header, None) return responses, proposal, header
def create_cc_spec(chaincode_input, chaincode_id, type): chaincode_spec = chaincode_pb2.ChaincodeSpec() chaincode_spec.type = chaincode_pb2.ChaincodeSpec.Type.Value(type) chaincode_spec.chaincode_id.CopyFrom(chaincode_id) chaincode_spec.input.CopyFrom(chaincode_input) return chaincode_spec
def _send_tx_proposal(channel_id, tx_context, peers): request = tx_context.tx_prop_req args = [] if request.fcn: args.append(proto_b(request.fcn)) else: args.append(proto_b(CC_INVOKE)) for arg in request.args: if isinstance(arg, bytes): args.append(arg) else: args.append(proto_b(arg)) cc_id = chaincode_pb2.ChaincodeID() cc_id.name = request.cc_name if request.prop_type != CC_QUERY: cc_id.version = request.cc_version cc_input = chaincode_pb2.ChaincodeInput() cc_input.args.extend(args) cc_spec = chaincode_pb2.ChaincodeSpec() cc_spec.type = chaincode_pb2.ChaincodeSpec.Type.Value(CC_TYPE_GOLANG) cc_spec.chaincode_id.CopyFrom(cc_id) cc_spec.input.CopyFrom(cc_input) extension = proposal_pb2.ChaincodeHeaderExtension() extension.chaincode_id.name = request.cc_name cc_invoke_spec = chaincode_pb2.ChaincodeInvocationSpec() cc_invoke_spec.chaincode_spec.CopyFrom(cc_spec) channel_header = build_channel_header( common_pb2.ENDORSER_TRANSACTION, tx_context.tx_id, channel_id, current_timestamp(), tx_context.epoch, extension=extension.SerializeToString()) header = build_header(tx_context.identity, channel_header, tx_context.nonce) proposal = build_cc_proposal(cc_invoke_spec, header, request.transient_map) signed_proposal = utils.sign_proposal(tx_context, proposal) send_executions = [ peer.send_proposal(signed_proposal) for peer in peers ] return rx.Observable.merge(send_executions).to_iterable() \ .map(lambda responses: (responses, proposal, header))
def create_chaincode_spec(block_bytes, chaincode_id_name, type): chaincode_input = chaincode_pb2.ChaincodeInput() chaincode_input.args.append(block_bytes) chaincode_id = chaincode_pb2.ChaincodeID() chaincode_id.name = chaincode_id_name chaincode_spec = chaincode_pb2.ChaincodeSpec() chaincode_spec.type = chaincode_pb2.ChaincodeSpec.Type.Value(type) chaincode_spec.chaincode_id.CopyFrom(chaincode_id) chaincode_spec.input.CopyFrom(chaincode_input) return chaincode_spec.SerializeToString()