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)
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)
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)
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)
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
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
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