def try_calculate_total_difficulty( self, block_hash: Sha256Hash, new_block_parts: NewBlockParts) -> Optional[int]: previous_block_hash = new_block_parts.get_previous_block_hash() previous_block_total_difficulty = None for known_block_hash, known_total_difficulty in self._last_known_difficulties: if previous_block_hash == known_block_hash: previous_block_total_difficulty = known_total_difficulty break if previous_block_total_difficulty is None: logger.debug( "Unable to calculate total difficulty after block {}.", convert.bytes_to_hex(block_hash.binary)) return None block_total_difficulty = previous_block_total_difficulty + new_block_parts.get_block_difficulty( ) self._last_known_difficulties.append( (block_hash, block_total_difficulty)) logger.debug("Calculated total difficulty after block {} = {}.", convert.bytes_to_hex(block_hash.binary), block_total_difficulty) return block_total_difficulty
def test_new_block_parts(self): txs = [] txs_bytes = [] txs_hashes = [] tx_count = 10 for i in range(1, tx_count): tx = mock_eth_messages.get_dummy_transaction(1) txs.append(tx) tx_bytes = rlp.encode(tx, Transaction) txs_bytes.append(tx_bytes) tx_hash = tx.hash() txs_hashes.append(tx_hash) block_header = mock_eth_messages.get_dummy_block_header(1) uncles = [ mock_eth_messages.get_dummy_block_header(2), mock_eth_messages.get_dummy_block_header(3), ] block_number = 100000 block_body = TransientBlockBody(txs, uncles) block_header_bytes = memoryview( rlp.encode(BlockHeader.serialize(block_header))) block_body_bytes = memoryview( rlp.encode(TransientBlockBody.serialize(block_body))) new_block_parts = NewBlockParts(block_header_bytes, block_body_bytes, block_number) self.assertIsInstance(new_block_parts.get_block_hash(), Sha256Hash) self.assertIsInstance(new_block_parts.get_previous_block_hash(), Sha256Hash) self.assertEqual(1, new_block_parts.get_block_difficulty())