Exemple #1
0
    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'])
Exemple #3
0
    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'])
Exemple #4
0
    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
Exemple #5
0
    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