def join_channel(self, request): """ To join the peer to a channel. Args: request: the request to join a channel Return: True in sucess or False in failure """ _logger.debug('channel_join - start') for key in ['targets', 'block', 'tx_context']: if key not in request: err_msg = "Missing parameter {}".format(key) _logger.error('channel_join error: {}'.format(err_msg)) raise ValueError(err_msg) chaincode_input = chaincode_pb2.ChaincodeInput() chaincode_input.args.extend([proto_b("JoinChain"), request['block']]) chaincode_id = chaincode_pb2.ChaincodeID() chaincode_id.name = proto_str("cscc") cc_spec = create_cc_spec(chaincode_input, chaincode_id, 'GOLANG') cc_invoke_spec = chaincode_pb2.ChaincodeInvocationSpec() cc_invoke_spec.chaincode_spec.CopyFrom(cc_spec) tx_context = request['tx_context'] extension = proposal_pb2.ChaincodeHeaderExtension() extension.chaincode_id.name = proto_str('cscc') channel_header = build_channel_header( common_pb2.HeaderType.Value('ENDORSER_TRANSACTION'), tx_context.tx_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']) try: responses = send_transaction_proposal(proposal, tx_context, request['targets']) except Exception as e: raise IOError("fail to send transanction proposal", e) q = Queue(1) result = True for r in responses: r.subscribe(on_next=lambda x: q.put(x), on_error=lambda x: q.put(x)) res = q.get(timeout=5) proposal_res = res[0] result = result and (proposal_res.response.status == 200) if result: _logger.info("successfully join the peers") return result
def join_channel(self, request): """ peer가 채널에 보내는 join 요청을 받아 chaincode_input, chaincode_id, cc_spec, cc_invoke_spec, tx_context 를 생성하여 채널 헤더-->트랜잭션 헤더-->join 트랜잭션 제안을 빌드 비동기 처리를 위한 coroutine 반환 """ return send_transaction_proposal(proposal, tx_context, request['targets'])
def join_channel(self, request): """ To join the peer to a channel. Args: request: the request to join a channel Return: A coroutine to handle thanks to asyncio with await asyncio.gather(*responses) """ _logger.debug('channel_join - start') for key in ['targets', 'block', 'tx_context']: if key not in request: err_msg = "Missing parameter {}".format(key) _logger.error('channel_join error: {}'.format(err_msg)) raise ValueError(err_msg) chaincode_input = chaincode_pb2.ChaincodeInput() chaincode_input.args.extend([proto_b("JoinChain"), request['block']]) chaincode_id = chaincode_pb2.ChaincodeID() chaincode_id.name = proto_str("cscc") cc_spec = create_cc_spec(chaincode_input, chaincode_id, 'GOLANG') cc_invoke_spec = chaincode_pb2.ChaincodeInvocationSpec() cc_invoke_spec.chaincode_spec.CopyFrom(cc_spec) tx_context = request['tx_context'] extension = proposal_pb2.ChaincodeHeaderExtension() extension.chaincode_id.name = proto_str('cscc') channel_header = build_channel_header( common_pb2.HeaderType.Value('ENDORSER_TRANSACTION'), tx_context.tx_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']) return send_transaction_proposal(proposal, tx_context, request['targets'])
def join_channel(self, request): """ To join the peer to a channel. Args: request: the request to join a channel Return: True in sucess or False in failure """ _logger.debug('join_channel - start') err_msg = None if (not request): err_msg = "Missing all required input request parameters" if 'targets' not in request: err_msg = "Missing peers parameter" if 'block' not in request: err_msg = "Missing genesis block parameter" if 'tx_id' not in request: err_msg = "Missing transaction id parameter" if err_msg: _logger.error('join_channel error: {}'.format(err_msg)) raise ValueError(err_msg) tx_context = self._client.tx_context chaincode_spec = create_chaincode_spec(request['block'], 'cscc', "GOLANG") extension = chaincode_spec.SerializeToString() channel_header = build_channel_header( common_pb2.HeaderType.Value('ENDORSER_TRANSACTION'), tx_context.tx_id, self.name, current_timestamp(), tx_context.epoch, extension=extension) creator = create_serialized_identity(tx_context.user) header = build_header(creator, channel_header, tx_context.nonce) proposal = build_cc_proposal(chaincode_spec, header, {}) try: responses = send_transaction_proposal(proposal, header, tx_context, request['targets']) except Exception as e: raise IOError("fail to send transanction proposal", e) q = Queue(1) for r in responses: r.subscribe(on_next=lambda x: q.put(x), on_error=lambda x: q.put(x)) res = q.get(timeout=5) result = True and (res.response.status == 200) _logger.info("The return status is:", result) return result
def _send_cc_proposal(self, tx_context, command, peers): args = [] request = tx_context.tx_prop_req args.append(proto_b(request.fcn)) for arg in request.args: args.append(proto_b(arg)) # construct the deployment spec cc_id = chaincode_pb2.ChaincodeID() cc_id.name = request.cc_name cc_id.version = request.cc_version cc_input = chaincode_pb2.ChaincodeInput() cc_input.args.extend(args) cc_spec = create_cc_spec(cc_input, cc_id, CC_TYPE_GOLANG) cc_dep_spec = chaincode_pb2.ChaincodeDeploymentSpec() cc_dep_spec.chaincode_spec.CopyFrom(cc_spec) cc_dep_spec.effective_date.seconds = \ tx_context.tx_prop_req.effective_date.seconds cc_dep_spec.effective_date.nanos = \ tx_context.tx_prop_req.effective_date.nanos # construct the invoke spec # TODO: if the policy not provided, new one should be built. if request.cc_endorsement_policy: policy = request.cc_endorsement_policy else: policy = '' invoke_input = chaincode_pb2.ChaincodeInput() invoke_input.args.extend([ proto_b(command), proto_b(self.name), cc_dep_spec.SerializeToString(), proto_b(policy), proto_b('escc'), proto_b('vscc') ]) invoke_cc_id = chaincode_pb2.ChaincodeID() invoke_cc_id.name = proto_str('lscc') cc_invoke_spec = chaincode_pb2.ChaincodeInvocationSpec() cc_invoke_spec.chaincode_spec.CopyFrom( create_cc_spec(invoke_input, invoke_cc_id, CC_TYPE_GOLANG)) extension = proposal_pb2.ChaincodeHeaderExtension() extension.chaincode_id.name = proto_str('lscc') channel_header = build_channel_header( common_pb2.ENDORSER_TRANSACTION, tx_context.tx_id, self.name, current_timestamp(), epoch=0, 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) try: responses = send_transaction_proposal(proposal, header, tx_context, peers) except Exception as e: raise IOError("fail to send transanction proposal", e) q = Queue(1) result = True for r in responses: r.subscribe(on_next=lambda x: q.put(x), on_error=lambda x: q.put(x)) res, _ = q.get() result = result and (res.response.status == 200) return result