def from_new_block_msg( cls, new_block_msg: NewBlockEthProtocolMessage ) -> "InternalEthBlockInfo": """ Creates NewBlockInternalEthMessage from raw bytes of NewBlockEthProtocolMessage :param new_block_msg: new block message :return: NewBlockInternalEthMessage message """ new_block_msg_bytes = memoryview(new_block_msg.rawbytes()) _, block_msg_itm_len, block_msg_itm_start = rlp_utils.consume_length_prefix( new_block_msg_bytes, 0) block_msg_bytes = new_block_msg_bytes[ block_msg_itm_start:block_msg_itm_start + block_msg_itm_len] msg_size = 0 # block item already include header, transactions and uncles _, block_itm_len, block_itm_start = rlp_utils.consume_length_prefix( block_msg_bytes, 0) block_itm_bytes = block_msg_bytes[ block_msg_itm_start:block_msg_itm_start + block_itm_len] msg_size += len(block_itm_bytes) difficulty_bytes = block_msg_bytes[block_msg_itm_start + block_itm_len:] msg_size += len(difficulty_bytes) block_number_bytes = rlp_utils.encode_int(new_block_msg.number()) msg_size += len(block_number_bytes) msg_prefix = rlp_utils.get_length_prefix_list( len(block_itm_bytes) + len(difficulty_bytes) + len(block_number_bytes)) msg_size += len(msg_prefix) msg_bytes = bytearray(msg_size) written_bytes = 0 msg_bytes[written_bytes:written_bytes + len(msg_prefix)] = msg_prefix written_bytes += len(msg_prefix) msg_bytes[written_bytes:written_bytes + len(block_itm_bytes)] = block_itm_bytes written_bytes += len(block_itm_bytes) msg_bytes[written_bytes:written_bytes + len(difficulty_bytes)] = difficulty_bytes written_bytes += len(difficulty_bytes) msg_bytes[written_bytes:written_bytes + len(block_number_bytes)] = block_number_bytes written_bytes += len(block_number_bytes) assert written_bytes == msg_size return cls(msg_bytes)
def msg_block(self, msg: NewBlockEthProtocolMessage) -> None: if not self.node.should_process_block_hash(msg.block_hash()): return self.node.set_known_total_difficulty(msg.block_hash(), msg.get_chain_difficulty()) internal_new_block_msg = InternalEthBlockInfo.from_new_block_msg(msg) self.process_msg_block(internal_new_block_msg, msg.number()) if self.node.opts.filter_txs_factor > 0: self.node.on_transactions_in_block(msg.txns())