Ejemplo n.º 1
0
 def clientConnectionFailed(self, connector, reason):
     logger.debug('connection failed: %s', reason)
Ejemplo n.º 2
0
 def startedConnecting(self, connector):
     logger.debug('Started connecting: %s', connector)
Ejemplo n.º 3
0
 def TransferCoins(self, request: qrl_pb2.TransferCoinsReq,
                   context) -> qrl_pb2.TransferCoinsResp:
     logger.debug("[QRLNode] TransferCoins")
     return qrl_pb2.TransferCoinsResp()
Ejemplo n.º 4
0
 def clientConnectionLost(self, connector, reason):
     logger.debug('connection lost: %s', reason)
Ejemplo n.º 5
0
 def Ping(self, request: qrl_pb2.PingReq,
          context: object) -> qrl_pb2.PongResp:
     logger.debug("Ping!")
     return qrl_pb2.PongResp(message='Hello, %s!' % request.name)
Ejemplo n.º 6
0
    def GetTokenDetailedList(self, request: qrl_pb2.Empty,
                             context) -> qrl_pb2.TokenDetailedList:
        logger.debug("[PublicAPI] TokenDetailedList")
        token_detailed_list = self.qrlnode.get_token_detailed_list()

        return token_detailed_list
Ejemplo n.º 7
0
    def MR(self, data):
        """
        Message Receipt
        This function accepts message receipt from peer,
        checks if the message hash already been received or not.
        In case its a already received message, it is ignored.
        Otherwise the request is made to get the full message.
        :return:
        """
        mr_data = qrl_pb2.MR()
        try:
            Parse(data, mr_data)
        except Exception as e:  # Disconnect peer not following protocol
            logger.debug(
                'Disconnected peer %s not following protocol in MR %s',
                self.conn_identity, e)
            self.transport.loseConnection()

        msg_hash = mr_data.hash

        if mr_data.type not in MessageReceipt.allowed_types:
            return

        if mr_data.type in [
                'TX'
        ] and self.factory.sync_state.state != ESyncState.synced:
            return

        if mr_data.type == 'TX':
            if len(self.factory.buffered_chain.tx_pool.pending_tx_pool
                   ) >= config.dev.transaction_pool_size:
                logger.warning(
                    'TX pool size full, incoming tx dropped. mr hash: %s',
                    bin2hstr(msg_hash))
                return

        if mr_data.type == 'ST' or mr_data.type == 'VT':
            if self.factory.buffered_chain.height > 1 and self.factory.sync_state.state != ESyncState.synced:
                return

        if self.factory.master_mr.contains(msg_hash, mr_data.type):
            return

        self.factory.master_mr.add_peer(msg_hash, mr_data.type, self, mr_data)

        if self.factory.master_mr.is_callLater_active(
                msg_hash):  # Ignore if already requested
            return

        if mr_data.type == 'BK':
            block_chain_buffer = self.factory.buffered_chain

            if not block_chain_buffer.verify_BK_hash(mr_data,
                                                     self.conn_identity):
                if block_chain_buffer.is_duplicate_block(
                        block_idx=mr_data.block_number,
                        prev_headerhash=mr_data.prev_headerhash,
                        stake_selector=mr_data.stake_selector):
                    self.factory.RFM(mr_data)
                return

            blocknumber = mr_data.block_number
            target_blocknumber = block_chain_buffer.bkmr_tracking_blocknumber(
                self.factory.ntp)
            if target_blocknumber != self.factory.bkmr_blocknumber:
                self.factory.bkmr_blocknumber = target_blocknumber
                del self.factory.bkmr_priorityq
                self.factory.bkmr_priorityq = PriorityQueue()

            if blocknumber != target_blocknumber or blocknumber == 1:
                self.factory.RFM(mr_data)
                return

            score = block_chain_buffer.score_BK_hash(mr_data)
            self.factory.bkmr_priorityq.put((score, msg_hash))

            if not self.factory.bkmr_processor.active():
                self.factory.bkmr_processor = reactor.callLater(
                    1, self.factory.select_best_bkmr)

            return

        self.factory.RFM(mr_data)
Ejemplo n.º 8
0
    def ST(self, data):
        """
        Stake Transaction
        This function processes whenever a Transaction having
        subtype ST is received.
        :return:
        """
        try:
            st = Transaction.from_json(data)
        except Exception as e:
            logger.error(
                'st rejected - unable to decode serialised data - closing connection'
            )
            logger.exception(e)
            self.transport.loseConnection()
            return

        if not self.factory.master_mr.isRequested(st.get_message_hash(), self):
            return

        if len(self.factory.buffered_chain._chain.blockchain) == 1 and \
                st.activation_blocknumber > self.factory.buffered_chain.height + config.dev.blocks_per_epoch:
            return

        height = self.factory.buffered_chain.height + 1
        stake_validators_tracker = self.factory.buffered_chain.get_stake_validators_tracker(
            height)

        if st.txfrom in stake_validators_tracker.future_stake_addresses:
            logger.debug(
                'P2P dropping st as staker is already in future_stake_address %s',
                st.txfrom)
            return

        if st.txfrom in stake_validators_tracker.sv_dict:
            expiry = stake_validators_tracker.sv_dict[
                st.txfrom].activation_blocknumber + config.dev.blocks_per_epoch
            if st.activation_blocknumber < expiry:
                logger.debug(
                    'P2P dropping st txn as it is already active for the given range %s',
                    st.txfrom)
                return

        if st.activation_blocknumber > height + config.dev.blocks_per_epoch:
            logger.debug(
                'P2P dropping st as activation_blocknumber beyond limit')
            return False

        for t in self.factory.buffered_chain.tx_pool.transaction_pool:
            if st.get_message_hash() == t.get_message_hash():
                return

        tx_state = self.factory.buffered_chain.get_stxn_state(
            blocknumber=self.factory.buffered_chain.height + 1, addr=st.txfrom)
        if st.validate() and st.validate_extended(tx_state=tx_state):
            self.factory.buffered_chain.tx_pool.add_tx_to_pool(st)
        else:
            logger.warning('>>>ST %s invalid state validation failed..',
                           bin2hstr(tuple(st.hash)))
            return

        self.factory.register_and_broadcast('ST', st.get_message_hash(),
                                            st.to_json())
Ejemplo n.º 9
0
 def GetNodeState(self, request: qrl_pb2.GetNodeStateReq,
                  context) -> qrl_pb2.GetNodeStateResp:
     if self.context_observer is not None:
         self.context_observer(context)
     logger.debug("[GetNodeState]")
     return qrl_pb2.GetNodeStateResp(info=self.qrlnode.getNodeInfo())