示例#1
0
    def test_respond(self):
        rbm = RequestBlockMessage(3)
        self.node.respond(rbm, self.proto)

        obj = RequestBlockMessage.unserialize(self.proto.transport.value()[4:])

        self.assertEqual(rbm.block_id, obj.block_id)
示例#2
0
    def test_broadcast(self):
        # setup another connection
        proto2 = self.node.buildProtocol(('localhost', 2))
        proto2.lc_ping = MagicMock()
        transport2 = proto_helpers.StringTransport()
        proto2.makeConnection(transport2)

        # peer 1 connects/sends hello handshake
        s = json.dumps({'nodeid': '1'})
        self.proto.stringReceived(b'HEL' + s.encode())

        # peer 2 connects/sends hello handshake
        s = json.dumps({'nodeid': '2'})
        proto2.stringReceived(b'HEL' + s.encode())

        # clear the transport
        self.proto.transport.clear()
        proto2.transport.clear()

        rbm = RequestBlockMessage(3)
        self.node.broadcast(rbm, 'RQB')

        obj = RequestBlockMessage.unserialize(self.proto.transport.value()[4:])

        obj2 = RequestBlockMessage.unserialize(proto2.transport.value()[4:])

        self.assertEqual(rbm.block_id, obj.block_id)
        self.assertEqual(rbm.block_id, obj2.block_id)
示例#3
0
    def test_rqb(self):
        """Test receipt of a RequestBlockMessage.
        """
        self.node.receive_request_blocks_message = MagicMock()

        rbm = RequestBlockMessage(3)
        s = rbm.serialize()
        self.proto.stringReceived(s)

        self.assertTrue(self.node.receive_request_blocks_message.called)
        obj = self.node.receive_request_blocks_message.call_args[0][0]
        self.assertEqual(type(obj), RequestBlockMessage)
        self.assertEqual(obj.block_id, 3)
示例#4
0
    def parse_msg(self, msg_type, msg, sender):

        if msg_type != 'PON':
            logger.debug('parse_msg called with msg_type = %s', msg_type)
        if msg_type == 'RQB':
            obj = RequestBlockMessage.unserialize(msg)
            self.receive_request_blocks_message(obj, sender)
        elif msg_type == 'TXN':
            obj = Transaction.unserialize(msg)
            self.receive_transaction(obj)
        elif msg_type == 'BLK':
            obj = Block.unserialize(msg)
            self.receive_block(obj)
        elif msg_type == 'RSB':
            obj = RespondBlockMessage.unserialize(msg)
            self.receive_respond_blocks_message(obj)
        elif msg_type == 'PAM':
            obj = PaxosMessage.unserialize(msg)
            self.receive_paxos_message(obj, sender)
        elif msg_type == 'PON':
            obj = PongMessage.unserialize(msg)
            self.receive_pong_message(obj, sender.peer_node_id)
        elif msg_type == 'ACM':
            obj = AckCommitMessage.unserialize(msg)
            self.receive_ack_commit_message(obj)
示例#5
0
    def get_block(self, block_id):
        """Get block based on block_id.

        Args:
            block_id (int): block id of the requested block.

        Returns (Block): requested block. If not stored locally return None.

        """
        if block_id is None:
            return None
        b = self.blocktree.nodes.get(block_id)
        if b is None:
            req = RequestBlockMessage(block_id)
            self.broadcast(req, 'RQB')
        return b
示例#6
0
    def test_receive_request_blocks_message(self):
        b1 = Block(1, GENESIS.block_id, [Transaction(1, 'a', 1)], 1)
        b2 = Block(2, GENESIS.block_id, [Transaction(1, 'a', 2)], 2)
        b3 = Block(3, b2.block_id, [Transaction(1, 'a', 3)], 3)
        b4 = Block(4, b3.block_id, [Transaction(1, 'a', 4)], 4)
        b5 = Block(5, b2.block_id, [Transaction(1, 'a', 5)], 5)

        self.node.blocktree.add_block(b1)
        self.node.blocktree.add_block(b2)
        self.node.blocktree.add_block(b3)
        self.node.blocktree.add_block(b4)
        self.node.blocktree.add_block(b5)

        req = RequestBlockMessage(b4.block_id)

        self.node.respond = MagicMock()
        self.node.receive_request_blocks_message(req, None)

        assert self.node.respond.called
示例#7
0
    def reach_genesis_block(self, block):
        """Check if there is a path from `block` to `GENESIS` block. If a block on the path is not contained in
        `self.nodes`, we need to request it from other peers.
        This may happen because of a network partition or if a node is down for a period of time.

        Args:
            block (Block): From this block we want to find a path to GENESIS block.

        Returns:
            bool: True if `GENESIS` block was reached.
        """
        self.blocktree.add_block(block)
        b = block
        while b != self.blocktree.genesis:
            if self.blocktree.nodes.get(b.parent_block_id) is not None:
                b = self.blocktree.nodes.get(b.parent_block_id)
            else:
                req = RequestBlockMessage(b.parent_block_id)
                self.broadcast(req, 'RQB')
                return False
        return True