From f4a6d664b4d96cfe0564760968fb63de37e04c56 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 17:35:24 -0800 Subject: [PATCH 01/19] Appease lint --- eth/db/chain.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eth/db/chain.py b/eth/db/chain.py index 6e8d17d675..e2b04834cf 100644 --- a/eth/db/chain.py +++ b/eth/db/chain.py @@ -35,6 +35,7 @@ GENESIS_PARENT_HASH, ) from eth.exceptions import ( + CanonicalHeadNotFound, HeaderNotFound, ReceiptNotFound, TransactionNotFound, From f206b0f58d2703c2ff074c002148bf04944fe75a Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 28 Nov 2019 21:03:47 -0800 Subject: [PATCH 02/19] Initial prototype - imports block headers from geth --- scripts/gethimport.py | 249 ++++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 2 files changed, 250 insertions(+) create mode 100755 scripts/gethimport.py diff --git a/scripts/gethimport.py b/scripts/gethimport.py new file mode 100755 index 0000000000..86bb44b2a8 --- /dev/null +++ b/scripts/gethimport.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python + +""" +Create a Trinity database by importing the current state of a Geth database +""" + +import argparse +import os +import os.path +from pathlib import Path +import shutil +import snappy +import struct + +import plyvel + +from eth_utils import humanize_hash +import rlp + +from eth.chains.mainnet import MAINNET_GENESIS_HEADER, MainnetChain +from eth.db.backends.level import LevelDB +from eth.rlp.headers import BlockHeader + + +class GethKeys: + # from https://github.com/ethereum/go-ethereum/blob/master/core/rawdb/schema.go + DatabaseVersion = b'DatabaseVersion' + HeadBlock = b'LastBlock' + + headerPrefix = b'h' + headerNumberPrefix = b'H' + headerHashSuffix = b'n' + + @classmethod + def header_hash_for_block_number(cls, block_number: int) -> bytes: + "The key to get the hash of the header with the given block number" + packed_block_number = struct.pack('>Q', block_number) + return cls.headerPrefix + packed_block_number + cls.headerHashSuffix + + @classmethod + def block_number_for_header_hash(cls, header_hash: bytes) -> bytes: + "The key to get the block number of the header with the given hash" + return cls.headerNumberPrefix + header_hash + + @classmethod + def block_header(cls, block_number: int, header_hash: bytes) -> bytes: + packed_block_number = struct.pack('>Q', block_number) + return cls.headerPrefix + packed_block_number + header_hash + + +class GethFreezerIndexEntry: + def __init__(self, filenum: int, offset: int): + self.filenum = filenum + self.offset = offset + + @classmethod + def from_bytes(cls, data: bytes) -> 'GethFreezerIndexEntry': + assert len(data) == 6 + filenum, offset = struct.unpack('>HI', data) + return cls(filenum, offset) + + def __repr__(self): + return f'IndexEntry(filenum={self.filenum}, offset={self.offset})' + + +class GethFreezerTable: + def __init__(self, ancient_path, name, uses_compression): + self.ancient_path = ancient_path + self.name = name + self.uses_compression = uses_compression + print(f'opening freezer table. name={self.name}') + + self.index_file = open(os.path.join(ancient_path, self.index_file_name), 'rb') + stat_result = os.stat(self.index_file.fileno()) + index_file_size = stat_result.st_size + assert index_file_size % 6 == 0, index_file_size + print(f'index_size={index_file_size} ({index_file_size // 6} entries)') + self.entries = index_file_size // 6 + + first_index_bytes = self.index_file.read(6) + first_index = GethFreezerIndexEntry.from_bytes(first_index_bytes) + print(f'first_index={first_index}') + + self.index_file.seek(-6, 2) + last_index_bytes = self.index_file.read(6) + last_index = GethFreezerIndexEntry.from_bytes(last_index_bytes) + print(f'last_index={last_index}') + + self._data_files = dict() + + @property + def index_file_name(self): + suffix = 'cidx' if self.uses_compression else 'ridx' + return f'{self.name}.{suffix}' + + def data_file_name(self, number: int): + suffix = 'cdat' if self.uses_compression else 'rdat' + return f'{self.name}.{number:04d}.{suffix}' + + def _data_file(self, number: int): + if number not in self._data_files: + path = os.path.join(self.ancient_path, self.data_file_name(number)) + data_file = open(path, 'rb') + self._data_files[number] = data_file + + return self._data_files[number] + + def get(self, number: int) -> bytes: + assert number < self.entries + + self.index_file.seek(number * 6) + entry_bytes = self.index_file.read(6) + start_entry = GethFreezerIndexEntry.from_bytes(entry_bytes) + + # What happens if we're trying to read the last item? Won't this fail? + # Is there always one extra entry in the index file? + self.index_file.seek((number+1) * 6) + entry_bytes = self.index_file.read(6) + end_entry = GethFreezerIndexEntry.from_bytes(entry_bytes) + + if start_entry.filenum != end_entry.filenum: + # Duplicates logic from freezer_table.go:getBounds + start_entry = GethFreezerIndexEntry(end_entry.filenum, offset=0) + + data_file = self._data_file(start_entry.filenum) + data_file.seek(start_entry.offset) + data = data_file.read(end_entry.offset - start_entry.offset) + + if not self.uses_compression: + return data + + return snappy.decompress(data) + + def __del__(self) -> None: + for f in self._data_files.values(): + f.close() + self.index_file.close() + + +class GethDatabase: + def __init__(self, path): + self.db = plyvel.DB( + path, + create_if_missing=False, + error_if_exists=False, + max_open_files=16 + ) + + ancient_path = os.path.join(path, 'ancient') + self.ancient_hashes = GethFreezerTable(ancient_path, 'hashes', False) + self.ancient_headers = GethFreezerTable(ancient_path, 'headers', True) + + if self.database_version != b'\x07': + raise Exception(f'geth database version {self.database_version} is not supported') + + @property + def database_version(self) -> bytes: + raw_version = self.db.get(GethKeys.DatabaseVersion) + return rlp.decode(raw_version) + + @property + def last_block_hash(self) -> bytes: + return self.db.get(GethKeys.HeadBlock) + + def block_num_for_hash(self, header_hash: bytes) -> int: + raw_num = self.db.get(GethKeys.block_number_for_header_hash(header_hash)) + return struct.unpack('>Q', raw_num)[0] + + def block_header(self, block_number: int, header_hash: bytes) -> BlockHeader: + # This also needs to check the ancient db + raw_data = self.db.get(GethKeys.block_header(block_number, header_hash)) + if raw_data is not None: + return rlp.decode(raw_data, sedes=BlockHeader) + + raw_data = self.ancient_headers.get(block_number) + return rlp.decode(raw_data, sedes=BlockHeader) + + def header_hash_for_block_number(self, block_number: int) -> bytes: + # This needs to check the ancient db (freezerHashTable) + result = self.db.get(GethKeys.header_hash_for_block_number(block_number)) + + if result is not None: + return result + + return self.ancient_hashes.get(block_number) + + +def main(args): + # Open geth database + gethdb = GethDatabase(args.gethdb) + + last_block = gethdb.last_block_hash + last_block_num = gethdb.block_num_for_hash(last_block) + print('geth database opened') + print(f'found chain tip: header_hash={humanize_hash(last_block)} block_number={last_block_num}') + + print(f'header: {len(gethdb.block_header(last_block_num, last_block))}') + + genesis_hash = gethdb.header_hash_for_block_number(0) + genesis_header = gethdb.block_header(0, genesis_hash) + print(f'genesis header: {genesis_header}') + assert genesis_header == MAINNET_GENESIS_HEADER + + first_hash = gethdb.header_hash_for_block_number(1) + first_block = gethdb.block_header(1, first_hash) + print(f'first header: {first_block}') + + # Create trinity database + + db_already_existed = False + if os.path.exists(args.destdb): + db_already_existed = True + + leveldb = LevelDB(db_path=Path(args.destdb), max_open_files=16) + + if not db_already_existed: + print(f'Trinity database did not already exist, initializing it now') + chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) + else: + chain = MainnetChain(leveldb) + + headerdb = chain.headerdb + + canonical_head = headerdb.get_canonical_head() + print(f'starting copy from trinity\'s canonical head: {canonical_head}') + + # verify the trinity database matches what geth has + geth_header = gethdb.block_header(canonical_head.block_number, canonical_head.hash) + assert geth_header.hash == canonical_head.hash + + for i in range(canonical_head.block_number, last_block_num + 1): + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) + + headerdb.persist_header(header) + + if i % 1000 == 0: + print(f'current canonical header: {headerdb.get_canonical_head()}') + + return + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-gethdb', type=str, required=True) + parser.add_argument('-destdb', type=str, required=True) + args = parser.parse_args() + + main(args) diff --git a/setup.py b/setup.py index 4dc049d403..4e6a6fcce9 100644 --- a/setup.py +++ b/setup.py @@ -17,6 +17,7 @@ "pyethash>=0.1.27,<1.0.0", "rlp>=1.1.0,<2.0.0", "trie>=1.4.0,<2.0.0", + "python-snappy==0.5.4", ], # The eth-extra sections is for libraries that the evm does not # explicitly need to function and hence should not depend on. From 4a4847540600162269253ca9ed2cd828f0df50ee Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Fri, 29 Nov 2019 02:06:29 -0800 Subject: [PATCH 03/19] Also import block bodies, add logging --- scripts/gethimport.py | 97 +++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 23 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 86bb44b2a8..8b623a3e4d 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -5,6 +5,7 @@ """ import argparse +import logging import os import os.path from pathlib import Path @@ -16,10 +17,15 @@ from eth_utils import humanize_hash import rlp +from rlp.sedes import CountableList from eth.chains.mainnet import MAINNET_GENESIS_HEADER, MainnetChain from eth.db.backends.level import LevelDB from eth.rlp.headers import BlockHeader +from eth.rlp.transactions import BaseTransactionFields + + +logger = logging.getLogger('importer') class GethKeys: @@ -31,6 +37,8 @@ class GethKeys: headerNumberPrefix = b'H' headerHashSuffix = b'n' + blockBodyPrefix = b'b' + @classmethod def header_hash_for_block_number(cls, block_number: int) -> bytes: "The key to get the hash of the header with the given block number" @@ -47,6 +55,11 @@ def block_header(cls, block_number: int, header_hash: bytes) -> bytes: packed_block_number = struct.pack('>Q', block_number) return cls.headerPrefix + packed_block_number + header_hash + @classmethod + def block_body(cls, block_number: int, header_hash: bytes) -> bytes: + packed_block_number = struct.pack('>Q', block_number) + return cls.blockBodyPrefix + packed_block_number + header_hash + class GethFreezerIndexEntry: def __init__(self, filenum: int, offset: int): @@ -68,23 +81,23 @@ def __init__(self, ancient_path, name, uses_compression): self.ancient_path = ancient_path self.name = name self.uses_compression = uses_compression - print(f'opening freezer table. name={self.name}') + logger.debug(f'opening freezer table. name={self.name}') self.index_file = open(os.path.join(ancient_path, self.index_file_name), 'rb') stat_result = os.stat(self.index_file.fileno()) index_file_size = stat_result.st_size assert index_file_size % 6 == 0, index_file_size - print(f'index_size={index_file_size} ({index_file_size // 6} entries)') + logger.debug(f'index_size={index_file_size} ({index_file_size // 6} entries)') self.entries = index_file_size // 6 first_index_bytes = self.index_file.read(6) first_index = GethFreezerIndexEntry.from_bytes(first_index_bytes) - print(f'first_index={first_index}') + logger.debug(f'first_index={first_index}') self.index_file.seek(-6, 2) last_index_bytes = self.index_file.read(6) last_index = GethFreezerIndexEntry.from_bytes(last_index_bytes) - print(f'last_index={last_index}') + logger.debug(f'last_index={last_index}') self._data_files = dict() @@ -137,6 +150,17 @@ def __del__(self) -> None: self.index_file.close() +class BlockBody(rlp.Serializable): + "This is how geth stores block bodies" + fields = [ + ('transactions', CountableList(BaseTransactionFields)), + ('uncles', CountableList(BlockHeader)), + ] + + def __repr__(self) -> str: + return f'BlockBody(txns={self.transactions}, uncles={self.uncles})' + + class GethDatabase: def __init__(self, path): self.db = plyvel.DB( @@ -149,6 +173,7 @@ def __init__(self, path): ancient_path = os.path.join(path, 'ancient') self.ancient_hashes = GethFreezerTable(ancient_path, 'hashes', False) self.ancient_headers = GethFreezerTable(ancient_path, 'headers', True) + self.ancient_bodies = GethFreezerTable(ancient_path, 'bodies', True) if self.database_version != b'\x07': raise Exception(f'geth database version {self.database_version} is not supported') @@ -166,8 +191,10 @@ def block_num_for_hash(self, header_hash: bytes) -> int: raw_num = self.db.get(GethKeys.block_number_for_header_hash(header_hash)) return struct.unpack('>Q', raw_num)[0] - def block_header(self, block_number: int, header_hash: bytes) -> BlockHeader: - # This also needs to check the ancient db + def block_header(self, block_number: int, header_hash: bytes = None) -> BlockHeader: + if header_hash is None: + header_hash = self.header_hash_for_block_number(block_number) + raw_data = self.db.get(GethKeys.block_header(block_number, header_hash)) if raw_data is not None: return rlp.decode(raw_data, sedes=BlockHeader) @@ -184,28 +211,34 @@ def header_hash_for_block_number(self, block_number: int) -> bytes: return self.ancient_hashes.get(block_number) + def block_body(self, block_number: int, header_hash: bytes = None): + if header_hash is None: + header_hash = self.header_hash_for_block_number(block_number) + + raw_data = self.db.get(GethKeys.block_body(block_number, header_hash)) + if raw_data is not None: + return rlp.decode(raw_data, sedes=BlockBody) + + raw_data = self.ancient_bodies.get(block_number) + return rlp.decode(raw_data, sedes=BlockBody) + def main(args): - # Open geth database + # 1. Open Geth database + gethdb = GethDatabase(args.gethdb) last_block = gethdb.last_block_hash last_block_num = gethdb.block_num_for_hash(last_block) - print('geth database opened') - print(f'found chain tip: header_hash={humanize_hash(last_block)} block_number={last_block_num}') - - print(f'header: {len(gethdb.block_header(last_block_num, last_block))}') + logger.info('geth database opened') + logger.info(f'found geth chain tip: header_hash={humanize_hash(last_block)} block_number={last_block_num}') genesis_hash = gethdb.header_hash_for_block_number(0) genesis_header = gethdb.block_header(0, genesis_hash) - print(f'genesis header: {genesis_header}') assert genesis_header == MAINNET_GENESIS_HEADER + logger.info(f'geth genesis header matches expected genesis') - first_hash = gethdb.header_hash_for_block_number(1) - first_block = gethdb.block_header(1, first_hash) - print(f'first header: {first_block}') - - # Create trinity database + # 2. Create trinity database db_already_existed = False if os.path.exists(args.destdb): @@ -214,17 +247,19 @@ def main(args): leveldb = LevelDB(db_path=Path(args.destdb), max_open_files=16) if not db_already_existed: - print(f'Trinity database did not already exist, initializing it now') + logger.info(f'Trinity database did not already exist, initializing it now') chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) else: chain = MainnetChain(leveldb) headerdb = chain.headerdb + # 3. Import headers + bodies + canonical_head = headerdb.get_canonical_head() - print(f'starting copy from trinity\'s canonical head: {canonical_head}') + logger.info(f'starting import from trinity\'s canonical head: {canonical_head}') - # verify the trinity database matches what geth has + # fail fast if geth disagrees with trinity's canonical head geth_header = gethdb.block_header(canonical_head.block_number, canonical_head.hash) assert geth_header.hash == canonical_head.hash @@ -232,15 +267,31 @@ def main(args): header_hash = gethdb.header_hash_for_block_number(i) header = gethdb.block_header(i, header_hash) - headerdb.persist_header(header) + body = gethdb.block_body(i) + block_class = chain.get_vm_class(header).get_block_class() + block = block_class(header, body.transactions, body.uncles) + chain.chaindb.persist_block(block) if i % 1000 == 0: - print(f'current canonical header: {headerdb.get_canonical_head()}') + logger.debug(f'current canonical header: {headerdb.get_canonical_head()}') - return + # some final checks, these should never fail + canonical_head = headerdb.get_canonical_head() + geth_last_block_hash = gethdb.last_block_hash + geth_last_block_num = gethdb.block_num_for_hash(geth_last_block_hash) + assert canonical_head.hash == geth_last_block_hash + assert canonical_head.block_number == geth_last_block_num + + logger.info('finished importing headers + bodies') if __name__ == "__main__": + logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s.%(msecs)03d %(levelname)s: %(message)s', + datefmt='%H:%M:%S' + ) + parser = argparse.ArgumentParser() parser.add_argument('-gethdb', type=str, required=True) parser.add_argument('-destdb', type=str, required=True) From 9b99a38e899d844bb5cd16c65b8913a052034fed Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Sat, 30 Nov 2019 00:50:41 -0800 Subject: [PATCH 04/19] Also import all state entries, add some args for controlling behavior --- eth/db/trie_iteration.py | 235 +++++++++++++++++++++++++++++++++++++++ scripts/gethimport.py | 100 +++++++++++++++-- 2 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 eth/db/trie_iteration.py diff --git a/eth/db/trie_iteration.py b/eth/db/trie_iteration.py new file mode 100644 index 0000000000..242ddbf148 --- /dev/null +++ b/eth/db/trie_iteration.py @@ -0,0 +1,235 @@ +import enum +from typing import ( + cast, + Iterable, + List, + NamedTuple, + Tuple, +) + +from eth.db.chain import ChainDB + +from eth_utils import ( + to_tuple, +) + +from eth_typing import ( + Hash32, +) + +from trie.constants import ( + NODE_TYPE_BLANK, + NODE_TYPE_BRANCH, + NODE_TYPE_EXTENSION, + NODE_TYPE_LEAF, +) + +from trie.utils.nodes import ( + get_common_prefix_length, + decode_node, + extract_key, + get_node_type, +) + + +Nibbles = Tuple[int, ...] + + +class NodeKind(enum.Enum): + BLANK = NODE_TYPE_BLANK + LEAF = NODE_TYPE_LEAF + EXTENSION = NODE_TYPE_EXTENSION + BRANCH = NODE_TYPE_BRANCH + + +class TrieNode(NamedTuple): + kind: NodeKind + rlp: bytes + obj: List[bytes] # this type is wrong but mypy doesn't support recursive types + keccak: Hash32 + + def __str__(self) -> str: + if self.kind == NodeKind.EXTENSION: + return ( + "TrieNode(" + f"hash={self.keccak.hex()}" + f" path={self.path_rest}" + f" child={self.obj[1].hex()}" + ")" + ) + if self.kind == NodeKind.LEAF: + return ( + "TrieNode(" + f"hash={self.keccak.hex()}" + f" path={self.path_rest[:10]}..." + ")" + ) + return f"TrieNode(kind={self.kind.name} hash={self.keccak.hex()})" + + @property + def path_rest(self) -> Nibbles: + # careful: this doesn't make any sense for branches + return cast(Nibbles, extract_key(self.obj)) + + +def is_subtree(prefix: Nibbles, nibbles: Nibbles) -> bool: + """ + Returns True if {nibbles} represents a subtree of {prefix}. + """ + if len(nibbles) < len(prefix): + # nibbles represents a bigger tree than prefix does + return False + return get_common_prefix_length(prefix, nibbles) == len(prefix) + + +@to_tuple +def _get_children_with_nibbles(node: TrieNode, prefix: Nibbles) -> Iterable[Tuple[Nibbles, Hash32]]: + """ + Return the children of the given node at the given path, including their full paths + """ + if node.kind == NodeKind.BLANK: + return + elif node.kind == NodeKind.LEAF: + full_path = prefix + node.path_rest + yield (full_path, cast(Hash32, node.obj[1])) + elif node.kind == NodeKind.EXTENSION: + full_path = prefix + node.path_rest + # TODO: this cast to a Hash32 is not right, nodes smaller than 32 are inlined + yield (full_path, cast(Hash32, node.obj[1])) + elif node.kind == NodeKind.BRANCH: + for i in range(17): + full_path = prefix + (i,) + yield (full_path, cast(Hash32, node.obj[i])) + + +def _get_node(db: ChainDB, node_hash: Hash32) -> TrieNode: + if len(node_hash) < 32: + node_rlp = node_hash + else: + node_rlp = db.get(node_hash) + + node = decode_node(node_rlp) + node_type = get_node_type(node) + + return TrieNode(kind=NodeKind(node_type), rlp=node_rlp, obj=node, keccak=node_hash) + + +def _iterate_trie(db: ChainDB, + node: TrieNode, # the node we should look at + sub_trie: Nibbles, # which sub_trie to return nodes from + prefix: Nibbles, # our current path in the trie + ) -> Iterable[Tuple[Nibbles, TrieNode]]: + + if node.kind == NodeKind.BLANK: + return + + if node.kind == NodeKind.LEAF: + full_path = prefix + node.path_rest + + if is_subtree(sub_trie, prefix) or is_subtree(sub_trie, full_path): + # also check full_path because either the node or the item the node points to + # might be part of the desired subtree + yield (prefix, node) + + # there's no need to recur, this is a leaf + return + + child_of_sub_trie = is_subtree(sub_trie, prefix) + + if child_of_sub_trie: + # this node is part of the subtrie which should be returned + yield (prefix, node) + + parent_of_sub_trie = is_subtree(prefix, sub_trie) + + if child_of_sub_trie or parent_of_sub_trie: + for path, child_hash in _get_children_with_nibbles(node, prefix): + child_node = _get_node(db, child_hash) + yield from _iterate_trie(db, child_node, sub_trie, path) + + +def iterate_trie(db: ChainDB, root_hash: Hash32, + sub_trie: Nibbles = ()) -> Iterable[Tuple[Nibbles, TrieNode]]: + + root_node = _get_node(db, root_hash) + + yield from _iterate_trie( + db, root_node, sub_trie, + prefix=(), + ) + + +def iterate_leaves(db: ChainDB, root_hash: Hash32, + sub_trie: Nibbles = ()) -> Iterable[Tuple[Nibbles, bytes]]: + """ + Rather than returning the raw nodes, this returns just the leaves (usually, accounts), + along with their full paths + """ + + node_iterator = iterate_trie(db, root_hash, sub_trie) + + for path, node in node_iterator: + if node.kind == NodeKind.LEAF: + full_path = path + node.path_rest + yield (full_path, node.obj[1]) + + +def _iterate_node_chunk(db: ChainDB, + node: TrieNode, + sub_trie: Nibbles, + prefix: Nibbles, + target_depth: int) -> Iterable[Tuple[Nibbles, TrieNode]]: + + def recur(new_depth: int) -> Iterable[Tuple[Nibbles, TrieNode]]: + for path, child_hash in _get_children_with_nibbles(node, prefix): + child_node = _get_node(db, child_hash) + yield from _iterate_node_chunk(db, child_node, sub_trie, path, new_depth) + + if node.kind == NodeKind.BLANK: + return + + if node.kind == NodeKind.LEAF: + full_path = prefix + node.path_rest + + if is_subtree(sub_trie, prefix) or is_subtree(sub_trie, full_path): + yield (prefix, node) + + # there's no need to recur, this is a leaf + return + + child_of_sub_trie = is_subtree(sub_trie, prefix) + + if child_of_sub_trie: + # the node is part of the sub_trie which we want to return + yield (prefix, node) + + if target_depth == 0: + # there's no point in recursing + return + + parent_of_sub_trie = is_subtree(prefix, sub_trie) + + if child_of_sub_trie: + # if we're returning nodes start decrementing the count + yield from recur(target_depth - 1) + elif parent_of_sub_trie: + # if we're still looking for the sub_trie just recur + yield from recur(target_depth) + + +def iterate_node_chunk(db: ChainDB, + root_hash: Hash32, + sub_trie: Nibbles, + target_depth: int) -> Iterable[Tuple[Nibbles, TrieNode]]: + """ + Get all the nodes up to {target_depth} deep from the given sub_trie. + + Does a truncated breadth-first search rooted at the given node and returns everything + it finds. + """ + # TODO: notice BLANK_NODE_HASH and fail fast? + root_node = _get_node(db, root_hash) + + yield from _iterate_node_chunk( + db, root_node, sub_trie, prefix=(), target_depth=target_depth, + ) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 8b623a3e4d..e8a8234575 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -20,9 +20,15 @@ from rlp.sedes import CountableList from eth.chains.mainnet import MAINNET_GENESIS_HEADER, MainnetChain +from eth.constants import BLANK_ROOT_HASH, EMPTY_SHA3 from eth.db.backends.level import LevelDB from eth.rlp.headers import BlockHeader from eth.rlp.transactions import BaseTransactionFields +from eth.rlp.accounts import Account + +from eth.db.trie_iteration import iterate_leaves + +from trie.utils.nibbles import nibbles_to_bytes logger = logging.getLogger('importer') @@ -223,6 +229,26 @@ def block_body(self, block_number: int, header_hash: bytes = None): return rlp.decode(raw_data, sedes=BlockBody) +class ImportDatabase: + "Creates a 'ChainDB' which can be passed to the trie_iteration utils" + def __init__(self, gethdb, trinitydb): + self.gethdb = gethdb + self.trinitydb = trinitydb + + def get(self, node_hash): + trinity_result = self.trinitydb.get(node_hash) + if trinity_result is not None: + return trinity_result + + geth_result = self.gethdb.get(node_hash) + if geth_result is None: + logger.error(f'could not find node for hash: {node_hash.hex()}') + assert False + + self.trinitydb.put(node_hash, geth_result) + return geth_result + + def main(args): # 1. Open Geth database @@ -263,27 +289,74 @@ def main(args): geth_header = gethdb.block_header(canonical_head.block_number, canonical_head.hash) assert geth_header.hash == canonical_head.hash - for i in range(canonical_head.block_number, last_block_num + 1): + final_block_to_sync = last_block_num + if args.syncuntil: + final_block_to_sync = min(args.syncuntil, final_block_to_sync) + + for i in range(canonical_head.block_number, final_block_to_sync + 1): header_hash = gethdb.header_hash_for_block_number(i) header = gethdb.block_header(i, header_hash) - body = gethdb.block_body(i) - block_class = chain.get_vm_class(header).get_block_class() - block = block_class(header, body.transactions, body.uncles) - chain.chaindb.persist_block(block) + if not args.nobodies: + body = gethdb.block_body(i) + block_class = chain.get_vm_class(header).get_block_class() + block = block_class(header, body.transactions, body.uncles) + chain.chaindb.persist_block(block) + else: + headerdb.persist_header(header) if i % 1000 == 0: logger.debug(f'current canonical header: {headerdb.get_canonical_head()}') - # some final checks, these should never fail canonical_head = headerdb.get_canonical_head() - geth_last_block_hash = gethdb.last_block_hash - geth_last_block_num = gethdb.block_num_for_hash(geth_last_block_hash) - assert canonical_head.hash == geth_last_block_hash - assert canonical_head.block_number == geth_last_block_num + if not args.syncuntil: + # similar checks should be run if we added sync until! + # some final checks, these should never fail + geth_last_block_hash = gethdb.last_block_hash + geth_last_block_num = gethdb.block_num_for_hash(geth_last_block_hash) + assert canonical_head.hash == geth_last_block_hash + assert canonical_head.block_number == geth_last_block_num logger.info('finished importing headers + bodies') + if args.justblocks: + return + + state_root = canonical_head.state_root + logger.info(f'starting state trie import: {humanize_hash(state_root)}') + + # 4. Import the state trie + storage tries + # Write something which iterates over the entire trie, from left to right + # Pass it a database which first looks in the trinity db, and if nothing is there + # copies the requested node from geth->trinity before returning it + + imported_leaf_count = 0 + importdb = ImportDatabase(gethdb=gethdb.db, trinitydb=leveldb.db) + for path, leaf_data in iterate_leaves(importdb, state_root): + account = rlp.decode(leaf_data, sedes=Account) + addr_hash = nibbles_to_bytes(path) + + + if account.code_hash != EMPTY_SHA3: + bytecode = importdb.get(account.code_hash) + + if account.storage_root == BLANK_ROOT_HASH: + imported_leaf_count += 1 + + if imported_leaf_count % 1000 == 0: + logger.debug(f'progress sha(addr)={addr_hash.hex()}') + continue + + for path, leaf_data in iterate_leaves(importdb, account.storage_root): + item_addr = nibbles_to_bytes(path) + imported_leaf_count += 1 + + if imported_leaf_count % 1000 == 0: + logger.debug(f'progress sha(addr)={addr_hash.hex()} sha(item)={item_addr.hex()}') + + loger.info('successfully imported state trie and all storage tries') + + if __name__ == "__main__": logging.basicConfig( @@ -295,6 +368,13 @@ def main(args): parser = argparse.ArgumentParser() parser.add_argument('-gethdb', type=str, required=True) parser.add_argument('-destdb', type=str, required=True) + parser.add_argument('-justblocks', action='store_true') + parser.add_argument('-nobodies', action='store_true') + parser.add_argument('-syncuntil', type=int, action='store') args = parser.parse_args() main(args) + + logger.warning('Some features are not yet implemented:') + logger.warning('- Receipts were not imported') + logger.warning('- This script did not verify that the chain configs match') From 8d39c73240631a13ad2b97cb504da3fbb32dc207 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Sat, 30 Nov 2019 16:26:03 -0800 Subject: [PATCH 05/19] state import does bulk copy --- scripts/gethimport.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index e8a8234575..e117b79b72 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -322,6 +322,9 @@ def main(args): if args.justblocks: return + scan_state(gethdb, leveldb) + return + state_root = canonical_head.state_root logger.info(f'starting state trie import: {humanize_hash(state_root)}') @@ -357,6 +360,39 @@ def main(args): loger.info('successfully imported state trie and all storage tries') +def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): + """ + Imports state, but by indiscriminately copying over everything which might be part of + the state trie. This copies more data than necessary, but is likely to be much faster + than iterating all state. + """ + logger.debug('scan_state: bulk-importing state entries') + + iterator = gethdb.db.iterator( + start=b'\x00'*32, + stop=b'\xff'*32, + include_start=True, + include_stop=True, + ) + + imported_entries = 0 + skipped_keys = 0 + bucket = b'\x00' * 2 + for key, value in iterator: + if len(key) != 32: + skipped_keys += 1 + continue + trinitydb[key] = value + imported_entries += 1 + + if key >= bucket: + logger.debug(f'imported: {bucket.hex()} skipped={skipped_keys}') + if bucket == b'\xff' * 2: + break + bucket = (int.from_bytes(bucket, 'big') + 1).to_bytes(2, 'big') + + logger.info(f'scan_state: successfully imported {imported_entries} state entries') + if __name__ == "__main__": logging.basicConfig( From e2b809c050f05a606ffa885addf5769faf2823b4 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Mon, 2 Dec 2019 12:59:53 -0800 Subject: [PATCH 06/19] Add import_body_range command --- scripts/gethimport.py | 61 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index e117b79b72..8af0d68caa 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -12,6 +12,7 @@ import shutil import snappy import struct +import time import plyvel @@ -249,9 +250,7 @@ def get(self, node_hash): return geth_result -def main(args): - # 1. Open Geth database - +def open_gethdb(location): gethdb = GethDatabase(args.gethdb) last_block = gethdb.last_block_hash @@ -262,15 +261,16 @@ def main(args): genesis_hash = gethdb.header_hash_for_block_number(0) genesis_header = gethdb.block_header(0, genesis_hash) assert genesis_header == MAINNET_GENESIS_HEADER - logger.info(f'geth genesis header matches expected genesis') - # 2. Create trinity database + return gethdb + +def open_trinitydb(location): db_already_existed = False - if os.path.exists(args.destdb): + if os.path.exists(location): db_already_existed = True - leveldb = LevelDB(db_path=Path(args.destdb), max_open_files=16) + leveldb = LevelDB(db_path=Path(location), max_open_files=16) if not db_already_existed: logger.info(f'Trinity database did not already exist, initializing it now') @@ -278,6 +278,12 @@ def main(args): else: chain = MainnetChain(leveldb) + return chain + + +def main(args): + gethdb = open_gethdb(args.gethdb) + chain = open_trinitydb(args.destdb) headerdb = chain.headerdb # 3. Import headers + bodies @@ -289,7 +295,10 @@ def main(args): geth_header = gethdb.block_header(canonical_head.block_number, canonical_head.hash) assert geth_header.hash == canonical_head.hash - final_block_to_sync = last_block_num + geth_last_block_hash = gethdb.last_block_hash + geth_last_block_num = gethdb.block_num_for_hash(geth_last_block_hash) + + final_block_to_sync = geth_last_block_num if args.syncuntil: final_block_to_sync = min(args.syncuntil, final_block_to_sync) @@ -312,8 +321,6 @@ def main(args): if not args.syncuntil: # similar checks should be run if we added sync until! # some final checks, these should never fail - geth_last_block_hash = gethdb.last_block_hash - geth_last_block_num = gethdb.block_num_for_hash(geth_last_block_hash) assert canonical_head.hash == geth_last_block_hash assert canonical_head.block_number == geth_last_block_num @@ -394,6 +401,26 @@ def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): logger.info(f'scan_state: successfully imported {imported_entries} state entries') +def import_body_range(gethdb, chain, start_block, end_block): + logger.debug( + f'importing block bodies for blocks in range({start_block}, {end_block + 1})' + ) + previous_log_time = time.time() + + for i in range(start_block, end_block + 1): + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) + + body = gethdb.block_body(i) + block_class = chain.get_vm_class(header).get_block_class() + block = block_class(header, body.transactions, body.uncles) + chain.chaindb.persist_block(block) + + if time.time() - previous_log_time > 5: + logger.debug(f'importing bodies. block_number={i}') + previous_log_time = time.time() + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -407,9 +434,21 @@ def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): parser.add_argument('-justblocks', action='store_true') parser.add_argument('-nobodies', action='store_true') parser.add_argument('-syncuntil', type=int, action='store') + + subparsers = parser.add_subparsers(dest="command") + + import_body_range_parser = subparsers.add_parser('import_body_range') + import_body_range_parser.add_argument('-startblock', type=int, required=True) + import_body_range_parser.add_argument('-endblock', type=int, required=True) + args = parser.parse_args() - main(args) + if args.command == 'import_body_range': + gethdb = open_gethdb(args.gethdb) + chain = open_trinitydb(args.destdb) + import_body_range(gethdb, chain, args.startblock, args.endblock) + else: + main(args) logger.warning('Some features are not yet implemented:') logger.warning('- Receipts were not imported') From 284e6b6ade3be94e27e2a4d8e7691ee5f25546a2 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Mon, 2 Dec 2019 14:21:36 -0800 Subject: [PATCH 07/19] Add process_blocks command to simulate full sync --- scripts/gethimport.py | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 8af0d68caa..38c2dd2267 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -272,11 +272,13 @@ def open_trinitydb(location): leveldb = LevelDB(db_path=Path(location), max_open_files=16) - if not db_already_existed: - logger.info(f'Trinity database did not already exist, initializing it now') - chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) - else: - chain = MainnetChain(leveldb) + if db_already_existed: + return MainnetChain(leveldb) + + logger.info(f'Trinity database did not already exist, initializing it now') + chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) + + # from_genesis_header copied the header over to our trinity db but not the state return chain @@ -421,6 +423,29 @@ def import_body_range(gethdb, chain, start_block, end_block): previous_log_time = time.time() +def process_blocks(gethdb, chain, end_block): + "Imports blocks read out of the gethdb. Simulates a full sync but w/o network traffic" + + canonical_head = chain.headerdb.get_canonical_head() + logger.info(f'starting block processing from chain tip: {canonical_head}') + + start_block = max(canonical_head.block_number, 1) + for i in range(start_block, end_block + 1): + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) + vm_class = chain.get_vm_class(header) + block_class = vm_class.get_block_class() + transaction_class = vm_class.get_transaction_class() + + body = gethdb.block_body(i) + transactions = [ + transaction_class.from_base_transaction(txn) for txn in body.transactions + ] + block = block_class(header, transactions, body.uncles) + imported_block, _, _ = chain.import_block(block, perform_validation = True) + logger.debug('imported block: {imported_block}') + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -441,12 +466,19 @@ def import_body_range(gethdb, chain, start_block, end_block): import_body_range_parser.add_argument('-startblock', type=int, required=True) import_body_range_parser.add_argument('-endblock', type=int, required=True) + process_blocks_parser = subparsers.add_parser('process_blocks') + process_blocks_parser.add_argument('-endblock', type=int, required=True) + args = parser.parse_args() if args.command == 'import_body_range': gethdb = open_gethdb(args.gethdb) chain = open_trinitydb(args.destdb) import_body_range(gethdb, chain, args.startblock, args.endblock) + elif args.command == 'process_blocks': + gethdb = open_gethdb(args.gethdb) + chain = open_trinitydb(args.destdb) + process_blocks(gethdb, chain, args.endblock) else: main(args) From 9e630809a6d7f336f76ca929e7baf170378280b3 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Mon, 2 Dec 2019 17:14:15 -0800 Subject: [PATCH 08/19] transaction tries are also committed when importing block bodies --- scripts/gethimport.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 38c2dd2267..610b5dcb80 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -23,6 +23,7 @@ from eth.chains.mainnet import MAINNET_GENESIS_HEADER, MainnetChain from eth.constants import BLANK_ROOT_HASH, EMPTY_SHA3 from eth.db.backends.level import LevelDB +from eth.db.trie import make_trie_root_and_nodes from eth.rlp.headers import BlockHeader from eth.rlp.transactions import BaseTransactionFields from eth.rlp.accounts import Account @@ -251,7 +252,7 @@ def get(self, node_hash): def open_gethdb(location): - gethdb = GethDatabase(args.gethdb) + gethdb = GethDatabase(location) last_block = gethdb.last_block_hash last_block_num = gethdb.block_num_for_hash(last_block) @@ -305,15 +306,12 @@ def main(args): final_block_to_sync = min(args.syncuntil, final_block_to_sync) for i in range(canonical_head.block_number, final_block_to_sync + 1): - header_hash = gethdb.header_hash_for_block_number(i) - header = gethdb.block_header(i, header_hash) if not args.nobodies: - body = gethdb.block_body(i) - block_class = chain.get_vm_class(header).get_block_class() - block = block_class(header, body.transactions, body.uncles) - chain.chaindb.persist_block(block) + import_block_body(gethdb, chain, i) else: + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) headerdb.persist_header(header) if i % 1000 == 0: @@ -403,6 +401,23 @@ def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): logger.info(f'scan_state: successfully imported {imported_entries} state entries') +def import_block_body(gethdb, chain, block_number: int): + header_hash = gethdb.header_hash_for_block_number(block_number) + header = gethdb.block_header(block_number, header_hash) + + body = gethdb.block_body(block_number) + block_class = chain.get_vm_class(header).get_block_class() + block = block_class(header, body.transactions, body.uncles) + chain.chaindb.persist_block(block) + + # persist_block saves the transactions into an index, but doesn't actually persist the + # transaction trie, meaning that without this next block attempts to read out the + # block will throw an exception + tx_root_hash, tx_kv_nodes = make_trie_root_and_nodes(body.transactions) + assert tx_root_hash == block.header.transaction_root + chain.chaindb.persist_trie_data_dict(tx_kv_nodes) + + def import_body_range(gethdb, chain, start_block, end_block): logger.debug( f'importing block bodies for blocks in range({start_block}, {end_block + 1})' @@ -410,13 +425,7 @@ def import_body_range(gethdb, chain, start_block, end_block): previous_log_time = time.time() for i in range(start_block, end_block + 1): - header_hash = gethdb.header_hash_for_block_number(i) - header = gethdb.block_header(i, header_hash) - - body = gethdb.block_body(i) - block_class = chain.get_vm_class(header).get_block_class() - block = block_class(header, body.transactions, body.uncles) - chain.chaindb.persist_block(block) + import_block_body(gethdb, chain, i) if time.time() - previous_log_time > 5: logger.debug(f'importing bodies. block_number={i}') @@ -443,7 +452,7 @@ def process_blocks(gethdb, chain, end_block): ] block = block_class(header, transactions, body.uncles) imported_block, _, _ = chain.import_block(block, perform_validation = True) - logger.debug('imported block: {imported_block}') + logger.debug(f'imported block: {imported_block}') if __name__ == "__main__": From 93435f08046e19ea6b6fdc75244910efd707565e Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Tue, 3 Dec 2019 15:16:13 -0800 Subject: [PATCH 09/19] Add read_receipts helper --- scripts/gethimport.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 610b5dcb80..bfede047fd 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -46,6 +46,7 @@ class GethKeys: headerHashSuffix = b'n' blockBodyPrefix = b'b' + blockReceiptsPrefix = b'r' @classmethod def header_hash_for_block_number(cls, block_number: int) -> bytes: @@ -68,6 +69,11 @@ def block_body(cls, block_number: int, header_hash: bytes) -> bytes: packed_block_number = struct.pack('>Q', block_number) return cls.blockBodyPrefix + packed_block_number + header_hash + @classmethod + def block_receipts(cls, block_number: int, header_hash: bytes) -> bytes: + packed_block_number = struct.pack('>Q', block_number) + return cls.blockReceiptsPrefix + packed_block_number + header_hash + class GethFreezerIndexEntry: def __init__(self, filenum: int, offset: int): @@ -182,6 +188,7 @@ def __init__(self, path): self.ancient_hashes = GethFreezerTable(ancient_path, 'hashes', False) self.ancient_headers = GethFreezerTable(ancient_path, 'headers', True) self.ancient_bodies = GethFreezerTable(ancient_path, 'bodies', True) + self.ancient_receipts = GethFreezerTable(ancient_path, 'receipts', True) if self.database_version != b'\x07': raise Exception(f'geth database version {self.database_version} is not supported') @@ -230,6 +237,17 @@ def block_body(self, block_number: int, header_hash: bytes = None): raw_data = self.ancient_bodies.get(block_number) return rlp.decode(raw_data, sedes=BlockBody) + def block_receipts(self, block_number: int, header_hash: bytes = None): + if header_hash is None: + header_hash = self.header_hash_for_block_number(block_number) + + raw_data = self.db.get(GethKeys.block_receipts(block_number, header_hash)) + if raw_data is not None: + return raw_data + + raw_data = self.ancient_receipts.get(block_number) + return raw_data + class ImportDatabase: "Creates a 'ChainDB' which can be passed to the trie_iteration utils" @@ -455,6 +473,22 @@ def process_blocks(gethdb, chain, end_block): logger.debug(f'imported block: {imported_block}') +def read_receipts(gethdb, block_number): + logger.info(f'reading receipts for block. block_number={block_number}') + + raw_data = gethdb.block_receipts(block_number) + decoded = rlp.decode(raw_data) + + logger.info(f'- receipt_count={len(decoded)}') + + for receipt in decoded: + post_state, raw_gas_used, logs = receipt + if len(raw_gas_used) < 8: + padded = (b'\x00' * (8 - len(raw_gas_used))) + raw_gas_used + gas_used = struct.unpack('>Q', padded)[0] + logger.info(f'- post_state_or_status={post_state} gas_used={gas_used} len(logs)={len(logs)}') + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -478,6 +512,9 @@ def process_blocks(gethdb, chain, end_block): process_blocks_parser = subparsers.add_parser('process_blocks') process_blocks_parser.add_argument('-endblock', type=int, required=True) + read_receipts_parser = subparsers.add_parser('read_receipts') + read_receipts_parser.add_argument('-block', type=int, required=True) + args = parser.parse_args() if args.command == 'import_body_range': @@ -488,6 +525,9 @@ def process_blocks(gethdb, chain, end_block): gethdb = open_gethdb(args.gethdb) chain = open_trinitydb(args.destdb) process_blocks(gethdb, chain, args.endblock) + elif args.command == 'read_receipts': + gethdb = open_gethdb(args.gethdb) + read_receipts(gethdb, args.block) else: main(args) From 542a116568428a3eb60af50ad985c510a5f6c2f7 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Tue, 3 Dec 2019 20:58:02 -0800 Subject: [PATCH 10/19] Add flamegraph so I can share it --- import_block_flame.svg | 308 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 import_block_flame.svg diff --git a/import_block_flame.svg b/import_block_flame.svg new file mode 100644 index 0000000000..584b24cc8a --- /dev/null +++ b/import_block_flame.svg @@ -0,0 +1,308 @@ +py-spy Reset ZoomSearch process_blocks (gethimport.py:466) (19 samples, 0.20%)block_body (gethimport.py:235) (17 samples, 0.18%)decode (rlp/codec.py:237) (10 samples, 0.10%)deserialize (rlp/sedes/serializable.py:266) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)deserialize (rlp/sedes/lists.py:93) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)deserialize (rlp/sedes/lists.py:143) (10 samples, 0.10%)decode (rlp/codec.py:237) (11 samples, 0.11%)process_blocks (gethimport.py:468) (20 samples, 0.21%)<listcomp> (gethimport.py:468) (20 samples, 0.21%)from_base_transaction (eth/rlp/transactions.py:69) (20 samples, 0.21%)record (eth/db/account.py:357) (23 samples, 0.24%)record (eth/db/storage.py:220) (17 samples, 0.18%)record_checkpoint (eth/db/journal.py:136) (14 samples, 0.14%)snapshot (eth/vm/state.py:164) (27 samples, 0.28%)apply_all_transactions (eth/vm/base.py:227) (28 samples, 0.29%)validate_transaction_signature (eth/_utils/transactions.py:90) (12 samples, 0.12%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:30) (10 samples, 0.10%)encode (rlp/codec.py:63) (12 samples, 0.12%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:32) (18 samples, 0.19%)validate_transaction_signature (eth/_utils/transactions.py:91) (34 samples, 0.35%)recover_public_key_from_msg (eth_keys/datatypes.py:418) (9 samples, 0.09%)keccak (eth_utils/crypto.py:11) (9 samples, 0.09%)import_string (eth_keys/utils/module_loading.py:18) (9 samples, 0.09%)import_module (importlib/__init__.py:127) (9 samples, 0.09%)backend (eth_keys/datatypes.py:101) (14 samples, 0.14%)get_backend (eth_keys/datatypes.py:112) (13 samples, 0.13%)get_backend (eth_keys/backends/__init__.py:35) (13 samples, 0.13%)get_backend_class (eth_keys/backends/__init__.py:31) (10 samples, 0.10%)validate_transaction_signature (eth/_utils/transactions.py:93) (88 samples, 0.91%)recover_public_key_from_msg (eth_keys/datatypes.py:419) (79 samples, 0.82%)recover_public_key_from_msg_hash (eth_keys/datatypes.py:422) (79 samples, 0.82%)ecdsa_recover (eth_keys/backends/coincurve.py:99) (56 samples, 0.58%)from_signature_and_message (coincurve/keys.py:246) (55 samples, 0.57%)recover (coincurve/ecdsa.py:39) (52 samples, 0.54%)verify_msg (eth_keys/datatypes.py:350) (9 samples, 0.09%)keccak (eth_utils/crypto.py:11) (9 samples, 0.09%)validate_transaction (eth/vm/forks/frontier/state.py:49) (199 samples, 2.06%)v..validate (eth/vm/forks/homestead/transactions.py:36) (199 samples, 2.06%)v..validate (eth/vm/forks/frontier/transactions.py:83) (186 samples, 1.93%)v..validate (eth/rlp/transactions.py:85) (181 samples, 1.87%)v..check_signature_validity (eth/vm/forks/frontier/transactions.py:86) (181 samples, 1.87%)c..validate_transaction_signature (eth/_utils/transactions.py:97) (47 samples, 0.49%)verify_msg (eth_keys/datatypes.py:351) (38 samples, 0.39%)verify_msg_hash (eth_keys/datatypes.py:356) (38 samples, 0.39%)ecdsa_verify (eth_keys/backends/coincurve.py:88) (22 samples, 0.23%)verify (coincurve/keys.py:285) (22 samples, 0.23%)infer_sedes (rlp/codec.py:278) (9 samples, 0.09%)encode (rlp/codec.py:63) (18 samples, 0.19%)inner (eth_utils/functional.py:45) (9 samples, 0.09%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:32) (27 samples, 0.28%)extract_transaction_sender (eth/_utils/transactions.py:115) (44 samples, 0.46%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:40) (11 samples, 0.11%)backend (eth_keys/datatypes.py:101) (10 samples, 0.10%)get_backend (eth_keys/datatypes.py:112) (10 samples, 0.10%)get_backend (eth_keys/backends/__init__.py:35) (10 samples, 0.10%)get_backend_class (eth_keys/backends/__init__.py:31) (9 samples, 0.09%)extract_transaction_sender (eth/_utils/transactions.py:116) (62 samples, 0.64%)recover_public_key_from_msg (eth_keys/datatypes.py:419) (58 samples, 0.60%)recover_public_key_from_msg_hash (eth_keys/datatypes.py:422) (58 samples, 0.60%)ecdsa_recover (eth_keys/backends/coincurve.py:99) (39 samples, 0.40%)from_signature_and_message (coincurve/keys.py:246) (38 samples, 0.39%)recover (coincurve/ecdsa.py:39) (32 samples, 0.33%)__get__ (cached_property.py:35) (116 samples, 1.20%)sender (eth/rlp/transactions.py:73) (116 samples, 1.20%)get_sender (eth/vm/forks/frontier/transactions.py:89) (116 samples, 1.20%)decode (rlp/codec.py:230) (9 samples, 0.09%)get (trie/hexary.py:73) (15 samples, 0.16%)get_node (trie/hexary.py:285) (12 samples, 0.12%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (12 samples, 0.12%)get_node (trie/hexary.py:285) (10 samples, 0.10%)decode_node (trie/utils/nodes.py:83) (10 samples, 0.10%)decode (rlp/codec.py:230) (9 samples, 0.09%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (23 samples, 0.24%)__getitem__ (eth/db/batch.py:74) (22 samples, 0.23%)__getitem__ (eth/db/backends/level.py:53) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:490) (36 samples, 0.37%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)get_node (trie/hexary.py:284) (44 samples, 0.46%)__getitem__ (eth/db/batch.py:74) (43 samples, 0.45%)__getitem__ (eth/db/backends/level.py:53) (38 samples, 0.39%)consume_payload (rlp/codec.py:178) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (79 samples, 0.82%)get_node (trie/hexary.py:285) (35 samples, 0.36%)decode_node (trie/utils/nodes.py:83) (31 samples, 0.32%)decode (rlp/codec.py:230) (28 samples, 0.29%)consume_item (rlp/codec.py:206) (21 samples, 0.22%)get_node (trie/hexary.py:284) (36 samples, 0.37%)__getitem__ (eth/db/batch.py:74) (34 samples, 0.35%)__getitem__ (eth/db/backends/level.py:53) (33 samples, 0.34%)_get_branch_node (trie/hexary.py:490) (53 samples, 0.55%)get_node (trie/hexary.py:285) (17 samples, 0.18%)decode_node (trie/utils/nodes.py:83) (16 samples, 0.17%)decode (rlp/codec.py:230) (13 samples, 0.13%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (55 samples, 0.57%)__getitem__ (eth/db/batch.py:74) (52 samples, 0.54%)__getitem__ (eth/db/backends/level.py:53) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:490) (69 samples, 0.71%)get_node (trie/hexary.py:285) (14 samples, 0.14%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (12 samples, 0.12%)_get (trie/hexary.py:80) (9 samples, 0.09%)get_node (trie/hexary.py:284) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (17 samples, 0.18%)_get_account (eth/db/account.py:334) (350 samples, 3.62%)_get.._get_encoded_account (eth/db/account.py:323) (349 samples, 3.61%)_ge..__getitem__ (eth/db/journal.py:336) (348 samples, 3.60%)__g..__getitem__ (eth/db/cache.py:22) (348 samples, 3.60%)__g..__getitem__ (eth/db/keymap.py:28) (345 samples, 3.57%)__g..__getitem__ (trie/hexary.py:515) (345 samples, 3.57%)__g..get (trie/hexary.py:75) (328 samples, 3.40%)get.._get (trie/hexary.py:87) (328 samples, 3.40%)_ge.._get_branch_node (trie/hexary.py:491) (317 samples, 3.28%)_ge.._get (trie/hexary.py:87) (316 samples, 3.27%)_ge.._get_branch_node (trie/hexary.py:491) (304 samples, 3.15%)_ge.._get (trie/hexary.py:87) (303 samples, 3.14%)_ge.._get_branch_node (trie/hexary.py:491) (280 samples, 2.90%)_g.._get (trie/hexary.py:87) (277 samples, 2.87%)_g.._get_branch_node (trie/hexary.py:491) (241 samples, 2.50%)_g.._get (trie/hexary.py:87) (241 samples, 2.50%)_g.._get_branch_node (trie/hexary.py:491) (162 samples, 1.68%)_get (trie/hexary.py:87) (161 samples, 1.67%)_get_branch_node (trie/hexary.py:491) (108 samples, 1.12%)_get (trie/hexary.py:87) (105 samples, 1.09%)_get_branch_node (trie/hexary.py:491) (36 samples, 0.37%)_get (trie/hexary.py:87) (22 samples, 0.23%)deserialize (rlp/sedes/serializable.py:270) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)decode (rlp/codec.py:237) (23 samples, 0.24%)validate_frontier_transaction (eth/vm/forks/frontier/validation.py:16) (499 samples, 5.17%)valida..get_balance (eth/vm/state.py:119) (381 samples, 3.95%)get_..get_balance (eth/db/account.py:217) (381 samples, 3.95%)get_.._get_account (eth/db/account.py:337) (31 samples, 0.32%)__call__ (eth/vm/state.py:262) (701 samples, 7.26%)__call__ (..validate_transaction (eth/vm/forks/frontier/state.py:50) (501 samples, 5.19%)valida..validate_transaction (eth/vm/forks/homestead/state.py:20) (501 samples, 5.19%)valida..validate_homestead_transaction (eth/vm/forks/homestead/validation.py:23) (501 samples, 5.19%)valida.._set_account (eth/db/account.py:346) (16 samples, 0.17%)build_evm_message (eth/vm/forks/frontier/state.py:57) (38 samples, 0.39%)delta_balance (eth/vm/state.py:125) (38 samples, 0.39%)set_balance (eth/vm/state.py:122) (36 samples, 0.37%)set_balance (eth/db/account.py:225) (35 samples, 0.36%)build_evm_message (eth/vm/forks/frontier/state.py:60) (23 samples, 0.24%)increment_nonce (eth/vm/state.py:134) (23 samples, 0.24%)increment_nonce (eth/db/account.py:245) (23 samples, 0.24%)set_nonce (eth/db/account.py:241) (23 samples, 0.24%)get (trie/hexary.py:73) (13 samples, 0.13%)get_node (trie/hexary.py:285) (9 samples, 0.09%)decode_node (trie/utils/nodes.py:83) (9 samples, 0.09%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (11 samples, 0.11%)__getitem__ (eth/db/backends/level.py:53) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (12 samples, 0.12%)get_node (trie/hexary.py:284) (17 samples, 0.18%)__getitem__ (eth/db/batch.py:74) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (30 samples, 0.31%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (12 samples, 0.12%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node (trie/hexary.py:284) (30 samples, 0.31%)__getitem__ (eth/db/batch.py:74) (29 samples, 0.30%)__getitem__ (eth/db/backends/level.py:53) (29 samples, 0.30%)_get_branch_node (trie/hexary.py:490) (51 samples, 0.53%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (20 samples, 0.21%)decode (rlp/codec.py:230) (19 samples, 0.20%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)get_node (trie/hexary.py:284) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (26 samples, 0.27%)__getitem__ (eth/db/backends/level.py:53) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (50 samples, 0.52%)get_node (trie/hexary.py:285) (22 samples, 0.23%)decode_node (trie/utils/nodes.py:83) (22 samples, 0.23%)decode (rlp/codec.py:230) (21 samples, 0.22%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)get_node (trie/hexary.py:284) (19 samples, 0.20%)__getitem__ (eth/db/batch.py:74) (15 samples, 0.16%)__getitem__ (eth/db/backends/level.py:53) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (24 samples, 0.25%)_get (trie/hexary.py:85) (10 samples, 0.10%)_get_account (eth/db/account.py:334) (226 samples, 2.34%)_.._get_encoded_account (eth/db/account.py:323) (224 samples, 2.32%)_..__getitem__ (eth/db/journal.py:336) (224 samples, 2.32%)_..__getitem__ (eth/db/cache.py:22) (224 samples, 2.32%)_..__getitem__ (eth/db/keymap.py:28) (218 samples, 2.26%)_..__getitem__ (trie/hexary.py:515) (218 samples, 2.26%)_..get (trie/hexary.py:75) (203 samples, 2.10%)g.._get (trie/hexary.py:87) (201 samples, 2.08%)_.._get_branch_node (trie/hexary.py:491) (198 samples, 2.05%)_.._get (trie/hexary.py:87) (198 samples, 2.05%)_.._get_branch_node (trie/hexary.py:491) (193 samples, 2.00%)_.._get (trie/hexary.py:87) (193 samples, 2.00%)_.._get_branch_node (trie/hexary.py:491) (181 samples, 1.87%)_.._get (trie/hexary.py:87) (180 samples, 1.86%)_.._get_branch_node (trie/hexary.py:491) (150 samples, 1.55%)_get (trie/hexary.py:87) (149 samples, 1.54%)_get_branch_node (trie/hexary.py:491) (98 samples, 1.01%)_get (trie/hexary.py:87) (97 samples, 1.00%)_get_branch_node (trie/hexary.py:491) (47 samples, 0.49%)_get (trie/hexary.py:87) (46 samples, 0.48%)_get_branch_node (trie/hexary.py:491) (22 samples, 0.23%)_get_account (eth/db/account.py:337) (15 samples, 0.16%)get_code (eth/db/account.py:253) (243 samples, 2.52%)ge..get_code_hash (eth/db/account.py:275) (243 samples, 2.52%)ge..build_evm_message (eth/vm/forks/frontier/state.py:75) (278 samples, 2.88%)bu..get_code (eth/vm/state.py:137) (278 samples, 2.88%)ge..get_code (eth/db/account.py:258) (32 samples, 0.33%)__getitem__ (eth/db/journal.py:336) (31 samples, 0.32%)__getitem__ (eth/db/batch.py:74) (31 samples, 0.32%)__getitem__ (eth/db/backends/level.py:53) (29 samples, 0.30%)build_evm_message (eth/vm/forks/frontier/state.py:77) (12 samples, 0.12%)logger (eth/vm/state.py:64) (12 samples, 0.12%)get_extended_debug_logger (eth_utils/logging.py:83) (11 samples, 0.11%)__call__ (eth/vm/state.py:263) (362 samples, 3.75%)__ca..record (eth/db/account.py:357) (15 samples, 0.16%)record (eth/db/storage.py:220) (15 samples, 0.16%)apply_message (eth/vm/forks/frontier/computation.py:49) (23 samples, 0.24%)snapshot (eth/vm/state.py:164) (22 samples, 0.23%)apply_message (eth/vm/forks/frontier/computation.py:62) (16 samples, 0.17%)delta_balance (eth/vm/state.py:125) (16 samples, 0.17%)set_balance (eth/vm/state.py:122) (15 samples, 0.16%)set_balance (eth/db/account.py:225) (15 samples, 0.16%)__iter__ (eth/vm/code_stream.py:51) (11 samples, 0.11%)__iter__ (eth/vm/code_stream.py:52) (17 samples, 0.18%)apply_computation (eth/vm/computation.py:539) (66 samples, 0.68%)__iter__ (eth/vm/code_stream.py:55) (16 samples, 0.17%)apply_computation (eth/vm/computation.py:541) (10 samples, 0.10%)__call__ (eth/vm/logic/call.py:115) (9 samples, 0.09%)get_code (eth/vm/state.py:137) (9 samples, 0.09%)__call__ (eth/vm/logic/call.py:117) (9 samples, 0.09%)get_code (eth/vm/state.py:137) (9 samples, 0.09%)get_code (eth/db/account.py:258) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)apply_message (eth/vm/forks/frontier/computation.py:49) (13 samples, 0.13%)snapshot (eth/vm/state.py:164) (12 samples, 0.12%)record (eth/db/account.py:357) (11 samples, 0.11%)record (eth/db/storage.py:220) (11 samples, 0.11%)apply_computation (eth/vm/computation.py:539) (32 samples, 0.33%)apply_message (eth/vm/forks/frontier/computation.py:49) (10 samples, 0.10%)snapshot (eth/vm/state.py:164) (10 samples, 0.10%)apply_computation (eth/vm/computation.py:529) (10 samples, 0.10%)__iter__ (eth/vm/code_stream.py:51) (14 samples, 0.14%)apply_computation (eth/vm/computation.py:539) (36 samples, 0.37%)apply_computation (eth/vm/computation.py:541) (9 samples, 0.09%)apply_computation (eth/vm/computation.py:539) (12 samples, 0.12%)apply_computation (eth/vm/computation.py:539) (12 samples, 0.12%)__call__ (eth/vm/logic/call.py:135) (13 samples, 0.13%)apply_child_computation (eth/vm/computation.py:366) (13 samples, 0.13%)generate_child_computation (eth/vm/computation.py:381) (13 samples, 0.13%)apply_message (eth/vm/forks/frontier/computation.py:77) (13 samples, 0.13%)apply_computation (eth/vm/computation.py:554) (11 samples, 0.11%)__call__ (eth/vm/logic/call.py:135) (71 samples, 0.74%)apply_child_computation (eth/vm/computation.py:366) (71 samples, 0.74%)generate_child_computation (eth/vm/computation.py:381) (71 samples, 0.74%)apply_message (eth/vm/forks/frontier/computation.py:77) (65 samples, 0.67%)apply_computation (eth/vm/computation.py:554) (65 samples, 0.67%)wrapped_logic_fn (eth/vm/opcode.py:55) (36 samples, 0.37%)sload (eth/vm/logic/storage.py:60) (17 samples, 0.18%)get_storage (eth/vm/state.py:107) (17 samples, 0.18%)get_storage (eth/db/account.py:146) (16 samples, 0.17%)get (eth/db/storage.py:192) (16 samples, 0.17%)__getitem__ (eth/db/journal.py:336) (16 samples, 0.17%)__getitem__ (eth/db/cache.py:22) (16 samples, 0.17%)__getitem__ (eth/db/storage.py:88) (16 samples, 0.17%)__getitem__ (trie/hexary.py:515) (16 samples, 0.17%)get (trie/hexary.py:75) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (12 samples, 0.12%)wrapped_logic_fn (eth/vm/opcode.py:53) (18 samples, 0.19%)consume_gas (eth/vm/computation.py:254) (16 samples, 0.17%)get_code (eth/db/account.py:253) (9 samples, 0.09%)get_code_hash (eth/db/account.py:275) (9 samples, 0.09%)_get_account (eth/db/account.py:334) (9 samples, 0.09%)_get_encoded_account (eth/db/account.py:323) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)__getitem__ (eth/db/cache.py:22) (9 samples, 0.09%)__getitem__ (eth/db/keymap.py:28) (9 samples, 0.09%)__getitem__ (trie/hexary.py:515) (9 samples, 0.09%)get (trie/hexary.py:75) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)extcodesize (eth/vm/logic/context.py:131) (10 samples, 0.10%)get_code (eth/vm/state.py:137) (10 samples, 0.10%)jumpi (eth/vm/logic/flow.py:32) (10 samples, 0.10%)get_node (trie/hexary.py:284) (13 samples, 0.13%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:490) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:490) (13 samples, 0.13%)get_node (trie/hexary.py:284) (20 samples, 0.21%)__getitem__ (eth/db/backends/level.py:53) (20 samples, 0.21%)_get_branch_node (trie/hexary.py:490) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (9 samples, 0.09%)get (eth/db/storage.py:192) (83 samples, 0.86%)__getitem__ (eth/db/journal.py:336) (81 samples, 0.84%)__getitem__ (eth/db/cache.py:22) (81 samples, 0.84%)__getitem__ (eth/db/storage.py:88) (80 samples, 0.83%)__getitem__ (trie/hexary.py:515) (80 samples, 0.83%)get (trie/hexary.py:75) (76 samples, 0.79%)_get (trie/hexary.py:87) (76 samples, 0.79%)_get_branch_node (trie/hexary.py:491) (58 samples, 0.60%)_get (trie/hexary.py:87) (58 samples, 0.60%)_get_branch_node (trie/hexary.py:491) (45 samples, 0.47%)_get (trie/hexary.py:87) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:491) (21 samples, 0.22%)_get (trie/hexary.py:87) (20 samples, 0.21%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (10 samples, 0.10%)sload (eth/vm/logic/storage.py:60) (90 samples, 0.93%)get_storage (eth/vm/state.py:107) (90 samples, 0.93%)get_storage (eth/db/account.py:146) (88 samples, 0.91%)apply_computation (eth/vm/computation.py:554) (281 samples, 2.91%)ap..wrapped_logic_fn (eth/vm/opcode.py:55) (175 samples, 1.81%)apply_message (eth/vm/forks/frontier/computation.py:77) (300 samples, 3.11%)app..__call__ (eth/vm/logic/call.py:135) (320 samples, 3.31%)__c..apply_child_computation (eth/vm/computation.py:366) (320 samples, 3.31%)app..generate_child_computation (eth/vm/computation.py:381) (320 samples, 3.31%)gen..wrapped_logic_fn (eth/vm/opcode.py:53) (30 samples, 0.31%)consume_gas (eth/vm/computation.py:254) (26 samples, 0.27%)_get_account (eth/db/account.py:334) (12 samples, 0.12%)_get_encoded_account (eth/db/account.py:323) (12 samples, 0.12%)__getitem__ (eth/db/journal.py:336) (12 samples, 0.12%)__getitem__ (eth/db/cache.py:22) (12 samples, 0.12%)__getitem__ (eth/db/keymap.py:28) (12 samples, 0.12%)__getitem__ (trie/hexary.py:515) (12 samples, 0.12%)get (trie/hexary.py:75) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)get_code (eth/db/account.py:253) (14 samples, 0.14%)get_code_hash (eth/db/account.py:275) (14 samples, 0.14%)extcodesize (eth/vm/logic/context.py:131) (22 samples, 0.23%)get_code (eth/vm/state.py:137) (22 samples, 0.23%)jumpi (eth/vm/logic/flow.py:42) (9 samples, 0.09%)mload (eth/vm/logic/memory.py:31) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:13) (16 samples, 0.17%)memory_write (eth/vm/computation.py:239) (16 samples, 0.17%)get (trie/hexary.py:73) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)get_node (trie/hexary.py:284) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:490) (19 samples, 0.20%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)get_node (trie/hexary.py:284) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get_node (trie/hexary.py:284) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get (eth/db/storage.py:192) (94 samples, 0.97%)__getitem__ (eth/db/journal.py:336) (94 samples, 0.97%)__getitem__ (eth/db/cache.py:22) (93 samples, 0.96%)__getitem__ (eth/db/storage.py:88) (89 samples, 0.92%)__getitem__ (trie/hexary.py:515) (89 samples, 0.92%)get (trie/hexary.py:75) (78 samples, 0.81%)_get (trie/hexary.py:87) (78 samples, 0.81%)_get_branch_node (trie/hexary.py:491) (59 samples, 0.61%)_get (trie/hexary.py:87) (58 samples, 0.60%)_get_branch_node (trie/hexary.py:491) (42 samples, 0.43%)_get (trie/hexary.py:87) (37 samples, 0.38%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)sload (eth/vm/logic/storage.py:60) (100 samples, 1.04%)get_storage (eth/vm/state.py:107) (100 samples, 1.04%)get_storage (eth/db/account.py:146) (100 samples, 1.04%)apply_message (eth/vm/forks/frontier/computation.py:77) (641 samples, 6.64%)apply_mes..apply_computation (eth/vm/computation.py:554) (623 samples, 6.45%)apply_co..wrapped_logic_fn (eth/vm/opcode.py:55) (249 samples, 2.58%)wr..__call__ (eth/vm/logic/call.py:135) (660 samples, 6.84%)__call__ ..apply_child_computation (eth/vm/computation.py:366) (660 samples, 6.84%)apply_chi..generate_child_computation (eth/vm/computation.py:381) (659 samples, 6.82%)generate_..__call__ (eth/vm/logic/call.py:86) (9 samples, 0.09%)compute_msg_gas (eth/vm/logic/call.py:285) (9 samples, 0.09%)sstore (eth/vm/logic/storage.py:16) (9 samples, 0.09%)get_storage (eth/vm/state.py:107) (9 samples, 0.09%)get_storage (eth/db/account.py:146) (9 samples, 0.09%)get (eth/db/storage.py:192) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)inner (eth/vm/forks/byzantium/opcodes.py:42) (12 samples, 0.12%)consume_gas (eth/vm/gas_meter.py:66) (13 samples, 0.13%)consume_gas (eth/vm/gas_meter.py:68) (11 samples, 0.11%)wrapped_logic_fn (eth/vm/opcode.py:53) (57 samples, 0.59%)consume_gas (eth/vm/computation.py:254) (49 samples, 0.51%)dup_XX (eth/vm/logic/duplication.py:10) (21 samples, 0.22%)stack_dup (eth/vm/computation.py:290) (18 samples, 0.19%)extcodesize (eth/vm/logic/context.py:131) (17 samples, 0.18%)get_code (eth/vm/state.py:137) (17 samples, 0.18%)get_code (eth/db/account.py:258) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)__getitem__ (eth/db/batch.py:74) (9 samples, 0.09%)jump (eth/vm/logic/flow.py:27) (13 samples, 0.13%)jumpi (eth/vm/logic/flow.py:32) (13 samples, 0.13%)jumpi (eth/vm/logic/flow.py:42) (21 samples, 0.22%)is_valid_opcode (eth/vm/code_stream.py:99) (15 samples, 0.16%)mload (eth/vm/logic/memory.py:31) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:11) (27 samples, 0.28%)mstore (eth/vm/logic/memory.py:13) (20 samples, 0.21%)memory_write (eth/vm/computation.py:239) (19 samples, 0.20%)push_XX (eth/vm/logic/stack.py:11) (13 samples, 0.13%)push_XX (eth/vm/logic/stack.py:19) (16 samples, 0.17%)get (trie/hexary.py:73) (9 samples, 0.09%)get_node (trie/hexary.py:284) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (21 samples, 0.22%)get_node (trie/hexary.py:284) (21 samples, 0.22%)__getitem__ (eth/db/backends/level.py:53) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:490) (32 samples, 0.33%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (11 samples, 0.11%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (21 samples, 0.22%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get_node (trie/hexary.py:285) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (9 samples, 0.09%)get (eth/db/storage.py:192) (147 samples, 1.52%)__getitem__ (eth/db/journal.py:336) (147 samples, 1.52%)__getitem__ (eth/db/cache.py:22) (146 samples, 1.51%)__getitem__ (eth/db/storage.py:88) (143 samples, 1.48%)__getitem__ (trie/hexary.py:515) (142 samples, 1.47%)get (trie/hexary.py:75) (132 samples, 1.37%)_get (trie/hexary.py:87) (131 samples, 1.36%)_get_branch_node (trie/hexary.py:491) (109 samples, 1.13%)_get (trie/hexary.py:87) (109 samples, 1.13%)_get_branch_node (trie/hexary.py:491) (76 samples, 0.79%)_get (trie/hexary.py:87) (73 samples, 0.76%)_get_branch_node (trie/hexary.py:491) (52 samples, 0.54%)_get (trie/hexary.py:87) (48 samples, 0.50%)_get_branch_node (trie/hexary.py:491) (25 samples, 0.26%)_get (trie/hexary.py:87) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:491) (15 samples, 0.16%)_get (trie/hexary.py:87) (12 samples, 0.12%)sload (eth/vm/logic/storage.py:60) (161 samples, 1.67%)get_storage (eth/vm/state.py:107) (161 samples, 1.67%)get_storage (eth/db/account.py:146) (154 samples, 1.59%)apply_message (eth/vm/forks/frontier/computation.py:77) (1,324 samples, 13.71%)apply_message (eth/v..apply_computation (eth/vm/computation.py:554) (1,267 samples, 13.12%)apply_computation (..wrapped_logic_fn (eth/vm/opcode.py:55) (467 samples, 4.84%)wrappe..apply_child_computation (eth/vm/computation.py:366) (1,357 samples, 14.05%)apply_child_computati..generate_child_computation (eth/vm/computation.py:381) (1,357 samples, 14.05%)generate_child_comput..apply_message (eth/vm/forks/frontier/computation.py:83) (13 samples, 0.13%)commit (eth/vm/state.py:176) (13 samples, 0.13%)commit (eth/db/account.py:371) (12 samples, 0.12%)__call__ (eth/vm/logic/call.py:135) (1,358 samples, 14.06%)__call__ (eth/vm/logi..compute_msg_extra_gas (eth/vm/logic/call.py:368) (14 samples, 0.14%)account_exists (eth/vm/state.py:152) (14 samples, 0.14%)account_exists (eth/db/account.py:304) (14 samples, 0.14%)_get_encoded_account (eth/db/account.py:323) (14 samples, 0.14%)__getitem__ (eth/db/journal.py:336) (13 samples, 0.13%)__getitem__ (eth/db/cache.py:22) (13 samples, 0.13%)__getitem__ (eth/db/keymap.py:28) (13 samples, 0.13%)__getitem__ (trie/hexary.py:515) (13 samples, 0.13%)get (trie/hexary.py:75) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)compute_msg_gas (eth/vm/logic/call.py:285) (16 samples, 0.17%)__call__ (eth/vm/logic/call.py:86) (17 samples, 0.18%)get_node (trie/hexary.py:284) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (11 samples, 0.11%)get (eth/db/storage.py:192) (28 samples, 0.29%)__getitem__ (eth/db/journal.py:336) (28 samples, 0.29%)__getitem__ (eth/db/cache.py:22) (28 samples, 0.29%)__getitem__ (eth/db/storage.py:88) (28 samples, 0.29%)__getitem__ (trie/hexary.py:515) (28 samples, 0.29%)get (trie/hexary.py:75) (28 samples, 0.29%)_get (trie/hexary.py:87) (28 samples, 0.29%)_get_branch_node (trie/hexary.py:491) (23 samples, 0.24%)_get (trie/hexary.py:87) (23 samples, 0.24%)_get_branch_node (trie/hexary.py:491) (21 samples, 0.22%)_get (trie/hexary.py:87) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:491) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)sstore (eth/vm/logic/storage.py:16) (29 samples, 0.30%)get_storage (eth/vm/state.py:107) (29 samples, 0.30%)get_storage (eth/db/account.py:146) (29 samples, 0.30%)inner (eth/vm/forks/byzantium/opcodes.py:42) (39 samples, 0.40%)consume_gas (eth/vm/gas_meter.py:66) (12 samples, 0.12%)wrapped_logic_fn (eth/vm/opcode.py:53) (52 samples, 0.54%)consume_gas (eth/vm/computation.py:254) (41 samples, 0.42%)add (eth/vm/logic/arithmetic.py:20) (13 samples, 0.13%)dup_XX (eth/vm/logic/duplication.py:10) (14 samples, 0.14%)stack_dup (eth/vm/computation.py:290) (13 samples, 0.13%)_get_account (eth/db/account.py:334) (22 samples, 0.23%)_get_encoded_account (eth/db/account.py:323) (22 samples, 0.23%)__getitem__ (eth/db/journal.py:336) (22 samples, 0.23%)__getitem__ (eth/db/cache.py:22) (21 samples, 0.22%)__getitem__ (eth/db/keymap.py:28) (21 samples, 0.22%)__getitem__ (trie/hexary.py:515) (21 samples, 0.22%)get (trie/hexary.py:75) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)get_code (eth/db/account.py:253) (29 samples, 0.30%)get_code_hash (eth/db/account.py:275) (29 samples, 0.30%)extcodesize (eth/vm/logic/context.py:131) (43 samples, 0.45%)get_code (eth/vm/state.py:137) (43 samples, 0.45%)get_code (eth/db/account.py:258) (14 samples, 0.14%)__getitem__ (eth/db/journal.py:336) (12 samples, 0.12%)__getitem__ (eth/db/batch.py:74) (12 samples, 0.12%)__getitem__ (eth/db/backends/level.py:53) (11 samples, 0.11%)inner (eth/vm/forks/byzantium/opcodes.py:42) (9 samples, 0.09%)jump (eth/vm/logic/flow.py:27) (11 samples, 0.11%)jumpi (eth/vm/logic/flow.py:32) (10 samples, 0.10%)jumpi (eth/vm/logic/flow.py:42) (17 samples, 0.18%)mstore (eth/vm/logic/memory.py:11) (18 samples, 0.19%)mstore (eth/vm/logic/memory.py:13) (16 samples, 0.17%)memory_write (eth/vm/computation.py:239) (16 samples, 0.17%)push_XX (eth/vm/logic/stack.py:11) (13 samples, 0.13%)push_XX (eth/vm/logic/stack.py:19) (12 samples, 0.12%)get (trie/hexary.py:73) (21 samples, 0.22%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)decode (rlp/codec.py:230) (10 samples, 0.10%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (14 samples, 0.14%)_get_branch_node (trie/hexary.py:490) (27 samples, 0.28%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (11 samples, 0.11%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (44 samples, 0.46%)get_node (trie/hexary.py:284) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:490) (56 samples, 0.58%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (50 samples, 0.52%)__getitem__ (eth/db/backends/level.py:53) (50 samples, 0.52%)_get_branch_node (trie/hexary.py:490) (72 samples, 0.75%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (15 samples, 0.16%)decode (rlp/codec.py:230) (15 samples, 0.16%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node (trie/hexary.py:284) (38 samples, 0.39%)__getitem__ (eth/db/backends/level.py:53) (38 samples, 0.39%)_get_branch_node (trie/hexary.py:490) (61 samples, 0.63%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (16 samples, 0.17%)consume_item (rlp/codec.py:206) (12 samples, 0.12%)get_node (trie/hexary.py:284) (25 samples, 0.26%)__getitem__ (eth/db/backends/level.py:53) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (27 samples, 0.28%)__getitem__ (eth/db/cache.py:22) (310 samples, 3.21%)__g..__getitem__ (eth/db/storage.py:88) (303 samples, 3.14%)__g..__getitem__ (trie/hexary.py:515) (303 samples, 3.14%)__g..get (trie/hexary.py:75) (277 samples, 2.87%)ge.._get (trie/hexary.py:87) (276 samples, 2.86%)_g.._get_branch_node (trie/hexary.py:491) (249 samples, 2.58%)_g.._get (trie/hexary.py:87) (248 samples, 2.57%)_g.._get_branch_node (trie/hexary.py:491) (191 samples, 1.98%)_.._get (trie/hexary.py:87) (186 samples, 1.93%)_.._get_branch_node (trie/hexary.py:491) (113 samples, 1.17%)_get (trie/hexary.py:87) (112 samples, 1.16%)_get_branch_node (trie/hexary.py:491) (51 samples, 0.53%)_get (trie/hexary.py:87) (39 samples, 0.40%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)get (eth/db/storage.py:192) (311 samples, 3.22%)get..__getitem__ (eth/db/journal.py:336) (311 samples, 3.22%)__g..sload (eth/vm/logic/storage.py:60) (317 samples, 3.28%)slo..get_storage (eth/vm/state.py:107) (317 samples, 3.28%)get..get_storage (eth/db/account.py:146) (316 samples, 3.27%)get..apply_computation (eth/vm/computation.py:554) (2,146 samples, 22.22%)apply_computation (eth/vm/computati..wrapped_logic_fn (eth/vm/opcode.py:55) (628 samples, 6.50%)wrapped_..apply_message (eth/vm/forks/frontier/computation.py:77) (2,191 samples, 22.69%)apply_message (eth/vm/forks/frontie..commit (eth/db/storage.py:233) (12 samples, 0.12%)has_checkpoint (eth/db/journal.py:389) (10 samples, 0.10%)__call__ (eth/vm/logic/call.py:135) (2,251 samples, 23.31%)__call__ (eth/vm/logic/call.py:135)apply_child_computation (eth/vm/computation.py:366) (2,251 samples, 23.31%)apply_child_computation (eth/vm/comp..generate_child_computation (eth/vm/computation.py:381) (2,251 samples, 23.31%)generate_child_computation (eth/vm/c..apply_message (eth/vm/forks/frontier/computation.py:83) (30 samples, 0.31%)commit (eth/vm/state.py:176) (30 samples, 0.31%)commit (eth/db/account.py:371) (28 samples, 0.29%)commit (eth/db/storage.py:234) (15 samples, 0.16%)account_exists (eth/db/account.py:304) (18 samples, 0.19%)_get_encoded_account (eth/db/account.py:323) (18 samples, 0.19%)__getitem__ (eth/db/journal.py:336) (18 samples, 0.19%)__getitem__ (eth/db/cache.py:22) (18 samples, 0.19%)__getitem__ (eth/db/keymap.py:28) (18 samples, 0.19%)__getitem__ (trie/hexary.py:515) (18 samples, 0.19%)get (trie/hexary.py:75) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (16 samples, 0.17%)_get (trie/hexary.py:87) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:491) (16 samples, 0.17%)_get (trie/hexary.py:87) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (14 samples, 0.14%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)compute_msg_extra_gas (eth/vm/logic/call.py:368) (19 samples, 0.20%)account_exists (eth/vm/state.py:152) (19 samples, 0.20%)__call__ (eth/vm/logic/call.py:86) (29 samples, 0.30%)compute_msg_gas (eth/vm/logic/call.py:285) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:490) (10 samples, 0.10%)__getitem__ (eth/db/cache.py:22) (34 samples, 0.35%)__getitem__ (eth/db/storage.py:88) (34 samples, 0.35%)__getitem__ (trie/hexary.py:515) (34 samples, 0.35%)get (trie/hexary.py:75) (30 samples, 0.31%)_get (trie/hexary.py:87) (30 samples, 0.31%)_get_branch_node (trie/hexary.py:491) (27 samples, 0.28%)_get (trie/hexary.py:87) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:491) (20 samples, 0.21%)_get (trie/hexary.py:87) (19 samples, 0.20%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)get (eth/db/storage.py:192) (37 samples, 0.38%)__getitem__ (eth/db/journal.py:336) (36 samples, 0.37%)sstore (eth/vm/logic/storage.py:16) (43 samples, 0.45%)get_storage (eth/vm/state.py:107) (42 samples, 0.43%)get_storage (eth/db/account.py:146) (41 samples, 0.42%)set (eth/db/storage.py:206) (11 samples, 0.11%)inner (eth/vm/forks/byzantium/opcodes.py:42) (71 samples, 0.74%)sstore (eth/vm/logic/storage.py:51) (19 samples, 0.20%)set_storage (eth/vm/state.py:110) (19 samples, 0.20%)set_storage (eth/db/account.py:155) (18 samples, 0.19%)wrapped_logic_fn (eth/vm/opcode.py:51) (16 samples, 0.17%)consume_gas (eth/vm/gas_meter.py:59) (11 samples, 0.11%)consume_gas (eth/vm/gas_meter.py:66) (16 samples, 0.17%)consume_gas (eth/vm/gas_meter.py:68) (18 samples, 0.19%)wrapped_logic_fn (eth/vm/opcode.py:53) (100 samples, 1.04%)consume_gas (eth/vm/computation.py:254) (87 samples, 0.90%)and_op (eth/vm/logic/comparison.py:105) (15 samples, 0.16%)dup_XX (eth/vm/logic/duplication.py:10) (30 samples, 0.31%)stack_dup (eth/vm/computation.py:290) (20 samples, 0.21%)eq (eth/vm/logic/comparison.py:77) (9 samples, 0.09%)_get_account (eth/db/account.py:334) (21 samples, 0.22%)_get_encoded_account (eth/db/account.py:323) (21 samples, 0.22%)__getitem__ (eth/db/journal.py:336) (21 samples, 0.22%)__getitem__ (eth/db/cache.py:22) (21 samples, 0.22%)__getitem__ (eth/db/keymap.py:28) (20 samples, 0.21%)__getitem__ (trie/hexary.py:515) (20 samples, 0.21%)get (trie/hexary.py:75) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)get_code (eth/db/account.py:253) (26 samples, 0.27%)get_code_hash (eth/db/account.py:275) (26 samples, 0.27%)extcodesize (eth/vm/logic/context.py:131) (55 samples, 0.57%)get_code (eth/vm/state.py:137) (55 samples, 0.57%)get_code (eth/db/account.py:258) (29 samples, 0.30%)__getitem__ (eth/db/journal.py:336) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (26 samples, 0.27%)__getitem__ (eth/db/backends/level.py:53) (25 samples, 0.26%)jump (eth/vm/logic/flow.py:27) (25 samples, 0.26%)is_valid_opcode (eth/vm/code_stream.py:99) (22 samples, 0.23%)jumpi (eth/vm/logic/flow.py:32) (20 samples, 0.21%)is_valid_opcode (eth/vm/code_stream.py:101) (9 samples, 0.09%)jumpi (eth/vm/logic/flow.py:42) (31 samples, 0.32%)is_valid_opcode (eth/vm/code_stream.py:99) (18 samples, 0.19%)mload (eth/vm/logic/memory.py:31) (18 samples, 0.19%)mstore (eth/vm/logic/memory.py:11) (31 samples, 0.32%)write (eth/vm/memory.py:55) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:13) (41 samples, 0.42%)memory_write (eth/vm/computation.py:239) (40 samples, 0.41%)write (eth/vm/memory.py:56) (10 samples, 0.10%)mstore (eth/vm/logic/memory.py:5) (9 samples, 0.09%)push_XX (eth/vm/logic/stack.py:11) (21 samples, 0.22%)push_bytes (eth/vm/stack.py:69) (11 samples, 0.11%)push_XX (eth/vm/logic/stack.py:19) (38 samples, 0.39%)push_bytes (eth/vm/stack.py:71) (10 samples, 0.10%)sha3 (eth/vm/logic/sha3.py:13) (9 samples, 0.09%)get_node (trie/hexary.py:284) (18 samples, 0.19%)__getitem__ (eth/db/backends/level.py:53) (17 samples, 0.18%)consume_payload (rlp/codec.py:179) (10 samples, 0.10%)get (trie/hexary.py:73) (50 samples, 0.52%)get_node (trie/hexary.py:285) (31 samples, 0.32%)decode_node (trie/utils/nodes.py:83) (29 samples, 0.30%)decode (rlp/codec.py:230) (29 samples, 0.30%)consume_item (rlp/codec.py:206) (25 samples, 0.26%)get_node (trie/hexary.py:284) (74 samples, 0.77%)__getitem__ (eth/db/backends/level.py:53) (74 samples, 0.77%)consume_payload (rlp/codec.py:179) (11 samples, 0.11%)decode (rlp/codec.py:230) (34 samples, 0.35%)consume_item (rlp/codec.py:206) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:490) (115 samples, 1.19%)get_node (trie/hexary.py:285) (40 samples, 0.41%)decode_node (trie/utils/nodes.py:83) (37 samples, 0.38%)get_node (trie/hexary.py:284) (105 samples, 1.09%)__getitem__ (eth/db/backends/level.py:53) (105 samples, 1.09%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)decode (rlp/codec.py:230) (36 samples, 0.37%)consume_item (rlp/codec.py:206) (31 samples, 0.32%)_get_branch_node (trie/hexary.py:490) (150 samples, 1.55%)get_node (trie/hexary.py:285) (45 samples, 0.47%)decode_node (trie/utils/nodes.py:83) (42 samples, 0.43%)__getitem__ (eth/db/backends/level.py:53) (108 samples, 1.12%)get_node (trie/hexary.py:284) (112 samples, 1.16%)consume_item (rlp/codec.py:205) (12 samples, 0.12%)consume_payload (rlp/codec.py:178) (14 samples, 0.14%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)decode (rlp/codec.py:230) (54 samples, 0.56%)consume_item (rlp/codec.py:206) (42 samples, 0.43%)_get_branch_node (trie/hexary.py:490) (178 samples, 1.84%)_..get_node (trie/hexary.py:285) (65 samples, 0.67%)decode_node (trie/utils/nodes.py:83) (60 samples, 0.62%)__getitem__ (eth/db/backends/level.py:53) (120 samples, 1.24%)get_node (trie/hexary.py:284) (121 samples, 1.25%)consume_item (rlp/codec.py:205) (12 samples, 0.12%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (179 samples, 1.85%)_..get_node (trie/hexary.py:285) (57 samples, 0.59%)decode_node (trie/utils/nodes.py:83) (54 samples, 0.56%)decode (rlp/codec.py:230) (51 samples, 0.53%)consume_item (rlp/codec.py:206) (39 samples, 0.40%)_get (trie/hexary.py:80) (10 samples, 0.10%)get_node_type (trie/utils/nodes.py:42) (10 samples, 0.10%)get_node (trie/hexary.py:284) (59 samples, 0.61%)__getitem__ (eth/db/backends/level.py:53) (59 samples, 0.61%)_get_branch_node (trie/hexary.py:490) (75 samples, 0.78%)get_node (trie/hexary.py:285) (16 samples, 0.17%)decode_node (trie/utils/nodes.py:83) (14 samples, 0.14%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node_type (trie/utils/nodes.py:42) (13 samples, 0.13%)_get (trie/hexary.py:80) (14 samples, 0.14%)_get (trie/hexary.py:85) (13 samples, 0.13%)get_node (trie/hexary.py:284) (15 samples, 0.16%)__getitem__ (eth/db/backends/level.py:53) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get (eth/db/storage.py:192) (884 samples, 9.15%)get (eth/db/s..__getitem__ (eth/db/journal.py:336) (882 samples, 9.13%)__getitem__ (..__getitem__ (eth/db/cache.py:22) (880 samples, 9.11%)__getitem__ (..__getitem__ (eth/db/storage.py:88) (870 samples, 9.01%)__getitem__ ..__getitem__ (trie/hexary.py:515) (870 samples, 9.01%)__getitem__ ..get (trie/hexary.py:75) (809 samples, 8.38%)get (trie/h.._get (trie/hexary.py:87) (807 samples, 8.36%)_get (trie/.._get_branch_node (trie/hexary.py:491) (691 samples, 7.16%)_get_branc.._get (trie/hexary.py:87) (688 samples, 7.13%)_get (tri.._get_branch_node (trie/hexary.py:491) (535 samples, 5.54%)_get_br.._get (trie/hexary.py:87) (517 samples, 5.35%)_get (.._get_branch_node (trie/hexary.py:491) (337 samples, 3.49%)_ge.._get (trie/hexary.py:87) (328 samples, 3.40%)_ge.._get_branch_node (trie/hexary.py:491) (147 samples, 1.52%)_get (trie/hexary.py:87) (128 samples, 1.33%)_get_branch_node (trie/hexary.py:491) (53 samples, 0.55%)_get (trie/hexary.py:87) (23 samples, 0.24%)sload (eth/vm/logic/storage.py:60) (913 samples, 9.46%)sload (eth/vm..get_storage (eth/vm/state.py:107) (912 samples, 9.44%)get_storage (..get_storage (eth/db/account.py:146) (905 samples, 9.37%)get_storage (..get (eth/db/storage.py:201) (16 samples, 0.17%)swap_XX (eth/vm/logic/swap.py:10) (11 samples, 0.11%)stack_swap (eth/vm/computation.py:287) (10 samples, 0.10%)apply_message (eth/vm/forks/frontier/computation.py:77) (4,128 samples, 42.75%)apply_message (eth/vm/forks/frontier/computation.py:77)apply_computation (eth/vm/computation.py:554) (4,043 samples, 41.87%)apply_computation (eth/vm/computation.py:554)wrapped_logic_fn (eth/vm/opcode.py:55) (1,469 samples, 15.21%)wrapped_logic_fn (eth/v..commit (eth/db/storage.py:233) (15 samples, 0.16%)has_checkpoint (eth/db/journal.py:389) (12 samples, 0.12%)has_checkpoint (eth/db/journal.py:117) (11 samples, 0.11%)commit (eth/db/storage.py:234) (11 samples, 0.11%)apply_message (eth/vm/forks/frontier/computation.py:83) (37 samples, 0.38%)commit (eth/vm/state.py:176) (37 samples, 0.38%)commit (eth/db/account.py:371) (29 samples, 0.30%)__call__ (eth/vm/state.py:264) (4,246 samples, 43.97%)__call__ (eth/vm/state.py:264)build_computation (eth/vm/forks/frontier/state.py:133) (4,235 samples, 43.86%)build_computation (eth/vm/forks/frontier/state.py:133)finalize_computation (eth/vm/forks/frontier/state.py:159) (21 samples, 0.22%)delta_balance (eth/vm/state.py:125) (21 samples, 0.22%)set_balance (eth/vm/state.py:122) (20 samples, 0.21%)set_balance (eth/db/account.py:225) (18 samples, 0.19%)finalize_computation (eth/vm/forks/frontier/state.py:169) (27 samples, 0.28%)delta_balance (eth/vm/state.py:125) (26 samples, 0.27%)set_balance (eth/vm/state.py:122) (23 samples, 0.24%)set_balance (eth/db/account.py:225) (23 samples, 0.24%)finalize_computation (eth/vm/forks/spurious_dragon/state.py:25) (87 samples, 0.90%)apply_transaction (eth/vm/base.py:151) (5,403 samples, 55.95%)apply_transaction (eth/vm/base.py:151)apply_transaction (eth/vm/forks/frontier/state.py:193) (5,401 samples, 55.93%)apply_transaction (eth/vm/forks/frontier/state.py:193)__call__ (eth/vm/state.py:265) (92 samples, 0.95%)add (eth_bloom/bloom.py:47) (11 samples, 0.11%)__init__ (eth/rlp/receipts.py:39) (19 samples, 0.20%)from_iterable (eth_bloom/bloom.py:57) (18 samples, 0.19%)extend (eth_bloom/bloom.py:52) (13 samples, 0.13%)make_receipt (eth/vm/forks/byzantium/__init__.py:110) (40 samples, 0.41%)make_frontier_receipt (eth/vm/forks/frontier/__init__.py:61) (30 samples, 0.31%)_deepcopy_tuple (copy.py:220) (15 samples, 0.16%)<listcomp> (copy.py:220) (15 samples, 0.16%)deepcopy (copy.py:161) (13 samples, 0.13%)__deepcopy__ (rlp/sedes/serializable.py:295) (13 samples, 0.13%)<dictcomp> (rlp/sedes/serializable.py:285) (17 samples, 0.18%)deepcopy (copy.py:150) (17 samples, 0.18%)copy (rlp/sedes/serializable.py:284) (20 samples, 0.21%)apply_transaction (eth/vm/base.py:152) (73 samples, 0.76%)make_receipt (eth/vm/forks/byzantium/__init__.py:117) (33 samples, 0.34%)validate_receipt (eth/vm/forks/byzantium/__init__.py:79) (9 samples, 0.09%)apply_all_transactions (eth/vm/base.py:230) (5,489 samples, 56.85%)apply_all_transactions (eth/vm/base.py:230)apply_transaction (eth/vm/base.py:153) (10 samples, 0.10%)add_receipt_to_header (eth/vm/forks/byzantium/__init__.py:100) (24 samples, 0.25%)copy (rlp/sedes/serializable.py:289) (9 samples, 0.09%)import_block (eth/vm/base.py:277) (5,542 samples, 57.39%)import_block (eth/vm/base.py:277)apply_all_transactions (eth/vm/base.py:235) (25 samples, 0.26%)_set (trie/hexary.py:122) (14 samples, 0.14%)_set_branch_node (trie/hexary.py:425) (17 samples, 0.18%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (10 samples, 0.10%)_persist_node (trie/hexary.py:317) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_set (trie/hexary.py:122) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:426) (14 samples, 0.14%)set (trie/hexary.py:104) (35 samples, 0.36%)_create_node_to_db_mapping (trie/hexary.py:309) (10 samples, 0.10%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (10 samples, 0.10%)set_block_transactions (eth/vm/base.py:310) (63 samples, 0.65%)make_trie_root_and_nodes (eth/db/trie.py:24) (63 samples, 0.65%)_make_trie_root_and_nodes (eth/db/trie.py:38) (62 samples, 0.64%)__setitem__ (trie/hexary.py:518) (61 samples, 0.63%)set (trie/hexary.py:108) (18 samples, 0.19%)_set_root_node (trie/hexary.py:273) (13 samples, 0.13%)_set_raw_node (trie/hexary.py:249) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (12 samples, 0.12%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (9 samples, 0.09%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)<genexpr> (eth/db/trie.py:24) (17 samples, 0.18%)encode (rlp/codec.py:67) (12 samples, 0.12%)encode_raw (rlp/codec.py:81) (12 samples, 0.12%)<genexpr> (rlp/codec.py:81) (12 samples, 0.12%)_set_branch_node (trie/hexary.py:423) (9 samples, 0.09%)_set (trie/hexary.py:122) (9 samples, 0.09%)_set_branch_node (trie/hexary.py:425) (13 samples, 0.13%)_set (trie/hexary.py:122) (19 samples, 0.20%)_set_branch_node (trie/hexary.py:425) (23 samples, 0.24%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (18 samples, 0.19%)_persist_node (trie/hexary.py:317) (21 samples, 0.22%)_node_to_db_mapping (trie/hexary.py:295) (21 samples, 0.22%)set (trie/hexary.py:104) (57 samples, 0.59%)_set (trie/hexary.py:122) (54 samples, 0.56%)_set_branch_node (trie/hexary.py:426) (22 samples, 0.23%)set (trie/hexary.py:108) (10 samples, 0.10%)set_block_transactions (eth/vm/base.py:313) (91 samples, 0.94%)make_trie_root_and_nodes (eth/db/trie.py:24) (91 samples, 0.94%)_make_trie_root_and_nodes (eth/db/trie.py:38) (74 samples, 0.77%)__setitem__ (trie/hexary.py:518) (74 samples, 0.77%)import_block (eth/vm/base.py:289) (156 samples, 1.62%)mine_block (eth/vm/base.py:295) (17 samples, 0.18%)pack_block (eth/vm/base.py:384) (17 samples, 0.18%)copy (rlp/sedes/serializable.py:284) (17 samples, 0.18%)<dictcomp> (rlp/sedes/serializable.py:285) (17 samples, 0.18%)deepcopy (copy.py:150) (17 samples, 0.18%)_deepcopy_tuple (copy.py:220) (17 samples, 0.18%)<listcomp> (copy.py:220) (17 samples, 0.18%)deepcopy (copy.py:161) (17 samples, 0.18%)__deepcopy__ (rlp/sedes/serializable.py:295) (17 samples, 0.18%)persist (eth/db/journal.py:413) (13 samples, 0.13%)pop_all (eth/db/journal.py:224) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:369) (11 samples, 0.11%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/batch.py:74) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:369) (19 samples, 0.20%)get_node (trie/hexary.py:284) (26 samples, 0.27%)__getitem__ (eth/db/batch.py:74) (25 samples, 0.26%)__getitem__ (eth/db/backends/level.py:53) (25 samples, 0.26%)_delete_branch_node (trie/hexary.py:369) (35 samples, 0.36%)get_node (trie/hexary.py:285) (9 samples, 0.09%)decode_node (trie/utils/nodes.py:83) (9 samples, 0.09%)decode (rlp/codec.py:230) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_delete (trie/hexary.py:151) (11 samples, 0.11%)__enter__ (contextlib.py:112) (11 samples, 0.11%)_prune_node (trie/hexary.py:237) (11 samples, 0.11%)_node_to_db_mapping (trie/hexary.py:295) (10 samples, 0.10%)get_node (trie/hexary.py:284) (13 samples, 0.13%)__getitem__ (eth/db/batch.py:74) (10 samples, 0.10%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)_delete_branch_node (trie/hexary.py:369) (18 samples, 0.19%)_delete (trie/hexary.py:158) (20 samples, 0.21%)_delete_branch_node (trie/hexary.py:379) (9 samples, 0.09%)_delete_branch_node (trie/hexary.py:371) (38 samples, 0.39%)_delete (trie/hexary.py:158) (49 samples, 0.51%)_delete_branch_node (trie/hexary.py:371) (60 samples, 0.62%)_delete (trie/hexary.py:158) (87 samples, 0.90%)_delete_branch_node (trie/hexary.py:371) (101 samples, 1.05%)_delete_branch_node (trie/hexary.py:372) (9 samples, 0.09%)_persist_node (trie/hexary.py:317) (9 samples, 0.09%)_node_to_db_mapping (trie/hexary.py:295) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_delete (trie/hexary.py:158) (146 samples, 1.51%)_delete_branch_node (trie/hexary.py:371) (159 samples, 1.65%)_persist_node (trie/hexary.py:317) (9 samples, 0.09%)_node_to_db_mapping (trie/hexary.py:295) (9 samples, 0.09%)_delete (trie/hexary.py:158) (189 samples, 1.96%)_.._delete_branch_node (trie/hexary.py:372) (11 samples, 0.11%)_delete_branch_node (trie/hexary.py:371) (200 samples, 2.07%)_.._persist_node (trie/hexary.py:317) (9 samples, 0.09%)_delete (trie/hexary.py:158) (221 samples, 2.29%)_.._delete_branch_node (trie/hexary.py:372) (10 samples, 0.10%)delete (trie/hexary.py:142) (227 samples, 2.35%)d..__getitem__ (eth/db/backends/level.py:53) (36 samples, 0.37%)_exists (eth/db/batch.py:61) (39 samples, 0.40%)__getitem__ (eth/db/batch.py:74) (39 samples, 0.40%)_set_root_node (trie/hexary.py:270) (42 samples, 0.43%)__contains__ (eth/db/backends/base.py:35) (41 samples, 0.42%)encode_raw (rlp/codec.py:75) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (12 samples, 0.12%)_create_node_to_db_mapping (trie/hexary.py:309) (18 samples, 0.19%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (25 samples, 0.26%)persist (eth/db/journal.py:418) (313 samples, 3.24%)per..__delitem__ (eth/db/cache.py:32) (312 samples, 3.23%)__d..__delitem__ (eth/db/storage.py:112) (312 samples, 3.23%)__d..__delitem__ (trie/hexary.py:521) (312 samples, 3.23%)__d..delete (trie/hexary.py:146) (77 samples, 0.80%)_set_root_node (trie/hexary.py:273) (33 samples, 0.34%)_set_raw_node (trie/hexary.py:249) (33 samples, 0.34%)_node_to_db_mapping (trie/hexary.py:295) (31 samples, 0.32%)get_node (trie/hexary.py:284) (9 samples, 0.09%)set (trie/hexary.py:102) (30 samples, 0.31%)get_node (trie/hexary.py:285) (20 samples, 0.21%)decode_node (trie/utils/nodes.py:83) (18 samples, 0.19%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)get_node (trie/hexary.py:284) (23 samples, 0.24%)__getitem__ (eth/db/batch.py:74) (22 samples, 0.23%)__getitem__ (eth/db/backends/level.py:53) (20 samples, 0.21%)_set_branch_node (trie/hexary.py:423) (42 samples, 0.43%)get_node (trie/hexary.py:285) (18 samples, 0.19%)decode_node (trie/utils/nodes.py:83) (18 samples, 0.19%)decode (rlp/codec.py:230) (16 samples, 0.17%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (11 samples, 0.11%)<genexpr> (rlp/codec.py:81) (10 samples, 0.10%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (15 samples, 0.16%)__enter__ (contextlib.py:112) (23 samples, 0.24%)_prune_node (trie/hexary.py:237) (23 samples, 0.24%)_node_to_db_mapping (trie/hexary.py:295) (23 samples, 0.24%)_set (trie/hexary.py:113) (25 samples, 0.26%)get_node (trie/hexary.py:284) (49 samples, 0.51%)__getitem__ (eth/db/batch.py:74) (47 samples, 0.49%)__getitem__ (eth/db/backends/level.py:53) (44 samples, 0.46%)_set_branch_node (trie/hexary.py:423) (70 samples, 0.72%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (19 samples, 0.20%)<genexpr> (rlp/codec.py:81) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (21 samples, 0.22%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (28 samples, 0.29%)__enter__ (contextlib.py:112) (39 samples, 0.40%)_prune_node (trie/hexary.py:237) (37 samples, 0.38%)_node_to_db_mapping (trie/hexary.py:295) (36 samples, 0.37%)_set (trie/hexary.py:113) (43 samples, 0.45%)get_node (trie/hexary.py:284) (50 samples, 0.52%)__getitem__ (eth/db/batch.py:74) (49 samples, 0.51%)__getitem__ (eth/db/backends/level.py:53) (49 samples, 0.51%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)_set_branch_node (trie/hexary.py:423) (70 samples, 0.72%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)encode_raw (rlp/codec.py:81) (11 samples, 0.11%)_create_node_to_db_mapping (trie/hexary.py:309) (14 samples, 0.14%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (22 samples, 0.23%)__enter__ (contextlib.py:112) (29 samples, 0.30%)_prune_node (trie/hexary.py:237) (28 samples, 0.29%)_node_to_db_mapping (trie/hexary.py:295) (28 samples, 0.29%)_set (trie/hexary.py:113) (34 samples, 0.35%)get_node (trie/hexary.py:284) (46 samples, 0.48%)__getitem__ (eth/db/batch.py:74) (43 samples, 0.45%)__getitem__ (eth/db/backends/level.py:53) (42 samples, 0.43%)_set_branch_node (trie/hexary.py:423) (52 samples, 0.54%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)__enter__ (contextlib.py:112) (17 samples, 0.18%)_prune_node (trie/hexary.py:237) (16 samples, 0.17%)_node_to_db_mapping (trie/hexary.py:295) (16 samples, 0.17%)_set (trie/hexary.py:113) (19 samples, 0.20%)__getitem__ (eth/db/backends/level.py:53) (27 samples, 0.28%)get_node (trie/hexary.py:284) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (28 samples, 0.29%)_set_branch_node (trie/hexary.py:423) (35 samples, 0.36%)_set (trie/hexary.py:113) (12 samples, 0.12%)__enter__ (contextlib.py:112) (12 samples, 0.12%)_prune_node (trie/hexary.py:237) (12 samples, 0.12%)_node_to_db_mapping (trie/hexary.py:295) (10 samples, 0.10%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_set (trie/hexary.py:120) (17 samples, 0.18%)_set_branch_node (trie/hexary.py:425) (9 samples, 0.09%)_set (trie/hexary.py:122) (19 samples, 0.20%)_set_branch_node (trie/hexary.py:425) (55 samples, 0.57%)_create_node_to_db_mapping (trie/hexary.py:309) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)_set (trie/hexary.py:122) (109 samples, 1.13%)_set_branch_node (trie/hexary.py:426) (19 samples, 0.20%)_persist_node (trie/hexary.py:317) (19 samples, 0.20%)_node_to_db_mapping (trie/hexary.py:295) (19 samples, 0.20%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (16 samples, 0.17%)_set_branch_node (trie/hexary.py:425) (144 samples, 1.49%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_persist_node (trie/hexary.py:317) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (12 samples, 0.12%)_set (trie/hexary.py:122) (211 samples, 2.19%)_.._set_branch_node (trie/hexary.py:426) (15 samples, 0.16%)_set_branch_node (trie/hexary.py:425) (260 samples, 2.69%)_s.._set (trie/hexary.py:124) (10 samples, 0.10%)encode_raw (rlp/codec.py:75) (13 samples, 0.13%)__instancecheck__ (abc.py:139) (10 samples, 0.10%)_create_node_to_db_mapping (trie/hexary.py:309) (20 samples, 0.21%)encode_raw (rlp/codec.py:81) (18 samples, 0.19%)<genexpr> (rlp/codec.py:81) (15 samples, 0.16%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (25 samples, 0.26%)_set (trie/hexary.py:122) (365 samples, 3.78%)_set.._set_branch_node (trie/hexary.py:426) (33 samples, 0.34%)_persist_node (trie/hexary.py:317) (32 samples, 0.33%)_node_to_db_mapping (trie/hexary.py:295) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:425) (421 samples, 4.36%)_set_..encode_raw (rlp/codec.py:81) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (12 samples, 0.12%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (18 samples, 0.19%)_persist_node (trie/hexary.py:317) (26 samples, 0.27%)_node_to_db_mapping (trie/hexary.py:295) (26 samples, 0.27%)_set (trie/hexary.py:122) (519 samples, 5.37%)_set (.._set_branch_node (trie/hexary.py:426) (27 samples, 0.28%)_set_branch_node (trie/hexary.py:425) (552 samples, 5.72%)_set_br..encode_raw (rlp/codec.py:75) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (20 samples, 0.21%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (31 samples, 0.32%)_persist_node (trie/hexary.py:317) (36 samples, 0.37%)_node_to_db_mapping (trie/hexary.py:295) (36 samples, 0.37%)_set (trie/hexary.py:122) (632 samples, 6.55%)_set (tr.._set_branch_node (trie/hexary.py:426) (38 samples, 0.39%)set (trie/hexary.py:104) (647 samples, 6.70%)set (trie..__getitem__ (eth/db/backends/level.py:53) (121 samples, 1.25%)_exists (eth/db/batch.py:61) (143 samples, 1.48%)__getitem__ (eth/db/batch.py:74) (140 samples, 1.45%)_set_root_node (trie/hexary.py:270) (148 samples, 1.53%)__contains__ (eth/db/backends/base.py:35) (146 samples, 1.51%)_cached_create_node_to_db_mapping (trie/hexary.py:302) (15 samples, 0.16%)inner (eth_utils/functional.py:45) (13 samples, 0.13%)_create_node_to_db_mapping (trie/hexary.py:306) (27 samples, 0.28%)encode_raw (rlp/codec.py:75) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (30 samples, 0.31%)<genexpr> (rlp/codec.py:81) (26 samples, 0.27%)_create_node_to_db_mapping (trie/hexary.py:309) (40 samples, 0.41%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (75 samples, 0.78%)_set_raw_node (trie/hexary.py:249) (125 samples, 1.29%)_node_to_db_mapping (trie/hexary.py:295) (123 samples, 1.27%)inner (eth_utils/functional.py:45) (25 samples, 0.26%)set (trie/hexary.py:108) (278 samples, 2.88%)se.._set_root_node (trie/hexary.py:273) (128 samples, 1.33%)__setitem__ (eth/db/storage.py:100) (961 samples, 9.95%)__setitem__ (e..__setitem__ (trie/hexary.py:518) (961 samples, 9.95%)__setitem__ (t..make_state_root (eth/db/account.py:375) (1,295 samples, 13.41%)make_state_root (eth..make_storage_root (eth/db/storage.py:241) (1,295 samples, 13.41%)make_storage_root (e..persist (eth/db/journal.py:422) (968 samples, 10.02%)persist (eth/d..__setitem__ (eth/db/cache.py:27) (967 samples, 10.01%)__setitem__ (e..make_state_root (eth/db/account.py:383) (10 samples, 0.10%)_set_storage_root (eth/db/account.py:198) (9 samples, 0.09%)batch_commit (trie/utils/db.py:59) (10 samples, 0.10%)__getitem__ (eth/db/diff.py:78) (13 samples, 0.13%)__getitem__ (eth/db/batch.py:69) (57 samples, 0.59%)__getitem__ (eth/db/diff.py:80) (31 samples, 0.32%)__init__ (eth/db/diff.py:48) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (781 samples, 8.09%)__getitem__..pop (_collections_abc.py:795) (865 samples, 8.96%)pop (_collec..__getitem__ (eth/db/batch.py:74) (796 samples, 8.24%)__getitem__..__getitem__ (eth/db/batch.py:69) (23 samples, 0.24%)__getitem__ (eth/db/diff.py:80) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (34 samples, 0.35%)__delitem__ (eth/db/batch.py:82) (72 samples, 0.75%)__contains__ (eth/db/backends/base.py:35) (67 samples, 0.69%)_exists (eth/db/batch.py:61) (66 samples, 0.68%)__getitem__ (eth/db/batch.py:74) (37 samples, 0.38%)__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..squash_changes (eth/db/hash_trie.py:21) (987 samples, 10.22%)squash_changes ..__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..squash_changes (trie/hexary.py:534) (987 samples, 10.22%)squash_changes ..__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..batch_commit (trie/utils/db.py:61) (972 samples, 10.07%)batch_commit (..pop (_collections_abc.py:801) (86 samples, 0.89%)_delete_branch_node (trie/hexary.py:371) (19 samples, 0.20%)_delete (trie/hexary.py:158) (19 samples, 0.20%)_delete_branch_node (trie/hexary.py:371) (18 samples, 0.19%)_delete (trie/hexary.py:158) (16 samples, 0.17%)_delete_branch_node (trie/hexary.py:371) (16 samples, 0.17%)_delete (trie/hexary.py:158) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:371) (13 samples, 0.13%)_delete (trie/hexary.py:158) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:371) (10 samples, 0.10%)_delete (trie/hexary.py:158) (10 samples, 0.10%)delete (trie/hexary.py:142) (22 samples, 0.23%)_delete (trie/hexary.py:158) (22 samples, 0.23%)_apply_account_diff_without_proof (eth/db/account.py:473) (30 samples, 0.31%)__delitem__ (eth/db/keymap.py:36) (30 samples, 0.31%)__delitem__ (trie/hexary.py:521) (30 samples, 0.31%)set (trie/hexary.py:102) (31 samples, 0.32%)get_node (trie/hexary.py:285) (31 samples, 0.32%)decode_node (trie/utils/nodes.py:83) (30 samples, 0.31%)decode (rlp/codec.py:230) (28 samples, 0.29%)consume_item (rlp/codec.py:206) (22 samples, 0.23%)decode (rlp/codec.py:230) (11 samples, 0.11%)_set_branch_node (trie/hexary.py:423) (17 samples, 0.18%)get_node (trie/hexary.py:285) (17 samples, 0.18%)decode_node (trie/utils/nodes.py:83) (17 samples, 0.18%)_set_branch_node (trie/hexary.py:423) (27 samples, 0.28%)get_node (trie/hexary.py:285) (20 samples, 0.21%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (19 samples, 0.20%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (13 samples, 0.13%)__enter__ (contextlib.py:112) (22 samples, 0.23%)_prune_node (trie/hexary.py:237) (21 samples, 0.22%)_node_to_db_mapping (trie/hexary.py:295) (21 samples, 0.22%)_set (trie/hexary.py:113) (25 samples, 0.26%)get_node (trie/hexary.py:284) (51 samples, 0.53%)__getitem__ (trie/utils/db.py:33) (51 samples, 0.53%)__getitem__ (eth/db/batch.py:74) (48 samples, 0.50%)__getitem__ (eth/db/backends/level.py:53) (47 samples, 0.49%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)_set_branch_node (trie/hexary.py:423) (71 samples, 0.74%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)_create_node_to_db_mapping (trie/hexary.py:306) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (13 samples, 0.13%)_create_node_to_db_mapping (trie/hexary.py:309) (19 samples, 0.20%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (35 samples, 0.36%)_prune_node (trie/hexary.py:237) (42 samples, 0.43%)_node_to_db_mapping (trie/hexary.py:295) (42 samples, 0.43%)__enter__ (contextlib.py:112) (43 samples, 0.45%)_set (trie/hexary.py:113) (44 samples, 0.46%)get_node (trie/hexary.py:284) (36 samples, 0.37%)__getitem__ (trie/utils/db.py:33) (36 samples, 0.37%)__getitem__ (eth/db/batch.py:74) (35 samples, 0.36%)__getitem__ (eth/db/backends/level.py:53) (35 samples, 0.36%)_set_branch_node (trie/hexary.py:423) (60 samples, 0.62%)get_node (trie/hexary.py:285) (24 samples, 0.25%)decode_node (trie/utils/nodes.py:83) (23 samples, 0.24%)decode (rlp/codec.py:230) (22 samples, 0.23%)consume_item (rlp/codec.py:206) (20 samples, 0.21%)encode_raw (rlp/codec.py:75) (22 samples, 0.23%)__instancecheck__ (abc.py:139) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (31 samples, 0.32%)<genexpr> (rlp/codec.py:81) (28 samples, 0.29%)_create_node_to_db_mapping (trie/hexary.py:309) (35 samples, 0.36%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (45 samples, 0.47%)__enter__ (contextlib.py:112) (59 samples, 0.61%)_prune_node (trie/hexary.py:237) (55 samples, 0.57%)_node_to_db_mapping (trie/hexary.py:295) (55 samples, 0.57%)_set (trie/hexary.py:113) (65 samples, 0.67%)get_node (trie/hexary.py:284) (85 samples, 0.88%)__getitem__ (trie/utils/db.py:33) (85 samples, 0.88%)__getitem__ (eth/db/batch.py:74) (79 samples, 0.82%)__getitem__ (eth/db/backends/level.py:53) (75 samples, 0.78%)_set_branch_node (trie/hexary.py:423) (105 samples, 1.09%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (17 samples, 0.18%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)encode_raw (rlp/codec.py:75) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (20 samples, 0.21%)<genexpr> (rlp/codec.py:81) (18 samples, 0.19%)_create_node_to_db_mapping (trie/hexary.py:309) (26 samples, 0.27%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (29 samples, 0.30%)__enter__ (contextlib.py:112) (35 samples, 0.36%)_prune_node (trie/hexary.py:237) (35 samples, 0.36%)_node_to_db_mapping (trie/hexary.py:295) (34 samples, 0.35%)_set (trie/hexary.py:113) (37 samples, 0.38%)get_node (trie/hexary.py:284) (61 samples, 0.63%)__getitem__ (trie/utils/db.py:33) (60 samples, 0.62%)__getitem__ (eth/db/batch.py:74) (59 samples, 0.61%)__getitem__ (eth/db/backends/level.py:53) (57 samples, 0.59%)_set_branch_node (trie/hexary.py:423) (76 samples, 0.79%)get_node (trie/hexary.py:285) (15 samples, 0.16%)decode_node (trie/utils/nodes.py:83) (15 samples, 0.16%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)encode_raw (rlp/codec.py:75) (17 samples, 0.18%)__instancecheck__ (abc.py:139) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (27 samples, 0.28%)<genexpr> (rlp/codec.py:81) (21 samples, 0.22%)_create_node_to_db_mapping (trie/hexary.py:309) (29 samples, 0.30%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (36 samples, 0.37%)__enter__ (contextlib.py:112) (44 samples, 0.46%)_prune_node (trie/hexary.py:237) (43 samples, 0.45%)_node_to_db_mapping (trie/hexary.py:295) (43 samples, 0.45%)_set (trie/hexary.py:113) (50 samples, 0.52%)get_node (trie/hexary.py:284) (61 samples, 0.63%)__getitem__ (trie/utils/db.py:33) (60 samples, 0.62%)__getitem__ (eth/db/batch.py:74) (55 samples, 0.57%)__getitem__ (eth/db/backends/level.py:53) (51 samples, 0.53%)_set_branch_node (trie/hexary.py:423) (71 samples, 0.74%)get_node (trie/hexary.py:285) (9 samples, 0.09%)_set (trie/hexary.py:111) (12 samples, 0.12%)get_node_type (trie/utils/nodes.py:42) (12 samples, 0.12%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (11 samples, 0.11%)__enter__ (contextlib.py:112) (18 samples, 0.19%)_prune_node (trie/hexary.py:237) (18 samples, 0.19%)_node_to_db_mapping (trie/hexary.py:295) (16 samples, 0.17%)_set (trie/hexary.py:113) (24 samples, 0.25%)_set (trie/hexary.py:120) (29 samples, 0.30%)_set_branch_node (trie/hexary.py:423) (11 samples, 0.11%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (trie/utils/db.py:33) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (10 samples, 0.10%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)_set (trie/hexary.py:113) (9 samples, 0.09%)_set_branch_node (trie/hexary.py:425) (15 samples, 0.16%)_set (trie/hexary.py:122) (30 samples, 0.31%)_set_branch_node (trie/hexary.py:425) (97 samples, 1.00%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (17 samples, 0.18%)_set (trie/hexary.py:122) (192 samples, 1.99%)_.._set_branch_node (trie/hexary.py:426) (24 samples, 0.25%)_persist_node (trie/hexary.py:317) (22 samples, 0.23%)_node_to_db_mapping (trie/hexary.py:295) (22 samples, 0.23%)_set_branch_node (trie/hexary.py:425) (251 samples, 2.60%)_s.._create_node_to_db_mapping (trie/hexary.py:309) (18 samples, 0.19%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (11 samples, 0.11%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (28 samples, 0.29%)_set (trie/hexary.py:122) (362 samples, 3.75%)_set.._set_branch_node (trie/hexary.py:426) (34 samples, 0.35%)_persist_node (trie/hexary.py:317) (34 samples, 0.35%)_node_to_db_mapping (trie/hexary.py:295) (34 samples, 0.35%)_set_branch_node (trie/hexary.py:425) (402 samples, 4.16%)_set..encode_raw (rlp/codec.py:81) (11 samples, 0.11%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (24 samples, 0.25%)_set (trie/hexary.py:122) (541 samples, 5.60%)_set (t.._set_branch_node (trie/hexary.py:426) (32 samples, 0.33%)_persist_node (trie/hexary.py:317) (32 samples, 0.33%)_node_to_db_mapping (trie/hexary.py:295) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:425) (611 samples, 6.33%)_set_bra..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)_create_node_to_db_mapping (trie/hexary.py:309) (19 samples, 0.20%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (15 samples, 0.16%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (31 samples, 0.32%)_persist_node (trie/hexary.py:317) (38 samples, 0.39%)_node_to_db_mapping (trie/hexary.py:295) (38 samples, 0.39%)_set (trie/hexary.py:122) (711 samples, 7.36%)_set (trie.._set_branch_node (trie/hexary.py:426) (40 samples, 0.41%)_set_branch_node (trie/hexary.py:425) (761 samples, 7.88%)_set_branch..encode_raw (rlp/codec.py:75) (17 samples, 0.18%)__instancecheck__ (abc.py:139) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (23 samples, 0.24%)<genexpr> (rlp/codec.py:81) (21 samples, 0.22%)_create_node_to_db_mapping (trie/hexary.py:309) (27 samples, 0.28%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (37 samples, 0.38%)_persist_node (trie/hexary.py:317) (44 samples, 0.46%)_node_to_db_mapping (trie/hexary.py:295) (44 samples, 0.46%)_set (trie/hexary.py:122) (879 samples, 9.10%)_set (trie/he.._set_branch_node (trie/hexary.py:426) (47 samples, 0.49%)_set_branch_node (trie/hexary.py:425) (907 samples, 9.39%)_set_branch_n..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)__instancecheck__ (abc.py:139) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (21 samples, 0.22%)<genexpr> (rlp/codec.py:81) (16 samples, 0.17%)_create_node_to_db_mapping (trie/hexary.py:309) (24 samples, 0.25%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (34 samples, 0.35%)_set (trie/hexary.py:122) (974 samples, 10.09%)_set (trie/hex.._set_branch_node (trie/hexary.py:426) (39 samples, 0.40%)_persist_node (trie/hexary.py:317) (38 samples, 0.39%)_node_to_db_mapping (trie/hexary.py:295) (37 samples, 0.38%)_set_branch_node (trie/hexary.py:425) (982 samples, 10.17%)_set_branch_no..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)__instancecheck__ (abc.py:139) (12 samples, 0.12%)__subclasscheck__ (abc.py:143) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (17 samples, 0.18%)_create_node_to_db_mapping (trie/hexary.py:309) (22 samples, 0.23%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (29 samples, 0.30%)_set (trie/hexary.py:122) (1,034 samples, 10.71%)_set (trie/hexa.._set_branch_node (trie/hexary.py:426) (35 samples, 0.36%)_persist_node (trie/hexary.py:317) (35 samples, 0.36%)_node_to_db_mapping (trie/hexary.py:295) (35 samples, 0.36%)set (trie/hexary.py:104) (1,045 samples, 10.82%)set (trie/hexary.._set_root_node (trie/hexary.py:267) (13 samples, 0.13%)__getitem__ (eth/db/backends/level.py:53) (149 samples, 1.54%)_exists (eth/db/batch.py:61) (171 samples, 1.77%)__getitem__ (eth/db/batch.py:74) (167 samples, 1.73%)__getitem__ (eth/db/backends/level.py:55) (12 samples, 0.12%)_set_root_node (trie/hexary.py:270) (184 samples, 1.91%)_..__contains__ (trie/utils/db.py:45) (182 samples, 1.88%)_..__contains__ (eth/db/backends/base.py:35) (179 samples, 1.85%)_.._cached_create_node_to_db_mapping (trie/hexary.py:302) (16 samples, 0.17%)inner (eth_utils/functional.py:45) (13 samples, 0.13%)validate_is_node (trie/validation.py:39) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:306) (35 samples, 0.36%)encode_raw (rlp/codec.py:75) (16 samples, 0.17%)encode_raw (rlp/codec.py:81) (37 samples, 0.38%)<genexpr> (rlp/codec.py:81) (29 samples, 0.30%)_create_node_to_db_mapping (trie/hexary.py:309) (46 samples, 0.48%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (89 samples, 0.92%)tuplify (trie/hexary.py:554) (10 samples, 0.10%)_set_raw_node (trie/hexary.py:249) (149 samples, 1.54%)_node_to_db_mapping (trie/hexary.py:295) (145 samples, 1.50%)inner (eth_utils/functional.py:45) (28 samples, 0.29%)set (trie/hexary.py:108) (351 samples, 3.64%)set .._set_root_node (trie/hexary.py:273) (153 samples, 1.58%)persist (eth/db/account.py:399) (3,758 samples, 38.92%)persist (eth/db/account.py:399)make_state_root (eth/db/account.py:391) (2,453 samples, 25.40%)make_state_root (eth/db/account.py:391)_apply_account_diff_without_proof (eth/db/account.py:501) (1,436 samples, 14.87%)_apply_account_diff_wi..__setitem__ (eth/db/keymap.py:32) (1,431 samples, 14.82%)__setitem__ (eth/db/ke..__setitem__ (trie/hexary.py:518) (1,431 samples, 14.82%)__setitem__ (trie/hexa..persist (eth/db/account.py:405) (10 samples, 0.10%)persist (eth/db/account.py:424) (9 samples, 0.09%)finalize_block (eth/vm/base.py:361) (3,781 samples, 39.16%)finalize_block (eth/vm/base.py:361)persist (eth/vm/state.py:179) (3,781 samples, 39.16%)persist (eth/vm/state.py:179)deepcopy (copy.py:161) (14 samples, 0.14%)__deepcopy__ (rlp/sedes/serializable.py:295) (14 samples, 0.14%)mine_block (eth/vm/base.py:297) (3,799 samples, 39.34%)mine_block (eth/vm/base.py:297)finalize_block (eth/vm/base.py:363) (18 samples, 0.19%)copy (rlp/sedes/serializable.py:284) (18 samples, 0.19%)<dictcomp> (rlp/sedes/serializable.py:285) (18 samples, 0.19%)deepcopy (copy.py:150) (18 samples, 0.19%)_deepcopy_tuple (copy.py:220) (18 samples, 0.19%)<listcomp> (copy.py:220) (18 samples, 0.19%)encode (rlp/codec.py:63) (9 samples, 0.09%)serialize (rlp/sedes/serializable.py:259) (9 samples, 0.09%)inner (eth_utils/functional.py:45) (9 samples, 0.09%)validate_block (eth/vm/base.py:507) (16 samples, 0.17%)make_trie_root_and_nodes (eth/db/trie.py:24) (16 samples, 0.17%)<genexpr> (eth/db/trie.py:24) (16 samples, 0.17%)import_block (eth/chains/base.py:427) (9,536 samples, 98.76%)import_block (eth/chains/base.py:427)import_block (eth/vm/base.py:292) (3,838 samples, 39.75%)import_block (eth/vm/base.py:292)mine_block (eth/vm/base.py:300) (22 samples, 0.23%)get (trie/hexary.py:73) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get_node (trie/hexary.py:285) (12 samples, 0.12%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)decode (rlp/codec.py:230) (12 samples, 0.12%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)_get_block_transactions (eth/db/chain.py:328) (44 samples, 0.46%)_get_block_transaction_data (eth/db/chain.py:313) (42 samples, 0.43%)__getitem__ (trie/hexary.py:515) (42 samples, 0.43%)get (trie/hexary.py:75) (32 samples, 0.33%)_get (trie/hexary.py:87) (31 samples, 0.32%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (13 samples, 0.13%)decode (rlp/codec.py:237) (14 samples, 0.14%)process_blocks (gethimport.py:471) (9,613 samples, 99.55%)process_blocks (gethimport.py:471)import_block (eth/chains/base.py:448) (63 samples, 0.65%)<genexpr> (eth/chains/base.py:447) (63 samples, 0.65%)get_block_by_hash (eth/chains/base.py:311) (63 samples, 0.65%)get_block_by_header (eth/chains/base.py:315) (63 samples, 0.65%)get_block (eth/vm/base.py:114) (63 samples, 0.65%)from_header (eth/vm/forks/frontier/blocks.py:112) (63 samples, 0.65%)get_block_transactions (eth/db/chain.py:221) (63 samples, 0.65%)inner (eth_utils/functional.py:45) (63 samples, 0.65%)_get_block_transactions (eth/db/chain.py:329) (19 samples, 0.20%)all (9,656 samples, 100%)<module> (gethimport.py:526) (9,656 samples, 100.00%)<module> (gethimport.py:526) \ No newline at end of file From ac23e6f1bf97272771f25218050f9212d3c09f81 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Wed, 4 Dec 2019 18:06:44 -0800 Subject: [PATCH 11/19] Break into subcommands, add a lot of --help messages --- scripts/gethimport.py | 251 ++++++++++++++++++++++++++++-------------- 1 file changed, 167 insertions(+), 84 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index bfede047fd..7d4028523f 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -95,24 +95,13 @@ def __init__(self, ancient_path, name, uses_compression): self.ancient_path = ancient_path self.name = name self.uses_compression = uses_compression - logger.debug(f'opening freezer table. name={self.name}') self.index_file = open(os.path.join(ancient_path, self.index_file_name), 'rb') stat_result = os.stat(self.index_file.fileno()) index_file_size = stat_result.st_size assert index_file_size % 6 == 0, index_file_size - logger.debug(f'index_size={index_file_size} ({index_file_size // 6} entries)') self.entries = index_file_size // 6 - first_index_bytes = self.index_file.read(6) - first_index = GethFreezerIndexEntry.from_bytes(first_index_bytes) - logger.debug(f'first_index={first_index}') - - self.index_file.seek(-6, 2) - last_index_bytes = self.index_file.read(6) - last_index = GethFreezerIndexEntry.from_bytes(last_index_bytes) - logger.debug(f'last_index={last_index}') - self._data_files = dict() @property @@ -163,6 +152,19 @@ def __del__(self) -> None: f.close() self.index_file.close() + @property + def last_index(self): + self.index_file.seek(-6, 2) + last_index_bytes = self.index_file.read(6) + return GethFreezerIndexEntry.from_bytes(last_index_bytes) + + @property + def first_index(self): + self.index_file.seek(0) + first_index_bytes = self.index_file.read(6) + return GethFreezerIndexEntry.from_bytes(first_index_bytes) + + class BlockBody(rlp.Serializable): "This is how geth stores block bodies" @@ -274,7 +276,6 @@ def open_gethdb(location): last_block = gethdb.last_block_hash last_block_num = gethdb.block_num_for_hash(last_block) - logger.info('geth database opened') logger.info(f'found geth chain tip: header_hash={humanize_hash(last_block)} block_number={last_block_num}') genesis_hash = gethdb.header_hash_for_block_number(0) @@ -297,17 +298,18 @@ def open_trinitydb(location): logger.info(f'Trinity database did not already exist, initializing it now') chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) - # from_genesis_header copied the header over to our trinity db but not the state + logger.warining('The new db contains the genesis header but not the genesis state.') + logger.warining('Attempts to full sync will fail.') return chain -def main(args): - gethdb = open_gethdb(args.gethdb) - chain = open_trinitydb(args.destdb) +def import_headers(gethdb, chain): headerdb = chain.headerdb - # 3. Import headers + bodies + logger.warning('Some features are not yet implemented:') + logger.warning('- This only supports importing the mainnet chain') + logger.warning('- This script will not verify that geth is using the mainnet chain') canonical_head = headerdb.get_canonical_head() logger.info(f'starting import from trinity\'s canonical head: {canonical_head}') @@ -324,13 +326,9 @@ def main(args): final_block_to_sync = min(args.syncuntil, final_block_to_sync) for i in range(canonical_head.block_number, final_block_to_sync + 1): - - if not args.nobodies: - import_block_body(gethdb, chain, i) - else: - header_hash = gethdb.header_hash_for_block_number(i) - header = gethdb.block_header(i, header_hash) - headerdb.persist_header(header) + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) + headerdb.persist_header(header) if i % 1000 == 0: logger.debug(f'current canonical header: {headerdb.get_canonical_head()}') @@ -344,54 +342,14 @@ def main(args): logger.info('finished importing headers + bodies') - if args.justblocks: - return - - scan_state(gethdb, leveldb) - return - - state_root = canonical_head.state_root - logger.info(f'starting state trie import: {humanize_hash(state_root)}') - - # 4. Import the state trie + storage tries - # Write something which iterates over the entire trie, from left to right - # Pass it a database which first looks in the trinity db, and if nothing is there - # copies the requested node from geth->trinity before returning it - - imported_leaf_count = 0 - importdb = ImportDatabase(gethdb=gethdb.db, trinitydb=leveldb.db) - for path, leaf_data in iterate_leaves(importdb, state_root): - account = rlp.decode(leaf_data, sedes=Account) - addr_hash = nibbles_to_bytes(path) - - if account.code_hash != EMPTY_SHA3: - bytecode = importdb.get(account.code_hash) - - if account.storage_root == BLANK_ROOT_HASH: - imported_leaf_count += 1 - - if imported_leaf_count % 1000 == 0: - logger.debug(f'progress sha(addr)={addr_hash.hex()}') - continue - - for path, leaf_data in iterate_leaves(importdb, account.storage_root): - item_addr = nibbles_to_bytes(path) - imported_leaf_count += 1 - - if imported_leaf_count % 1000 == 0: - logger.debug(f'progress sha(addr)={addr_hash.hex()} sha(item)={item_addr.hex()}') - - loger.info('successfully imported state trie and all storage tries') - - -def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): +def sweep_state(gethdb: GethDatabase, trinitydb: LevelDB): """ Imports state, but by indiscriminately copying over everything which might be part of the state trie. This copies more data than necessary, but is likely to be much faster than iterating all state. """ - logger.debug('scan_state: bulk-importing state entries') + logger.debug('sweep_state: bulk-importing state entries') iterator = gethdb.db.iterator( start=b'\x00'*32, @@ -416,7 +374,43 @@ def scan_state(gethdb: GethDatabase, trinitydb: LevelDB): break bucket = (int.from_bytes(bucket, 'big') + 1).to_bytes(2, 'big') - logger.info(f'scan_state: successfully imported {imported_entries} state entries') + logger.info(f'sweep_state: successfully imported {imported_entries} state entries') + + +def import_state(gethdb: GethDatabase, chain): + headerdb = chain.headerdb + canonical_head = headerdb.get_canonical_head() + state_root = canonical_head.state_root + + logger.info( + f'starting state trie import. canonical_head={canonical_head} ' + f'state_root={humanize_hash(state_root)}' + ) + + imported_leaf_count = 0 + importdb = ImportDatabase(gethdb=gethdb.db, trinitydb=leveldb.db) + for path, leaf_data in iterate_leaves(importdb, state_root): + account = rlp.decode(leaf_data, sedes=Account) + addr_hash = nibbles_to_bytes(path) + + if account.code_hash != EMPTY_SHA3: + bytecode = importdb.get(account.code_hash) + + if account.storage_root == BLANK_ROOT_HASH: + imported_leaf_count += 1 + + if imported_leaf_count % 1000 == 0: + logger.debug(f'progress sha(addr)={addr_hash.hex()}') + continue + + for path, leaf_data in iterate_leaves(importdb, account.storage_root): + item_addr = nibbles_to_bytes(path) + imported_leaf_count += 1 + + if imported_leaf_count % 1000 == 0: + logger.debug(f'progress sha(addr)={addr_hash.hex()} sha(item)={item_addr.hex()}') + + loger.info('successfully imported state trie and all storage tries') def import_block_body(gethdb, chain, block_number: int): @@ -429,7 +423,7 @@ def import_block_body(gethdb, chain, block_number: int): chain.chaindb.persist_block(block) # persist_block saves the transactions into an index, but doesn't actually persist the - # transaction trie, meaning that without this next block attempts to read out the + # transaction trie, meaning that without this next section attempts to read out the # block will throw an exception tx_root_hash, tx_kv_nodes = make_trie_root_and_nodes(body.transactions) assert tx_root_hash == block.header.transaction_root @@ -489,6 +483,25 @@ def read_receipts(gethdb, block_number): logger.info(f'- post_state_or_status={post_state} gas_used={gas_used} len(logs)={len(logs)}') +def read_geth(gethdb): + logger.info(f'database_version={gethdb.database_version}') + + ancient_entry_count = gethdb.ancient_hashes.entries + logger.info(f'entries_in_ancient_db={ancient_entry_count}') + + +def read_trinity(location): + if not os.path.exists(location): + logger.error(f'There is no database at {location}') + return + + chain = open_trinitydb(location) + headerdb = chain.headerdb + + canonical_head = headerdb.get_canonical_head() + logger.info(f'canonical_head={canonical_head}') + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -496,25 +509,86 @@ def read_receipts(gethdb, block_number): datefmt='%H:%M:%S' ) - parser = argparse.ArgumentParser() - parser.add_argument('-gethdb', type=str, required=True) - parser.add_argument('-destdb', type=str, required=True) - parser.add_argument('-justblocks', action='store_true') - parser.add_argument('-nobodies', action='store_true') - parser.add_argument('-syncuntil', type=int, action='store') - - subparsers = parser.add_subparsers(dest="command") + parser = argparse.ArgumentParser( + description="Import chaindata from geth: builds a database py-evm understands.", + epilog="For more information on using a subcommand: 'subcommand --help'" + ) + subparsers = parser.add_subparsers(dest="command", title="subcommands") + + import_headers_parser = subparsers.add_parser( + 'import_headers', + help="Copies over headers from geth into trinity", + description=""" + copies every header, starting from trinity's canonical chain tip, + continuing up to geth's canonical chain tip + """ + ) + import_headers_parser.add_argument('-gethdb', type=str, required=True) + import_headers_parser.add_argument('-destdb', type=str, required=True) + import_headers_parser.add_argument( + '-syncuntil', type=int, action='store', + help="Only import headers up to this block number" + ) - import_body_range_parser = subparsers.add_parser('import_body_range') + sweep_state_parser = subparsers.add_parser( + 'sweep_state', + help="Does a (very fast) bulk copy of state entries from the gethdb", + description=""" + Scans over every key:value pair in the geth database, and copies over + everything which looks like a state node (has a 32-byte key). This is + much faster than iterating over the state trie (as import_state does) + but imports too much. If a geth node has been running for a while (and + started and stopped a lot) then there will be a lot of unimportant + state entries. + """ + ) + sweep_state_parser.add_argument('-gethdb', type=str, required=True) + sweep_state_parser.add_argument('-destdb', type=str, required=True) + + import_body_range_parser = subparsers.add_parser( + 'import_body_range', + help="Imports block bodies (transactions and uncles, but not receipts)", + description=""" + block bodies take a while to import so this command lets you import + just the segment you need. -startblock and -endblock are inclusive. + """ + ) + import_body_range_parser.add_argument('-gethdb', type=str, required=True) + import_body_range_parser.add_argument('-destdb', type=str, required=True) import_body_range_parser.add_argument('-startblock', type=int, required=True) import_body_range_parser.add_argument('-endblock', type=int, required=True) - process_blocks_parser = subparsers.add_parser('process_blocks') + process_blocks_parser = subparsers.add_parser( + 'process_blocks', + help="Simulates a full sync, runs each block.", + description=""" + Starting from trinity's canonical chain tip this fetches block bodies + from the gethdb and runs each of them. + """ + ) + process_blocks_parser.add_argument('-gethdb', type=str, required=True) + process_blocks_parser.add_argument('-destdb', type=str, required=True) process_blocks_parser.add_argument('-endblock', type=int, required=True) - read_receipts_parser = subparsers.add_parser('read_receipts') + read_receipts_parser = subparsers.add_parser( + 'read_receipts', + help="Helper to inspect all the receipts for a given block" + ) + read_receipts_parser.add_argument('-gethdb', type=str, required=True) read_receipts_parser.add_argument('-block', type=int, required=True) + read_trinity_parser = subparsers.add_parser( + 'read_trinity', + help="Helper to print summary statistics for a given trinitydb" + ) + read_trinity_parser.add_argument('-destdb', type=str, required=True) + + read_geth_parser = subparsers.add_parser( + 'read_geth', + help="Helper to print summary statistics for a given gethdb" + ) + read_geth_parser.add_argument('-gethdb', type=str, required=True) + args = parser.parse_args() if args.command == 'import_body_range': @@ -528,9 +602,18 @@ def read_receipts(gethdb, block_number): elif args.command == 'read_receipts': gethdb = open_gethdb(args.gethdb) read_receipts(gethdb, args.block) + elif args.command == 'read_geth': + gethdb = open_gethdb(args.gethdb) + read_geth(gethdb) + elif args.command == 'read_trinity': + read_trinity(args.destdb) + elif args.command == 'import_headers': + gethdb = open_gethdb(args.gethdb) + chain = open_trinitydb(args.destdb) + import_headers(gethdb, chain) + elif args.command == 'sweep_state': + gethdb = open_gethdb(args.gethdb) + chain = open_trinitydb(args.destdb) + sweep_state(gethdb, chain.headerdb.db) else: - main(args) - - logger.warning('Some features are not yet implemented:') - logger.warning('- Receipts were not imported') - logger.warning('- This script did not verify that the chain configs match') + logger.error(f'unrecognized command. command={args.command}') From 6ca4cb889b27cb317e89b26a20df170876c7fc42 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 16:08:17 -0800 Subject: [PATCH 12/19] Fix bug, import entire state --- scripts/gethimport.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 7d4028523f..85b353560f 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -368,10 +368,8 @@ def sweep_state(gethdb: GethDatabase, trinitydb: LevelDB): trinitydb[key] = value imported_entries += 1 - if key >= bucket: + if key >= bucket and bucket != b'\xff\xff': logger.debug(f'imported: {bucket.hex()} skipped={skipped_keys}') - if bucket == b'\xff' * 2: - break bucket = (int.from_bytes(bucket, 'big') + 1).to_bytes(2, 'big') logger.info(f'sweep_state: successfully imported {imported_entries} state entries') From 061c39be80b5b179e6be187054a007c69f0e89d9 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 17:00:03 -0800 Subject: [PATCH 13/19] Appease lint --- eth/db/trie_iteration.py | 6 +++--- scripts/gethimport.py | 29 ++++++++++++++++++----------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/eth/db/trie_iteration.py b/eth/db/trie_iteration.py index 242ddbf148..22423c7e79 100644 --- a/eth/db/trie_iteration.py +++ b/eth/db/trie_iteration.py @@ -55,14 +55,14 @@ def __str__(self) -> str: f"hash={self.keccak.hex()}" f" path={self.path_rest}" f" child={self.obj[1].hex()}" - ")" + f")" ) if self.kind == NodeKind.LEAF: return ( "TrieNode(" f"hash={self.keccak.hex()}" f" path={self.path_rest[:10]}..." - ")" + f")" ) return f"TrieNode(kind={self.kind.name} hash={self.keccak.hex()})" @@ -104,7 +104,7 @@ def _get_children_with_nibbles(node: TrieNode, prefix: Nibbles) -> Iterable[Tupl def _get_node(db: ChainDB, node_hash: Hash32) -> TrieNode: if len(node_hash) < 32: - node_rlp = node_hash + node_rlp = cast(bytes, node_hash) else: node_rlp = db.get(node_hash) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 85b353560f..a4171a59f9 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -9,7 +9,6 @@ import os import os.path from pathlib import Path -import shutil import snappy import struct import time @@ -130,7 +129,7 @@ def get(self, number: int) -> bytes: # What happens if we're trying to read the last item? Won't this fail? # Is there always one extra entry in the index file? - self.index_file.seek((number+1) * 6) + self.index_file.seek((number + 1) * 6) entry_bytes = self.index_file.read(6) end_entry = GethFreezerIndexEntry.from_bytes(entry_bytes) @@ -165,7 +164,6 @@ def first_index(self): return GethFreezerIndexEntry.from_bytes(first_index_bytes) - class BlockBody(rlp.Serializable): "This is how geth stores block bodies" fields = [ @@ -276,7 +274,9 @@ def open_gethdb(location): last_block = gethdb.last_block_hash last_block_num = gethdb.block_num_for_hash(last_block) - logger.info(f'found geth chain tip: header_hash={humanize_hash(last_block)} block_number={last_block_num}') + + context = f'header_hash={humanize_hash(last_block)} block_number={last_block_num}' + logger.info(f'found geth chain tip: {context}') genesis_hash = gethdb.header_hash_for_block_number(0) genesis_header = gethdb.block_header(0, genesis_hash) @@ -352,8 +352,8 @@ def sweep_state(gethdb: GethDatabase, trinitydb: LevelDB): logger.debug('sweep_state: bulk-importing state entries') iterator = gethdb.db.iterator( - start=b'\x00'*32, - stop=b'\xff'*32, + start=b'\x00' * 32, + stop=b'\xff' * 32, include_start=True, include_stop=True, ) @@ -385,6 +385,7 @@ def import_state(gethdb: GethDatabase, chain): f'state_root={humanize_hash(state_root)}' ) + leveldb = headerdb.db imported_leaf_count = 0 importdb = ImportDatabase(gethdb=gethdb.db, trinitydb=leveldb.db) for path, leaf_data in iterate_leaves(importdb, state_root): @@ -392,7 +393,8 @@ def import_state(gethdb: GethDatabase, chain): addr_hash = nibbles_to_bytes(path) if account.code_hash != EMPTY_SHA3: - bytecode = importdb.get(account.code_hash) + # by fetching it, we're copying it into the trinity database + importdb.get(account.code_hash) if account.storage_root == BLANK_ROOT_HASH: imported_leaf_count += 1 @@ -401,14 +403,14 @@ def import_state(gethdb: GethDatabase, chain): logger.debug(f'progress sha(addr)={addr_hash.hex()}') continue - for path, leaf_data in iterate_leaves(importdb, account.storage_root): + for path, _leaf_data in iterate_leaves(importdb, account.storage_root): item_addr = nibbles_to_bytes(path) imported_leaf_count += 1 if imported_leaf_count % 1000 == 0: logger.debug(f'progress sha(addr)={addr_hash.hex()} sha(item)={item_addr.hex()}') - loger.info('successfully imported state trie and all storage tries') + logger.info('successfully imported state trie and all storage tries') def import_block_body(gethdb, chain, block_number: int): @@ -461,7 +463,7 @@ def process_blocks(gethdb, chain, end_block): transaction_class.from_base_transaction(txn) for txn in body.transactions ] block = block_class(header, transactions, body.uncles) - imported_block, _, _ = chain.import_block(block, perform_validation = True) + imported_block, _, _ = chain.import_block(block, perform_validation=True) logger.debug(f'imported block: {imported_block}') @@ -478,7 +480,12 @@ def read_receipts(gethdb, block_number): if len(raw_gas_used) < 8: padded = (b'\x00' * (8 - len(raw_gas_used))) + raw_gas_used gas_used = struct.unpack('>Q', padded)[0] - logger.info(f'- post_state_or_status={post_state} gas_used={gas_used} len(logs)={len(logs)}') + context = ' '.join([ + f'post_state_or_status={post_state}', + f'gas_used={gas_used}', + f'len(logs)={len(logs)}' + ]) + logger.info(f'- {context}') def read_geth(gethdb): From dc8e34e9704d5429fe636039add5d2851a69dfbf Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 17:05:41 -0800 Subject: [PATCH 14/19] circleci installs libsnappy before building --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5df3f2bc3e..a6d04a2bc0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,9 @@ common: &common - restore_cache: keys: - cache-v1-{{ arch }}-{{ .Environment.CIRCLE_JOB }}-{{ checksum "setup.py" }}-{{ checksum "tox.ini" }} + - run: + name: install libsnappy-dev + command: sudo apt install -y libsnappy-dev - run: name: install dependencies command: pip install --user tox From 823b09116c08625f87648ffeae3f4fef5f367f6f Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 17:12:36 -0800 Subject: [PATCH 15/19] Remove flamegraph --- import_block_flame.svg | 308 ----------------------------------------- 1 file changed, 308 deletions(-) delete mode 100644 import_block_flame.svg diff --git a/import_block_flame.svg b/import_block_flame.svg deleted file mode 100644 index 584b24cc8a..0000000000 --- a/import_block_flame.svg +++ /dev/null @@ -1,308 +0,0 @@ -py-spy Reset ZoomSearch process_blocks (gethimport.py:466) (19 samples, 0.20%)block_body (gethimport.py:235) (17 samples, 0.18%)decode (rlp/codec.py:237) (10 samples, 0.10%)deserialize (rlp/sedes/serializable.py:266) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)deserialize (rlp/sedes/lists.py:93) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)deserialize (rlp/sedes/lists.py:143) (10 samples, 0.10%)decode (rlp/codec.py:237) (11 samples, 0.11%)process_blocks (gethimport.py:468) (20 samples, 0.21%)<listcomp> (gethimport.py:468) (20 samples, 0.21%)from_base_transaction (eth/rlp/transactions.py:69) (20 samples, 0.21%)record (eth/db/account.py:357) (23 samples, 0.24%)record (eth/db/storage.py:220) (17 samples, 0.18%)record_checkpoint (eth/db/journal.py:136) (14 samples, 0.14%)snapshot (eth/vm/state.py:164) (27 samples, 0.28%)apply_all_transactions (eth/vm/base.py:227) (28 samples, 0.29%)validate_transaction_signature (eth/_utils/transactions.py:90) (12 samples, 0.12%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:30) (10 samples, 0.10%)encode (rlp/codec.py:63) (12 samples, 0.12%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:32) (18 samples, 0.19%)validate_transaction_signature (eth/_utils/transactions.py:91) (34 samples, 0.35%)recover_public_key_from_msg (eth_keys/datatypes.py:418) (9 samples, 0.09%)keccak (eth_utils/crypto.py:11) (9 samples, 0.09%)import_string (eth_keys/utils/module_loading.py:18) (9 samples, 0.09%)import_module (importlib/__init__.py:127) (9 samples, 0.09%)backend (eth_keys/datatypes.py:101) (14 samples, 0.14%)get_backend (eth_keys/datatypes.py:112) (13 samples, 0.13%)get_backend (eth_keys/backends/__init__.py:35) (13 samples, 0.13%)get_backend_class (eth_keys/backends/__init__.py:31) (10 samples, 0.10%)validate_transaction_signature (eth/_utils/transactions.py:93) (88 samples, 0.91%)recover_public_key_from_msg (eth_keys/datatypes.py:419) (79 samples, 0.82%)recover_public_key_from_msg_hash (eth_keys/datatypes.py:422) (79 samples, 0.82%)ecdsa_recover (eth_keys/backends/coincurve.py:99) (56 samples, 0.58%)from_signature_and_message (coincurve/keys.py:246) (55 samples, 0.57%)recover (coincurve/ecdsa.py:39) (52 samples, 0.54%)verify_msg (eth_keys/datatypes.py:350) (9 samples, 0.09%)keccak (eth_utils/crypto.py:11) (9 samples, 0.09%)validate_transaction (eth/vm/forks/frontier/state.py:49) (199 samples, 2.06%)v..validate (eth/vm/forks/homestead/transactions.py:36) (199 samples, 2.06%)v..validate (eth/vm/forks/frontier/transactions.py:83) (186 samples, 1.93%)v..validate (eth/rlp/transactions.py:85) (181 samples, 1.87%)v..check_signature_validity (eth/vm/forks/frontier/transactions.py:86) (181 samples, 1.87%)c..validate_transaction_signature (eth/_utils/transactions.py:97) (47 samples, 0.49%)verify_msg (eth_keys/datatypes.py:351) (38 samples, 0.39%)verify_msg_hash (eth_keys/datatypes.py:356) (38 samples, 0.39%)ecdsa_verify (eth_keys/backends/coincurve.py:88) (22 samples, 0.23%)verify (coincurve/keys.py:285) (22 samples, 0.23%)infer_sedes (rlp/codec.py:278) (9 samples, 0.09%)encode (rlp/codec.py:63) (18 samples, 0.19%)inner (eth_utils/functional.py:45) (9 samples, 0.09%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:32) (27 samples, 0.28%)extract_transaction_sender (eth/_utils/transactions.py:115) (44 samples, 0.46%)get_message_for_signing (eth/vm/forks/spurious_dragon/transactions.py:40) (11 samples, 0.11%)backend (eth_keys/datatypes.py:101) (10 samples, 0.10%)get_backend (eth_keys/datatypes.py:112) (10 samples, 0.10%)get_backend (eth_keys/backends/__init__.py:35) (10 samples, 0.10%)get_backend_class (eth_keys/backends/__init__.py:31) (9 samples, 0.09%)extract_transaction_sender (eth/_utils/transactions.py:116) (62 samples, 0.64%)recover_public_key_from_msg (eth_keys/datatypes.py:419) (58 samples, 0.60%)recover_public_key_from_msg_hash (eth_keys/datatypes.py:422) (58 samples, 0.60%)ecdsa_recover (eth_keys/backends/coincurve.py:99) (39 samples, 0.40%)from_signature_and_message (coincurve/keys.py:246) (38 samples, 0.39%)recover (coincurve/ecdsa.py:39) (32 samples, 0.33%)__get__ (cached_property.py:35) (116 samples, 1.20%)sender (eth/rlp/transactions.py:73) (116 samples, 1.20%)get_sender (eth/vm/forks/frontier/transactions.py:89) (116 samples, 1.20%)decode (rlp/codec.py:230) (9 samples, 0.09%)get (trie/hexary.py:73) (15 samples, 0.16%)get_node (trie/hexary.py:285) (12 samples, 0.12%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (12 samples, 0.12%)get_node (trie/hexary.py:285) (10 samples, 0.10%)decode_node (trie/utils/nodes.py:83) (10 samples, 0.10%)decode (rlp/codec.py:230) (9 samples, 0.09%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (23 samples, 0.24%)__getitem__ (eth/db/batch.py:74) (22 samples, 0.23%)__getitem__ (eth/db/backends/level.py:53) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:490) (36 samples, 0.37%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)get_node (trie/hexary.py:284) (44 samples, 0.46%)__getitem__ (eth/db/batch.py:74) (43 samples, 0.45%)__getitem__ (eth/db/backends/level.py:53) (38 samples, 0.39%)consume_payload (rlp/codec.py:178) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (79 samples, 0.82%)get_node (trie/hexary.py:285) (35 samples, 0.36%)decode_node (trie/utils/nodes.py:83) (31 samples, 0.32%)decode (rlp/codec.py:230) (28 samples, 0.29%)consume_item (rlp/codec.py:206) (21 samples, 0.22%)get_node (trie/hexary.py:284) (36 samples, 0.37%)__getitem__ (eth/db/batch.py:74) (34 samples, 0.35%)__getitem__ (eth/db/backends/level.py:53) (33 samples, 0.34%)_get_branch_node (trie/hexary.py:490) (53 samples, 0.55%)get_node (trie/hexary.py:285) (17 samples, 0.18%)decode_node (trie/utils/nodes.py:83) (16 samples, 0.17%)decode (rlp/codec.py:230) (13 samples, 0.13%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (55 samples, 0.57%)__getitem__ (eth/db/batch.py:74) (52 samples, 0.54%)__getitem__ (eth/db/backends/level.py:53) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:490) (69 samples, 0.71%)get_node (trie/hexary.py:285) (14 samples, 0.14%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (12 samples, 0.12%)_get (trie/hexary.py:80) (9 samples, 0.09%)get_node (trie/hexary.py:284) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (17 samples, 0.18%)_get_account (eth/db/account.py:334) (350 samples, 3.62%)_get.._get_encoded_account (eth/db/account.py:323) (349 samples, 3.61%)_ge..__getitem__ (eth/db/journal.py:336) (348 samples, 3.60%)__g..__getitem__ (eth/db/cache.py:22) (348 samples, 3.60%)__g..__getitem__ (eth/db/keymap.py:28) (345 samples, 3.57%)__g..__getitem__ (trie/hexary.py:515) (345 samples, 3.57%)__g..get (trie/hexary.py:75) (328 samples, 3.40%)get.._get (trie/hexary.py:87) (328 samples, 3.40%)_ge.._get_branch_node (trie/hexary.py:491) (317 samples, 3.28%)_ge.._get (trie/hexary.py:87) (316 samples, 3.27%)_ge.._get_branch_node (trie/hexary.py:491) (304 samples, 3.15%)_ge.._get (trie/hexary.py:87) (303 samples, 3.14%)_ge.._get_branch_node (trie/hexary.py:491) (280 samples, 2.90%)_g.._get (trie/hexary.py:87) (277 samples, 2.87%)_g.._get_branch_node (trie/hexary.py:491) (241 samples, 2.50%)_g.._get (trie/hexary.py:87) (241 samples, 2.50%)_g.._get_branch_node (trie/hexary.py:491) (162 samples, 1.68%)_get (trie/hexary.py:87) (161 samples, 1.67%)_get_branch_node (trie/hexary.py:491) (108 samples, 1.12%)_get (trie/hexary.py:87) (105 samples, 1.09%)_get_branch_node (trie/hexary.py:491) (36 samples, 0.37%)_get (trie/hexary.py:87) (22 samples, 0.23%)deserialize (rlp/sedes/serializable.py:270) (10 samples, 0.10%)inner (eth_utils/functional.py:45) (10 samples, 0.10%)decode (rlp/codec.py:237) (23 samples, 0.24%)validate_frontier_transaction (eth/vm/forks/frontier/validation.py:16) (499 samples, 5.17%)valida..get_balance (eth/vm/state.py:119) (381 samples, 3.95%)get_..get_balance (eth/db/account.py:217) (381 samples, 3.95%)get_.._get_account (eth/db/account.py:337) (31 samples, 0.32%)__call__ (eth/vm/state.py:262) (701 samples, 7.26%)__call__ (..validate_transaction (eth/vm/forks/frontier/state.py:50) (501 samples, 5.19%)valida..validate_transaction (eth/vm/forks/homestead/state.py:20) (501 samples, 5.19%)valida..validate_homestead_transaction (eth/vm/forks/homestead/validation.py:23) (501 samples, 5.19%)valida.._set_account (eth/db/account.py:346) (16 samples, 0.17%)build_evm_message (eth/vm/forks/frontier/state.py:57) (38 samples, 0.39%)delta_balance (eth/vm/state.py:125) (38 samples, 0.39%)set_balance (eth/vm/state.py:122) (36 samples, 0.37%)set_balance (eth/db/account.py:225) (35 samples, 0.36%)build_evm_message (eth/vm/forks/frontier/state.py:60) (23 samples, 0.24%)increment_nonce (eth/vm/state.py:134) (23 samples, 0.24%)increment_nonce (eth/db/account.py:245) (23 samples, 0.24%)set_nonce (eth/db/account.py:241) (23 samples, 0.24%)get (trie/hexary.py:73) (13 samples, 0.13%)get_node (trie/hexary.py:285) (9 samples, 0.09%)decode_node (trie/utils/nodes.py:83) (9 samples, 0.09%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (11 samples, 0.11%)__getitem__ (eth/db/backends/level.py:53) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:490) (12 samples, 0.12%)get_node (trie/hexary.py:284) (17 samples, 0.18%)__getitem__ (eth/db/batch.py:74) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (30 samples, 0.31%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (12 samples, 0.12%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node (trie/hexary.py:284) (30 samples, 0.31%)__getitem__ (eth/db/batch.py:74) (29 samples, 0.30%)__getitem__ (eth/db/backends/level.py:53) (29 samples, 0.30%)_get_branch_node (trie/hexary.py:490) (51 samples, 0.53%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (20 samples, 0.21%)decode (rlp/codec.py:230) (19 samples, 0.20%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)get_node (trie/hexary.py:284) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (26 samples, 0.27%)__getitem__ (eth/db/backends/level.py:53) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (50 samples, 0.52%)get_node (trie/hexary.py:285) (22 samples, 0.23%)decode_node (trie/utils/nodes.py:83) (22 samples, 0.23%)decode (rlp/codec.py:230) (21 samples, 0.22%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)get_node (trie/hexary.py:284) (19 samples, 0.20%)__getitem__ (eth/db/batch.py:74) (15 samples, 0.16%)__getitem__ (eth/db/backends/level.py:53) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (24 samples, 0.25%)_get (trie/hexary.py:85) (10 samples, 0.10%)_get_account (eth/db/account.py:334) (226 samples, 2.34%)_.._get_encoded_account (eth/db/account.py:323) (224 samples, 2.32%)_..__getitem__ (eth/db/journal.py:336) (224 samples, 2.32%)_..__getitem__ (eth/db/cache.py:22) (224 samples, 2.32%)_..__getitem__ (eth/db/keymap.py:28) (218 samples, 2.26%)_..__getitem__ (trie/hexary.py:515) (218 samples, 2.26%)_..get (trie/hexary.py:75) (203 samples, 2.10%)g.._get (trie/hexary.py:87) (201 samples, 2.08%)_.._get_branch_node (trie/hexary.py:491) (198 samples, 2.05%)_.._get (trie/hexary.py:87) (198 samples, 2.05%)_.._get_branch_node (trie/hexary.py:491) (193 samples, 2.00%)_.._get (trie/hexary.py:87) (193 samples, 2.00%)_.._get_branch_node (trie/hexary.py:491) (181 samples, 1.87%)_.._get (trie/hexary.py:87) (180 samples, 1.86%)_.._get_branch_node (trie/hexary.py:491) (150 samples, 1.55%)_get (trie/hexary.py:87) (149 samples, 1.54%)_get_branch_node (trie/hexary.py:491) (98 samples, 1.01%)_get (trie/hexary.py:87) (97 samples, 1.00%)_get_branch_node (trie/hexary.py:491) (47 samples, 0.49%)_get (trie/hexary.py:87) (46 samples, 0.48%)_get_branch_node (trie/hexary.py:491) (22 samples, 0.23%)_get_account (eth/db/account.py:337) (15 samples, 0.16%)get_code (eth/db/account.py:253) (243 samples, 2.52%)ge..get_code_hash (eth/db/account.py:275) (243 samples, 2.52%)ge..build_evm_message (eth/vm/forks/frontier/state.py:75) (278 samples, 2.88%)bu..get_code (eth/vm/state.py:137) (278 samples, 2.88%)ge..get_code (eth/db/account.py:258) (32 samples, 0.33%)__getitem__ (eth/db/journal.py:336) (31 samples, 0.32%)__getitem__ (eth/db/batch.py:74) (31 samples, 0.32%)__getitem__ (eth/db/backends/level.py:53) (29 samples, 0.30%)build_evm_message (eth/vm/forks/frontier/state.py:77) (12 samples, 0.12%)logger (eth/vm/state.py:64) (12 samples, 0.12%)get_extended_debug_logger (eth_utils/logging.py:83) (11 samples, 0.11%)__call__ (eth/vm/state.py:263) (362 samples, 3.75%)__ca..record (eth/db/account.py:357) (15 samples, 0.16%)record (eth/db/storage.py:220) (15 samples, 0.16%)apply_message (eth/vm/forks/frontier/computation.py:49) (23 samples, 0.24%)snapshot (eth/vm/state.py:164) (22 samples, 0.23%)apply_message (eth/vm/forks/frontier/computation.py:62) (16 samples, 0.17%)delta_balance (eth/vm/state.py:125) (16 samples, 0.17%)set_balance (eth/vm/state.py:122) (15 samples, 0.16%)set_balance (eth/db/account.py:225) (15 samples, 0.16%)__iter__ (eth/vm/code_stream.py:51) (11 samples, 0.11%)__iter__ (eth/vm/code_stream.py:52) (17 samples, 0.18%)apply_computation (eth/vm/computation.py:539) (66 samples, 0.68%)__iter__ (eth/vm/code_stream.py:55) (16 samples, 0.17%)apply_computation (eth/vm/computation.py:541) (10 samples, 0.10%)__call__ (eth/vm/logic/call.py:115) (9 samples, 0.09%)get_code (eth/vm/state.py:137) (9 samples, 0.09%)__call__ (eth/vm/logic/call.py:117) (9 samples, 0.09%)get_code (eth/vm/state.py:137) (9 samples, 0.09%)get_code (eth/db/account.py:258) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)apply_message (eth/vm/forks/frontier/computation.py:49) (13 samples, 0.13%)snapshot (eth/vm/state.py:164) (12 samples, 0.12%)record (eth/db/account.py:357) (11 samples, 0.11%)record (eth/db/storage.py:220) (11 samples, 0.11%)apply_computation (eth/vm/computation.py:539) (32 samples, 0.33%)apply_message (eth/vm/forks/frontier/computation.py:49) (10 samples, 0.10%)snapshot (eth/vm/state.py:164) (10 samples, 0.10%)apply_computation (eth/vm/computation.py:529) (10 samples, 0.10%)__iter__ (eth/vm/code_stream.py:51) (14 samples, 0.14%)apply_computation (eth/vm/computation.py:539) (36 samples, 0.37%)apply_computation (eth/vm/computation.py:541) (9 samples, 0.09%)apply_computation (eth/vm/computation.py:539) (12 samples, 0.12%)apply_computation (eth/vm/computation.py:539) (12 samples, 0.12%)__call__ (eth/vm/logic/call.py:135) (13 samples, 0.13%)apply_child_computation (eth/vm/computation.py:366) (13 samples, 0.13%)generate_child_computation (eth/vm/computation.py:381) (13 samples, 0.13%)apply_message (eth/vm/forks/frontier/computation.py:77) (13 samples, 0.13%)apply_computation (eth/vm/computation.py:554) (11 samples, 0.11%)__call__ (eth/vm/logic/call.py:135) (71 samples, 0.74%)apply_child_computation (eth/vm/computation.py:366) (71 samples, 0.74%)generate_child_computation (eth/vm/computation.py:381) (71 samples, 0.74%)apply_message (eth/vm/forks/frontier/computation.py:77) (65 samples, 0.67%)apply_computation (eth/vm/computation.py:554) (65 samples, 0.67%)wrapped_logic_fn (eth/vm/opcode.py:55) (36 samples, 0.37%)sload (eth/vm/logic/storage.py:60) (17 samples, 0.18%)get_storage (eth/vm/state.py:107) (17 samples, 0.18%)get_storage (eth/db/account.py:146) (16 samples, 0.17%)get (eth/db/storage.py:192) (16 samples, 0.17%)__getitem__ (eth/db/journal.py:336) (16 samples, 0.17%)__getitem__ (eth/db/cache.py:22) (16 samples, 0.17%)__getitem__ (eth/db/storage.py:88) (16 samples, 0.17%)__getitem__ (trie/hexary.py:515) (16 samples, 0.17%)get (trie/hexary.py:75) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (12 samples, 0.12%)wrapped_logic_fn (eth/vm/opcode.py:53) (18 samples, 0.19%)consume_gas (eth/vm/computation.py:254) (16 samples, 0.17%)get_code (eth/db/account.py:253) (9 samples, 0.09%)get_code_hash (eth/db/account.py:275) (9 samples, 0.09%)_get_account (eth/db/account.py:334) (9 samples, 0.09%)_get_encoded_account (eth/db/account.py:323) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)__getitem__ (eth/db/cache.py:22) (9 samples, 0.09%)__getitem__ (eth/db/keymap.py:28) (9 samples, 0.09%)__getitem__ (trie/hexary.py:515) (9 samples, 0.09%)get (trie/hexary.py:75) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)extcodesize (eth/vm/logic/context.py:131) (10 samples, 0.10%)get_code (eth/vm/state.py:137) (10 samples, 0.10%)jumpi (eth/vm/logic/flow.py:32) (10 samples, 0.10%)get_node (trie/hexary.py:284) (13 samples, 0.13%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:490) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:490) (13 samples, 0.13%)get_node (trie/hexary.py:284) (20 samples, 0.21%)__getitem__ (eth/db/backends/level.py:53) (20 samples, 0.21%)_get_branch_node (trie/hexary.py:490) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (9 samples, 0.09%)get (eth/db/storage.py:192) (83 samples, 0.86%)__getitem__ (eth/db/journal.py:336) (81 samples, 0.84%)__getitem__ (eth/db/cache.py:22) (81 samples, 0.84%)__getitem__ (eth/db/storage.py:88) (80 samples, 0.83%)__getitem__ (trie/hexary.py:515) (80 samples, 0.83%)get (trie/hexary.py:75) (76 samples, 0.79%)_get (trie/hexary.py:87) (76 samples, 0.79%)_get_branch_node (trie/hexary.py:491) (58 samples, 0.60%)_get (trie/hexary.py:87) (58 samples, 0.60%)_get_branch_node (trie/hexary.py:491) (45 samples, 0.47%)_get (trie/hexary.py:87) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:491) (21 samples, 0.22%)_get (trie/hexary.py:87) (20 samples, 0.21%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (10 samples, 0.10%)sload (eth/vm/logic/storage.py:60) (90 samples, 0.93%)get_storage (eth/vm/state.py:107) (90 samples, 0.93%)get_storage (eth/db/account.py:146) (88 samples, 0.91%)apply_computation (eth/vm/computation.py:554) (281 samples, 2.91%)ap..wrapped_logic_fn (eth/vm/opcode.py:55) (175 samples, 1.81%)apply_message (eth/vm/forks/frontier/computation.py:77) (300 samples, 3.11%)app..__call__ (eth/vm/logic/call.py:135) (320 samples, 3.31%)__c..apply_child_computation (eth/vm/computation.py:366) (320 samples, 3.31%)app..generate_child_computation (eth/vm/computation.py:381) (320 samples, 3.31%)gen..wrapped_logic_fn (eth/vm/opcode.py:53) (30 samples, 0.31%)consume_gas (eth/vm/computation.py:254) (26 samples, 0.27%)_get_account (eth/db/account.py:334) (12 samples, 0.12%)_get_encoded_account (eth/db/account.py:323) (12 samples, 0.12%)__getitem__ (eth/db/journal.py:336) (12 samples, 0.12%)__getitem__ (eth/db/cache.py:22) (12 samples, 0.12%)__getitem__ (eth/db/keymap.py:28) (12 samples, 0.12%)__getitem__ (trie/hexary.py:515) (12 samples, 0.12%)get (trie/hexary.py:75) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)get_code (eth/db/account.py:253) (14 samples, 0.14%)get_code_hash (eth/db/account.py:275) (14 samples, 0.14%)extcodesize (eth/vm/logic/context.py:131) (22 samples, 0.23%)get_code (eth/vm/state.py:137) (22 samples, 0.23%)jumpi (eth/vm/logic/flow.py:42) (9 samples, 0.09%)mload (eth/vm/logic/memory.py:31) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:13) (16 samples, 0.17%)memory_write (eth/vm/computation.py:239) (16 samples, 0.17%)get (trie/hexary.py:73) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)get_node (trie/hexary.py:284) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:490) (19 samples, 0.20%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)get_node (trie/hexary.py:284) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get_node (trie/hexary.py:284) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get (eth/db/storage.py:192) (94 samples, 0.97%)__getitem__ (eth/db/journal.py:336) (94 samples, 0.97%)__getitem__ (eth/db/cache.py:22) (93 samples, 0.96%)__getitem__ (eth/db/storage.py:88) (89 samples, 0.92%)__getitem__ (trie/hexary.py:515) (89 samples, 0.92%)get (trie/hexary.py:75) (78 samples, 0.81%)_get (trie/hexary.py:87) (78 samples, 0.81%)_get_branch_node (trie/hexary.py:491) (59 samples, 0.61%)_get (trie/hexary.py:87) (58 samples, 0.60%)_get_branch_node (trie/hexary.py:491) (42 samples, 0.43%)_get (trie/hexary.py:87) (37 samples, 0.38%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)sload (eth/vm/logic/storage.py:60) (100 samples, 1.04%)get_storage (eth/vm/state.py:107) (100 samples, 1.04%)get_storage (eth/db/account.py:146) (100 samples, 1.04%)apply_message (eth/vm/forks/frontier/computation.py:77) (641 samples, 6.64%)apply_mes..apply_computation (eth/vm/computation.py:554) (623 samples, 6.45%)apply_co..wrapped_logic_fn (eth/vm/opcode.py:55) (249 samples, 2.58%)wr..__call__ (eth/vm/logic/call.py:135) (660 samples, 6.84%)__call__ ..apply_child_computation (eth/vm/computation.py:366) (660 samples, 6.84%)apply_chi..generate_child_computation (eth/vm/computation.py:381) (659 samples, 6.82%)generate_..__call__ (eth/vm/logic/call.py:86) (9 samples, 0.09%)compute_msg_gas (eth/vm/logic/call.py:285) (9 samples, 0.09%)sstore (eth/vm/logic/storage.py:16) (9 samples, 0.09%)get_storage (eth/vm/state.py:107) (9 samples, 0.09%)get_storage (eth/db/account.py:146) (9 samples, 0.09%)get (eth/db/storage.py:192) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)inner (eth/vm/forks/byzantium/opcodes.py:42) (12 samples, 0.12%)consume_gas (eth/vm/gas_meter.py:66) (13 samples, 0.13%)consume_gas (eth/vm/gas_meter.py:68) (11 samples, 0.11%)wrapped_logic_fn (eth/vm/opcode.py:53) (57 samples, 0.59%)consume_gas (eth/vm/computation.py:254) (49 samples, 0.51%)dup_XX (eth/vm/logic/duplication.py:10) (21 samples, 0.22%)stack_dup (eth/vm/computation.py:290) (18 samples, 0.19%)extcodesize (eth/vm/logic/context.py:131) (17 samples, 0.18%)get_code (eth/vm/state.py:137) (17 samples, 0.18%)get_code (eth/db/account.py:258) (9 samples, 0.09%)__getitem__ (eth/db/journal.py:336) (9 samples, 0.09%)__getitem__ (eth/db/batch.py:74) (9 samples, 0.09%)jump (eth/vm/logic/flow.py:27) (13 samples, 0.13%)jumpi (eth/vm/logic/flow.py:32) (13 samples, 0.13%)jumpi (eth/vm/logic/flow.py:42) (21 samples, 0.22%)is_valid_opcode (eth/vm/code_stream.py:99) (15 samples, 0.16%)mload (eth/vm/logic/memory.py:31) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:11) (27 samples, 0.28%)mstore (eth/vm/logic/memory.py:13) (20 samples, 0.21%)memory_write (eth/vm/computation.py:239) (19 samples, 0.20%)push_XX (eth/vm/logic/stack.py:11) (13 samples, 0.13%)push_XX (eth/vm/logic/stack.py:19) (16 samples, 0.17%)get (trie/hexary.py:73) (9 samples, 0.09%)get_node (trie/hexary.py:284) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (21 samples, 0.22%)get_node (trie/hexary.py:284) (21 samples, 0.22%)__getitem__ (eth/db/backends/level.py:53) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:490) (32 samples, 0.33%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (11 samples, 0.11%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:490) (21 samples, 0.22%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:490) (23 samples, 0.24%)get_node (trie/hexary.py:285) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (9 samples, 0.09%)get (eth/db/storage.py:192) (147 samples, 1.52%)__getitem__ (eth/db/journal.py:336) (147 samples, 1.52%)__getitem__ (eth/db/cache.py:22) (146 samples, 1.51%)__getitem__ (eth/db/storage.py:88) (143 samples, 1.48%)__getitem__ (trie/hexary.py:515) (142 samples, 1.47%)get (trie/hexary.py:75) (132 samples, 1.37%)_get (trie/hexary.py:87) (131 samples, 1.36%)_get_branch_node (trie/hexary.py:491) (109 samples, 1.13%)_get (trie/hexary.py:87) (109 samples, 1.13%)_get_branch_node (trie/hexary.py:491) (76 samples, 0.79%)_get (trie/hexary.py:87) (73 samples, 0.76%)_get_branch_node (trie/hexary.py:491) (52 samples, 0.54%)_get (trie/hexary.py:87) (48 samples, 0.50%)_get_branch_node (trie/hexary.py:491) (25 samples, 0.26%)_get (trie/hexary.py:87) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:491) (15 samples, 0.16%)_get (trie/hexary.py:87) (12 samples, 0.12%)sload (eth/vm/logic/storage.py:60) (161 samples, 1.67%)get_storage (eth/vm/state.py:107) (161 samples, 1.67%)get_storage (eth/db/account.py:146) (154 samples, 1.59%)apply_message (eth/vm/forks/frontier/computation.py:77) (1,324 samples, 13.71%)apply_message (eth/v..apply_computation (eth/vm/computation.py:554) (1,267 samples, 13.12%)apply_computation (..wrapped_logic_fn (eth/vm/opcode.py:55) (467 samples, 4.84%)wrappe..apply_child_computation (eth/vm/computation.py:366) (1,357 samples, 14.05%)apply_child_computati..generate_child_computation (eth/vm/computation.py:381) (1,357 samples, 14.05%)generate_child_comput..apply_message (eth/vm/forks/frontier/computation.py:83) (13 samples, 0.13%)commit (eth/vm/state.py:176) (13 samples, 0.13%)commit (eth/db/account.py:371) (12 samples, 0.12%)__call__ (eth/vm/logic/call.py:135) (1,358 samples, 14.06%)__call__ (eth/vm/logi..compute_msg_extra_gas (eth/vm/logic/call.py:368) (14 samples, 0.14%)account_exists (eth/vm/state.py:152) (14 samples, 0.14%)account_exists (eth/db/account.py:304) (14 samples, 0.14%)_get_encoded_account (eth/db/account.py:323) (14 samples, 0.14%)__getitem__ (eth/db/journal.py:336) (13 samples, 0.13%)__getitem__ (eth/db/cache.py:22) (13 samples, 0.13%)__getitem__ (eth/db/keymap.py:28) (13 samples, 0.13%)__getitem__ (trie/hexary.py:515) (13 samples, 0.13%)get (trie/hexary.py:75) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (11 samples, 0.11%)_get (trie/hexary.py:87) (11 samples, 0.11%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)compute_msg_gas (eth/vm/logic/call.py:285) (16 samples, 0.17%)__call__ (eth/vm/logic/call.py:86) (17 samples, 0.18%)get_node (trie/hexary.py:284) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (11 samples, 0.11%)get (eth/db/storage.py:192) (28 samples, 0.29%)__getitem__ (eth/db/journal.py:336) (28 samples, 0.29%)__getitem__ (eth/db/cache.py:22) (28 samples, 0.29%)__getitem__ (eth/db/storage.py:88) (28 samples, 0.29%)__getitem__ (trie/hexary.py:515) (28 samples, 0.29%)get (trie/hexary.py:75) (28 samples, 0.29%)_get (trie/hexary.py:87) (28 samples, 0.29%)_get_branch_node (trie/hexary.py:491) (23 samples, 0.24%)_get (trie/hexary.py:87) (23 samples, 0.24%)_get_branch_node (trie/hexary.py:491) (21 samples, 0.22%)_get (trie/hexary.py:87) (21 samples, 0.22%)_get_branch_node (trie/hexary.py:491) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)sstore (eth/vm/logic/storage.py:16) (29 samples, 0.30%)get_storage (eth/vm/state.py:107) (29 samples, 0.30%)get_storage (eth/db/account.py:146) (29 samples, 0.30%)inner (eth/vm/forks/byzantium/opcodes.py:42) (39 samples, 0.40%)consume_gas (eth/vm/gas_meter.py:66) (12 samples, 0.12%)wrapped_logic_fn (eth/vm/opcode.py:53) (52 samples, 0.54%)consume_gas (eth/vm/computation.py:254) (41 samples, 0.42%)add (eth/vm/logic/arithmetic.py:20) (13 samples, 0.13%)dup_XX (eth/vm/logic/duplication.py:10) (14 samples, 0.14%)stack_dup (eth/vm/computation.py:290) (13 samples, 0.13%)_get_account (eth/db/account.py:334) (22 samples, 0.23%)_get_encoded_account (eth/db/account.py:323) (22 samples, 0.23%)__getitem__ (eth/db/journal.py:336) (22 samples, 0.23%)__getitem__ (eth/db/cache.py:22) (21 samples, 0.22%)__getitem__ (eth/db/keymap.py:28) (21 samples, 0.22%)__getitem__ (trie/hexary.py:515) (21 samples, 0.22%)get (trie/hexary.py:75) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)get_code (eth/db/account.py:253) (29 samples, 0.30%)get_code_hash (eth/db/account.py:275) (29 samples, 0.30%)extcodesize (eth/vm/logic/context.py:131) (43 samples, 0.45%)get_code (eth/vm/state.py:137) (43 samples, 0.45%)get_code (eth/db/account.py:258) (14 samples, 0.14%)__getitem__ (eth/db/journal.py:336) (12 samples, 0.12%)__getitem__ (eth/db/batch.py:74) (12 samples, 0.12%)__getitem__ (eth/db/backends/level.py:53) (11 samples, 0.11%)inner (eth/vm/forks/byzantium/opcodes.py:42) (9 samples, 0.09%)jump (eth/vm/logic/flow.py:27) (11 samples, 0.11%)jumpi (eth/vm/logic/flow.py:32) (10 samples, 0.10%)jumpi (eth/vm/logic/flow.py:42) (17 samples, 0.18%)mstore (eth/vm/logic/memory.py:11) (18 samples, 0.19%)mstore (eth/vm/logic/memory.py:13) (16 samples, 0.17%)memory_write (eth/vm/computation.py:239) (16 samples, 0.17%)push_XX (eth/vm/logic/stack.py:11) (13 samples, 0.13%)push_XX (eth/vm/logic/stack.py:19) (12 samples, 0.12%)get (trie/hexary.py:73) (21 samples, 0.22%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)decode (rlp/codec.py:230) (10 samples, 0.10%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (14 samples, 0.14%)_get_branch_node (trie/hexary.py:490) (27 samples, 0.28%)get_node (trie/hexary.py:285) (13 samples, 0.13%)decode_node (trie/utils/nodes.py:83) (13 samples, 0.13%)decode (rlp/codec.py:230) (11 samples, 0.11%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)__getitem__ (eth/db/backends/level.py:53) (44 samples, 0.46%)get_node (trie/hexary.py:284) (45 samples, 0.47%)_get_branch_node (trie/hexary.py:490) (56 samples, 0.58%)get_node (trie/hexary.py:285) (11 samples, 0.11%)decode_node (trie/utils/nodes.py:83) (11 samples, 0.11%)decode (rlp/codec.py:230) (9 samples, 0.09%)consume_item (rlp/codec.py:206) (9 samples, 0.09%)get_node (trie/hexary.py:284) (50 samples, 0.52%)__getitem__ (eth/db/backends/level.py:53) (50 samples, 0.52%)_get_branch_node (trie/hexary.py:490) (72 samples, 0.75%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (15 samples, 0.16%)decode (rlp/codec.py:230) (15 samples, 0.16%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node (trie/hexary.py:284) (38 samples, 0.39%)__getitem__ (eth/db/backends/level.py:53) (38 samples, 0.39%)_get_branch_node (trie/hexary.py:490) (61 samples, 0.63%)get_node (trie/hexary.py:285) (21 samples, 0.22%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (16 samples, 0.17%)consume_item (rlp/codec.py:206) (12 samples, 0.12%)get_node (trie/hexary.py:284) (25 samples, 0.26%)__getitem__ (eth/db/backends/level.py:53) (24 samples, 0.25%)_get_branch_node (trie/hexary.py:490) (27 samples, 0.28%)__getitem__ (eth/db/cache.py:22) (310 samples, 3.21%)__g..__getitem__ (eth/db/storage.py:88) (303 samples, 3.14%)__g..__getitem__ (trie/hexary.py:515) (303 samples, 3.14%)__g..get (trie/hexary.py:75) (277 samples, 2.87%)ge.._get (trie/hexary.py:87) (276 samples, 2.86%)_g.._get_branch_node (trie/hexary.py:491) (249 samples, 2.58%)_g.._get (trie/hexary.py:87) (248 samples, 2.57%)_g.._get_branch_node (trie/hexary.py:491) (191 samples, 1.98%)_.._get (trie/hexary.py:87) (186 samples, 1.93%)_.._get_branch_node (trie/hexary.py:491) (113 samples, 1.17%)_get (trie/hexary.py:87) (112 samples, 1.16%)_get_branch_node (trie/hexary.py:491) (51 samples, 0.53%)_get (trie/hexary.py:87) (39 samples, 0.40%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)get (eth/db/storage.py:192) (311 samples, 3.22%)get..__getitem__ (eth/db/journal.py:336) (311 samples, 3.22%)__g..sload (eth/vm/logic/storage.py:60) (317 samples, 3.28%)slo..get_storage (eth/vm/state.py:107) (317 samples, 3.28%)get..get_storage (eth/db/account.py:146) (316 samples, 3.27%)get..apply_computation (eth/vm/computation.py:554) (2,146 samples, 22.22%)apply_computation (eth/vm/computati..wrapped_logic_fn (eth/vm/opcode.py:55) (628 samples, 6.50%)wrapped_..apply_message (eth/vm/forks/frontier/computation.py:77) (2,191 samples, 22.69%)apply_message (eth/vm/forks/frontie..commit (eth/db/storage.py:233) (12 samples, 0.12%)has_checkpoint (eth/db/journal.py:389) (10 samples, 0.10%)__call__ (eth/vm/logic/call.py:135) (2,251 samples, 23.31%)__call__ (eth/vm/logic/call.py:135)apply_child_computation (eth/vm/computation.py:366) (2,251 samples, 23.31%)apply_child_computation (eth/vm/comp..generate_child_computation (eth/vm/computation.py:381) (2,251 samples, 23.31%)generate_child_computation (eth/vm/c..apply_message (eth/vm/forks/frontier/computation.py:83) (30 samples, 0.31%)commit (eth/vm/state.py:176) (30 samples, 0.31%)commit (eth/db/account.py:371) (28 samples, 0.29%)commit (eth/db/storage.py:234) (15 samples, 0.16%)account_exists (eth/db/account.py:304) (18 samples, 0.19%)_get_encoded_account (eth/db/account.py:323) (18 samples, 0.19%)__getitem__ (eth/db/journal.py:336) (18 samples, 0.19%)__getitem__ (eth/db/cache.py:22) (18 samples, 0.19%)__getitem__ (eth/db/keymap.py:28) (18 samples, 0.19%)__getitem__ (trie/hexary.py:515) (18 samples, 0.19%)get (trie/hexary.py:75) (18 samples, 0.19%)_get (trie/hexary.py:87) (18 samples, 0.19%)_get_branch_node (trie/hexary.py:491) (16 samples, 0.17%)_get (trie/hexary.py:87) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:491) (16 samples, 0.17%)_get (trie/hexary.py:87) (16 samples, 0.17%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (14 samples, 0.14%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)_get (trie/hexary.py:87) (9 samples, 0.09%)compute_msg_extra_gas (eth/vm/logic/call.py:368) (19 samples, 0.20%)account_exists (eth/vm/state.py:152) (19 samples, 0.20%)__call__ (eth/vm/logic/call.py:86) (29 samples, 0.30%)compute_msg_gas (eth/vm/logic/call.py:285) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:490) (10 samples, 0.10%)__getitem__ (eth/db/cache.py:22) (34 samples, 0.35%)__getitem__ (eth/db/storage.py:88) (34 samples, 0.35%)__getitem__ (trie/hexary.py:515) (34 samples, 0.35%)get (trie/hexary.py:75) (30 samples, 0.31%)_get (trie/hexary.py:87) (30 samples, 0.31%)_get_branch_node (trie/hexary.py:491) (27 samples, 0.28%)_get (trie/hexary.py:87) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:491) (20 samples, 0.21%)_get (trie/hexary.py:87) (19 samples, 0.20%)_get_branch_node (trie/hexary.py:491) (9 samples, 0.09%)get (eth/db/storage.py:192) (37 samples, 0.38%)__getitem__ (eth/db/journal.py:336) (36 samples, 0.37%)sstore (eth/vm/logic/storage.py:16) (43 samples, 0.45%)get_storage (eth/vm/state.py:107) (42 samples, 0.43%)get_storage (eth/db/account.py:146) (41 samples, 0.42%)set (eth/db/storage.py:206) (11 samples, 0.11%)inner (eth/vm/forks/byzantium/opcodes.py:42) (71 samples, 0.74%)sstore (eth/vm/logic/storage.py:51) (19 samples, 0.20%)set_storage (eth/vm/state.py:110) (19 samples, 0.20%)set_storage (eth/db/account.py:155) (18 samples, 0.19%)wrapped_logic_fn (eth/vm/opcode.py:51) (16 samples, 0.17%)consume_gas (eth/vm/gas_meter.py:59) (11 samples, 0.11%)consume_gas (eth/vm/gas_meter.py:66) (16 samples, 0.17%)consume_gas (eth/vm/gas_meter.py:68) (18 samples, 0.19%)wrapped_logic_fn (eth/vm/opcode.py:53) (100 samples, 1.04%)consume_gas (eth/vm/computation.py:254) (87 samples, 0.90%)and_op (eth/vm/logic/comparison.py:105) (15 samples, 0.16%)dup_XX (eth/vm/logic/duplication.py:10) (30 samples, 0.31%)stack_dup (eth/vm/computation.py:290) (20 samples, 0.21%)eq (eth/vm/logic/comparison.py:77) (9 samples, 0.09%)_get_account (eth/db/account.py:334) (21 samples, 0.22%)_get_encoded_account (eth/db/account.py:323) (21 samples, 0.22%)__getitem__ (eth/db/journal.py:336) (21 samples, 0.22%)__getitem__ (eth/db/cache.py:22) (21 samples, 0.22%)__getitem__ (eth/db/keymap.py:28) (20 samples, 0.21%)__getitem__ (trie/hexary.py:515) (20 samples, 0.21%)get (trie/hexary.py:75) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (15 samples, 0.16%)_get (trie/hexary.py:87) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:491) (13 samples, 0.13%)_get (trie/hexary.py:87) (13 samples, 0.13%)_get_branch_node (trie/hexary.py:491) (12 samples, 0.12%)_get (trie/hexary.py:87) (12 samples, 0.12%)get_code (eth/db/account.py:253) (26 samples, 0.27%)get_code_hash (eth/db/account.py:275) (26 samples, 0.27%)extcodesize (eth/vm/logic/context.py:131) (55 samples, 0.57%)get_code (eth/vm/state.py:137) (55 samples, 0.57%)get_code (eth/db/account.py:258) (29 samples, 0.30%)__getitem__ (eth/db/journal.py:336) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (26 samples, 0.27%)__getitem__ (eth/db/backends/level.py:53) (25 samples, 0.26%)jump (eth/vm/logic/flow.py:27) (25 samples, 0.26%)is_valid_opcode (eth/vm/code_stream.py:99) (22 samples, 0.23%)jumpi (eth/vm/logic/flow.py:32) (20 samples, 0.21%)is_valid_opcode (eth/vm/code_stream.py:101) (9 samples, 0.09%)jumpi (eth/vm/logic/flow.py:42) (31 samples, 0.32%)is_valid_opcode (eth/vm/code_stream.py:99) (18 samples, 0.19%)mload (eth/vm/logic/memory.py:31) (18 samples, 0.19%)mstore (eth/vm/logic/memory.py:11) (31 samples, 0.32%)write (eth/vm/memory.py:55) (11 samples, 0.11%)mstore (eth/vm/logic/memory.py:13) (41 samples, 0.42%)memory_write (eth/vm/computation.py:239) (40 samples, 0.41%)write (eth/vm/memory.py:56) (10 samples, 0.10%)mstore (eth/vm/logic/memory.py:5) (9 samples, 0.09%)push_XX (eth/vm/logic/stack.py:11) (21 samples, 0.22%)push_bytes (eth/vm/stack.py:69) (11 samples, 0.11%)push_XX (eth/vm/logic/stack.py:19) (38 samples, 0.39%)push_bytes (eth/vm/stack.py:71) (10 samples, 0.10%)sha3 (eth/vm/logic/sha3.py:13) (9 samples, 0.09%)get_node (trie/hexary.py:284) (18 samples, 0.19%)__getitem__ (eth/db/backends/level.py:53) (17 samples, 0.18%)consume_payload (rlp/codec.py:179) (10 samples, 0.10%)get (trie/hexary.py:73) (50 samples, 0.52%)get_node (trie/hexary.py:285) (31 samples, 0.32%)decode_node (trie/utils/nodes.py:83) (29 samples, 0.30%)decode (rlp/codec.py:230) (29 samples, 0.30%)consume_item (rlp/codec.py:206) (25 samples, 0.26%)get_node (trie/hexary.py:284) (74 samples, 0.77%)__getitem__ (eth/db/backends/level.py:53) (74 samples, 0.77%)consume_payload (rlp/codec.py:179) (11 samples, 0.11%)decode (rlp/codec.py:230) (34 samples, 0.35%)consume_item (rlp/codec.py:206) (27 samples, 0.28%)_get_branch_node (trie/hexary.py:490) (115 samples, 1.19%)get_node (trie/hexary.py:285) (40 samples, 0.41%)decode_node (trie/utils/nodes.py:83) (37 samples, 0.38%)get_node (trie/hexary.py:284) (105 samples, 1.09%)__getitem__ (eth/db/backends/level.py:53) (105 samples, 1.09%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)decode (rlp/codec.py:230) (36 samples, 0.37%)consume_item (rlp/codec.py:206) (31 samples, 0.32%)_get_branch_node (trie/hexary.py:490) (150 samples, 1.55%)get_node (trie/hexary.py:285) (45 samples, 0.47%)decode_node (trie/utils/nodes.py:83) (42 samples, 0.43%)__getitem__ (eth/db/backends/level.py:53) (108 samples, 1.12%)get_node (trie/hexary.py:284) (112 samples, 1.16%)consume_item (rlp/codec.py:205) (12 samples, 0.12%)consume_payload (rlp/codec.py:178) (14 samples, 0.14%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)decode (rlp/codec.py:230) (54 samples, 0.56%)consume_item (rlp/codec.py:206) (42 samples, 0.43%)_get_branch_node (trie/hexary.py:490) (178 samples, 1.84%)_..get_node (trie/hexary.py:285) (65 samples, 0.67%)decode_node (trie/utils/nodes.py:83) (60 samples, 0.62%)__getitem__ (eth/db/backends/level.py:53) (120 samples, 1.24%)get_node (trie/hexary.py:284) (121 samples, 1.25%)consume_item (rlp/codec.py:205) (12 samples, 0.12%)consume_payload (rlp/codec.py:179) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (179 samples, 1.85%)_..get_node (trie/hexary.py:285) (57 samples, 0.59%)decode_node (trie/utils/nodes.py:83) (54 samples, 0.56%)decode (rlp/codec.py:230) (51 samples, 0.53%)consume_item (rlp/codec.py:206) (39 samples, 0.40%)_get (trie/hexary.py:80) (10 samples, 0.10%)get_node_type (trie/utils/nodes.py:42) (10 samples, 0.10%)get_node (trie/hexary.py:284) (59 samples, 0.61%)__getitem__ (eth/db/backends/level.py:53) (59 samples, 0.61%)_get_branch_node (trie/hexary.py:490) (75 samples, 0.78%)get_node (trie/hexary.py:285) (16 samples, 0.17%)decode_node (trie/utils/nodes.py:83) (14 samples, 0.14%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (10 samples, 0.10%)get_node_type (trie/utils/nodes.py:42) (13 samples, 0.13%)_get (trie/hexary.py:80) (14 samples, 0.14%)_get (trie/hexary.py:85) (13 samples, 0.13%)get_node (trie/hexary.py:284) (15 samples, 0.16%)__getitem__ (eth/db/backends/level.py:53) (15 samples, 0.16%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get (eth/db/storage.py:192) (884 samples, 9.15%)get (eth/db/s..__getitem__ (eth/db/journal.py:336) (882 samples, 9.13%)__getitem__ (..__getitem__ (eth/db/cache.py:22) (880 samples, 9.11%)__getitem__ (..__getitem__ (eth/db/storage.py:88) (870 samples, 9.01%)__getitem__ ..__getitem__ (trie/hexary.py:515) (870 samples, 9.01%)__getitem__ ..get (trie/hexary.py:75) (809 samples, 8.38%)get (trie/h.._get (trie/hexary.py:87) (807 samples, 8.36%)_get (trie/.._get_branch_node (trie/hexary.py:491) (691 samples, 7.16%)_get_branc.._get (trie/hexary.py:87) (688 samples, 7.13%)_get (tri.._get_branch_node (trie/hexary.py:491) (535 samples, 5.54%)_get_br.._get (trie/hexary.py:87) (517 samples, 5.35%)_get (.._get_branch_node (trie/hexary.py:491) (337 samples, 3.49%)_ge.._get (trie/hexary.py:87) (328 samples, 3.40%)_ge.._get_branch_node (trie/hexary.py:491) (147 samples, 1.52%)_get (trie/hexary.py:87) (128 samples, 1.33%)_get_branch_node (trie/hexary.py:491) (53 samples, 0.55%)_get (trie/hexary.py:87) (23 samples, 0.24%)sload (eth/vm/logic/storage.py:60) (913 samples, 9.46%)sload (eth/vm..get_storage (eth/vm/state.py:107) (912 samples, 9.44%)get_storage (..get_storage (eth/db/account.py:146) (905 samples, 9.37%)get_storage (..get (eth/db/storage.py:201) (16 samples, 0.17%)swap_XX (eth/vm/logic/swap.py:10) (11 samples, 0.11%)stack_swap (eth/vm/computation.py:287) (10 samples, 0.10%)apply_message (eth/vm/forks/frontier/computation.py:77) (4,128 samples, 42.75%)apply_message (eth/vm/forks/frontier/computation.py:77)apply_computation (eth/vm/computation.py:554) (4,043 samples, 41.87%)apply_computation (eth/vm/computation.py:554)wrapped_logic_fn (eth/vm/opcode.py:55) (1,469 samples, 15.21%)wrapped_logic_fn (eth/v..commit (eth/db/storage.py:233) (15 samples, 0.16%)has_checkpoint (eth/db/journal.py:389) (12 samples, 0.12%)has_checkpoint (eth/db/journal.py:117) (11 samples, 0.11%)commit (eth/db/storage.py:234) (11 samples, 0.11%)apply_message (eth/vm/forks/frontier/computation.py:83) (37 samples, 0.38%)commit (eth/vm/state.py:176) (37 samples, 0.38%)commit (eth/db/account.py:371) (29 samples, 0.30%)__call__ (eth/vm/state.py:264) (4,246 samples, 43.97%)__call__ (eth/vm/state.py:264)build_computation (eth/vm/forks/frontier/state.py:133) (4,235 samples, 43.86%)build_computation (eth/vm/forks/frontier/state.py:133)finalize_computation (eth/vm/forks/frontier/state.py:159) (21 samples, 0.22%)delta_balance (eth/vm/state.py:125) (21 samples, 0.22%)set_balance (eth/vm/state.py:122) (20 samples, 0.21%)set_balance (eth/db/account.py:225) (18 samples, 0.19%)finalize_computation (eth/vm/forks/frontier/state.py:169) (27 samples, 0.28%)delta_balance (eth/vm/state.py:125) (26 samples, 0.27%)set_balance (eth/vm/state.py:122) (23 samples, 0.24%)set_balance (eth/db/account.py:225) (23 samples, 0.24%)finalize_computation (eth/vm/forks/spurious_dragon/state.py:25) (87 samples, 0.90%)apply_transaction (eth/vm/base.py:151) (5,403 samples, 55.95%)apply_transaction (eth/vm/base.py:151)apply_transaction (eth/vm/forks/frontier/state.py:193) (5,401 samples, 55.93%)apply_transaction (eth/vm/forks/frontier/state.py:193)__call__ (eth/vm/state.py:265) (92 samples, 0.95%)add (eth_bloom/bloom.py:47) (11 samples, 0.11%)__init__ (eth/rlp/receipts.py:39) (19 samples, 0.20%)from_iterable (eth_bloom/bloom.py:57) (18 samples, 0.19%)extend (eth_bloom/bloom.py:52) (13 samples, 0.13%)make_receipt (eth/vm/forks/byzantium/__init__.py:110) (40 samples, 0.41%)make_frontier_receipt (eth/vm/forks/frontier/__init__.py:61) (30 samples, 0.31%)_deepcopy_tuple (copy.py:220) (15 samples, 0.16%)<listcomp> (copy.py:220) (15 samples, 0.16%)deepcopy (copy.py:161) (13 samples, 0.13%)__deepcopy__ (rlp/sedes/serializable.py:295) (13 samples, 0.13%)<dictcomp> (rlp/sedes/serializable.py:285) (17 samples, 0.18%)deepcopy (copy.py:150) (17 samples, 0.18%)copy (rlp/sedes/serializable.py:284) (20 samples, 0.21%)apply_transaction (eth/vm/base.py:152) (73 samples, 0.76%)make_receipt (eth/vm/forks/byzantium/__init__.py:117) (33 samples, 0.34%)validate_receipt (eth/vm/forks/byzantium/__init__.py:79) (9 samples, 0.09%)apply_all_transactions (eth/vm/base.py:230) (5,489 samples, 56.85%)apply_all_transactions (eth/vm/base.py:230)apply_transaction (eth/vm/base.py:153) (10 samples, 0.10%)add_receipt_to_header (eth/vm/forks/byzantium/__init__.py:100) (24 samples, 0.25%)copy (rlp/sedes/serializable.py:289) (9 samples, 0.09%)import_block (eth/vm/base.py:277) (5,542 samples, 57.39%)import_block (eth/vm/base.py:277)apply_all_transactions (eth/vm/base.py:235) (25 samples, 0.26%)_set (trie/hexary.py:122) (14 samples, 0.14%)_set_branch_node (trie/hexary.py:425) (17 samples, 0.18%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (10 samples, 0.10%)_persist_node (trie/hexary.py:317) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_set (trie/hexary.py:122) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:426) (14 samples, 0.14%)set (trie/hexary.py:104) (35 samples, 0.36%)_create_node_to_db_mapping (trie/hexary.py:309) (10 samples, 0.10%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (10 samples, 0.10%)set_block_transactions (eth/vm/base.py:310) (63 samples, 0.65%)make_trie_root_and_nodes (eth/db/trie.py:24) (63 samples, 0.65%)_make_trie_root_and_nodes (eth/db/trie.py:38) (62 samples, 0.64%)__setitem__ (trie/hexary.py:518) (61 samples, 0.63%)set (trie/hexary.py:108) (18 samples, 0.19%)_set_root_node (trie/hexary.py:273) (13 samples, 0.13%)_set_raw_node (trie/hexary.py:249) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (12 samples, 0.12%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (9 samples, 0.09%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)<genexpr> (eth/db/trie.py:24) (17 samples, 0.18%)encode (rlp/codec.py:67) (12 samples, 0.12%)encode_raw (rlp/codec.py:81) (12 samples, 0.12%)<genexpr> (rlp/codec.py:81) (12 samples, 0.12%)_set_branch_node (trie/hexary.py:423) (9 samples, 0.09%)_set (trie/hexary.py:122) (9 samples, 0.09%)_set_branch_node (trie/hexary.py:425) (13 samples, 0.13%)_set (trie/hexary.py:122) (19 samples, 0.20%)_set_branch_node (trie/hexary.py:425) (23 samples, 0.24%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (18 samples, 0.19%)_persist_node (trie/hexary.py:317) (21 samples, 0.22%)_node_to_db_mapping (trie/hexary.py:295) (21 samples, 0.22%)set (trie/hexary.py:104) (57 samples, 0.59%)_set (trie/hexary.py:122) (54 samples, 0.56%)_set_branch_node (trie/hexary.py:426) (22 samples, 0.23%)set (trie/hexary.py:108) (10 samples, 0.10%)set_block_transactions (eth/vm/base.py:313) (91 samples, 0.94%)make_trie_root_and_nodes (eth/db/trie.py:24) (91 samples, 0.94%)_make_trie_root_and_nodes (eth/db/trie.py:38) (74 samples, 0.77%)__setitem__ (trie/hexary.py:518) (74 samples, 0.77%)import_block (eth/vm/base.py:289) (156 samples, 1.62%)mine_block (eth/vm/base.py:295) (17 samples, 0.18%)pack_block (eth/vm/base.py:384) (17 samples, 0.18%)copy (rlp/sedes/serializable.py:284) (17 samples, 0.18%)<dictcomp> (rlp/sedes/serializable.py:285) (17 samples, 0.18%)deepcopy (copy.py:150) (17 samples, 0.18%)_deepcopy_tuple (copy.py:220) (17 samples, 0.18%)<listcomp> (copy.py:220) (17 samples, 0.18%)deepcopy (copy.py:161) (17 samples, 0.18%)__deepcopy__ (rlp/sedes/serializable.py:295) (17 samples, 0.18%)persist (eth/db/journal.py:413) (13 samples, 0.13%)pop_all (eth/db/journal.py:224) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:369) (11 samples, 0.11%)get_node (trie/hexary.py:284) (14 samples, 0.14%)__getitem__ (eth/db/batch.py:74) (14 samples, 0.14%)__getitem__ (eth/db/backends/level.py:53) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:369) (19 samples, 0.20%)get_node (trie/hexary.py:284) (26 samples, 0.27%)__getitem__ (eth/db/batch.py:74) (25 samples, 0.26%)__getitem__ (eth/db/backends/level.py:53) (25 samples, 0.26%)_delete_branch_node (trie/hexary.py:369) (35 samples, 0.36%)get_node (trie/hexary.py:285) (9 samples, 0.09%)decode_node (trie/utils/nodes.py:83) (9 samples, 0.09%)decode (rlp/codec.py:230) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_delete (trie/hexary.py:151) (11 samples, 0.11%)__enter__ (contextlib.py:112) (11 samples, 0.11%)_prune_node (trie/hexary.py:237) (11 samples, 0.11%)_node_to_db_mapping (trie/hexary.py:295) (10 samples, 0.10%)get_node (trie/hexary.py:284) (13 samples, 0.13%)__getitem__ (eth/db/batch.py:74) (10 samples, 0.10%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)_delete_branch_node (trie/hexary.py:369) (18 samples, 0.19%)_delete (trie/hexary.py:158) (20 samples, 0.21%)_delete_branch_node (trie/hexary.py:379) (9 samples, 0.09%)_delete_branch_node (trie/hexary.py:371) (38 samples, 0.39%)_delete (trie/hexary.py:158) (49 samples, 0.51%)_delete_branch_node (trie/hexary.py:371) (60 samples, 0.62%)_delete (trie/hexary.py:158) (87 samples, 0.90%)_delete_branch_node (trie/hexary.py:371) (101 samples, 1.05%)_delete_branch_node (trie/hexary.py:372) (9 samples, 0.09%)_persist_node (trie/hexary.py:317) (9 samples, 0.09%)_node_to_db_mapping (trie/hexary.py:295) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_delete (trie/hexary.py:158) (146 samples, 1.51%)_delete_branch_node (trie/hexary.py:371) (159 samples, 1.65%)_persist_node (trie/hexary.py:317) (9 samples, 0.09%)_node_to_db_mapping (trie/hexary.py:295) (9 samples, 0.09%)_delete (trie/hexary.py:158) (189 samples, 1.96%)_.._delete_branch_node (trie/hexary.py:372) (11 samples, 0.11%)_delete_branch_node (trie/hexary.py:371) (200 samples, 2.07%)_.._persist_node (trie/hexary.py:317) (9 samples, 0.09%)_delete (trie/hexary.py:158) (221 samples, 2.29%)_.._delete_branch_node (trie/hexary.py:372) (10 samples, 0.10%)delete (trie/hexary.py:142) (227 samples, 2.35%)d..__getitem__ (eth/db/backends/level.py:53) (36 samples, 0.37%)_exists (eth/db/batch.py:61) (39 samples, 0.40%)__getitem__ (eth/db/batch.py:74) (39 samples, 0.40%)_set_root_node (trie/hexary.py:270) (42 samples, 0.43%)__contains__ (eth/db/backends/base.py:35) (41 samples, 0.42%)encode_raw (rlp/codec.py:75) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (12 samples, 0.12%)_create_node_to_db_mapping (trie/hexary.py:309) (18 samples, 0.19%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (25 samples, 0.26%)persist (eth/db/journal.py:418) (313 samples, 3.24%)per..__delitem__ (eth/db/cache.py:32) (312 samples, 3.23%)__d..__delitem__ (eth/db/storage.py:112) (312 samples, 3.23%)__d..__delitem__ (trie/hexary.py:521) (312 samples, 3.23%)__d..delete (trie/hexary.py:146) (77 samples, 0.80%)_set_root_node (trie/hexary.py:273) (33 samples, 0.34%)_set_raw_node (trie/hexary.py:249) (33 samples, 0.34%)_node_to_db_mapping (trie/hexary.py:295) (31 samples, 0.32%)get_node (trie/hexary.py:284) (9 samples, 0.09%)set (trie/hexary.py:102) (30 samples, 0.31%)get_node (trie/hexary.py:285) (20 samples, 0.21%)decode_node (trie/utils/nodes.py:83) (18 samples, 0.19%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)get_node (trie/hexary.py:284) (23 samples, 0.24%)__getitem__ (eth/db/batch.py:74) (22 samples, 0.23%)__getitem__ (eth/db/backends/level.py:53) (20 samples, 0.21%)_set_branch_node (trie/hexary.py:423) (42 samples, 0.43%)get_node (trie/hexary.py:285) (18 samples, 0.19%)decode_node (trie/utils/nodes.py:83) (18 samples, 0.19%)decode (rlp/codec.py:230) (16 samples, 0.17%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (11 samples, 0.11%)<genexpr> (rlp/codec.py:81) (10 samples, 0.10%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (15 samples, 0.16%)__enter__ (contextlib.py:112) (23 samples, 0.24%)_prune_node (trie/hexary.py:237) (23 samples, 0.24%)_node_to_db_mapping (trie/hexary.py:295) (23 samples, 0.24%)_set (trie/hexary.py:113) (25 samples, 0.26%)get_node (trie/hexary.py:284) (49 samples, 0.51%)__getitem__ (eth/db/batch.py:74) (47 samples, 0.49%)__getitem__ (eth/db/backends/level.py:53) (44 samples, 0.46%)_set_branch_node (trie/hexary.py:423) (70 samples, 0.72%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (19 samples, 0.20%)<genexpr> (rlp/codec.py:81) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (21 samples, 0.22%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (28 samples, 0.29%)__enter__ (contextlib.py:112) (39 samples, 0.40%)_prune_node (trie/hexary.py:237) (37 samples, 0.38%)_node_to_db_mapping (trie/hexary.py:295) (36 samples, 0.37%)_set (trie/hexary.py:113) (43 samples, 0.45%)get_node (trie/hexary.py:284) (50 samples, 0.52%)__getitem__ (eth/db/batch.py:74) (49 samples, 0.51%)__getitem__ (eth/db/backends/level.py:53) (49 samples, 0.51%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)_set_branch_node (trie/hexary.py:423) (70 samples, 0.72%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)encode_raw (rlp/codec.py:81) (11 samples, 0.11%)_create_node_to_db_mapping (trie/hexary.py:309) (14 samples, 0.14%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (22 samples, 0.23%)__enter__ (contextlib.py:112) (29 samples, 0.30%)_prune_node (trie/hexary.py:237) (28 samples, 0.29%)_node_to_db_mapping (trie/hexary.py:295) (28 samples, 0.29%)_set (trie/hexary.py:113) (34 samples, 0.35%)get_node (trie/hexary.py:284) (46 samples, 0.48%)__getitem__ (eth/db/batch.py:74) (43 samples, 0.45%)__getitem__ (eth/db/backends/level.py:53) (42 samples, 0.43%)_set_branch_node (trie/hexary.py:423) (52 samples, 0.54%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)__enter__ (contextlib.py:112) (17 samples, 0.18%)_prune_node (trie/hexary.py:237) (16 samples, 0.17%)_node_to_db_mapping (trie/hexary.py:295) (16 samples, 0.17%)_set (trie/hexary.py:113) (19 samples, 0.20%)__getitem__ (eth/db/backends/level.py:53) (27 samples, 0.28%)get_node (trie/hexary.py:284) (28 samples, 0.29%)__getitem__ (eth/db/batch.py:74) (28 samples, 0.29%)_set_branch_node (trie/hexary.py:423) (35 samples, 0.36%)_set (trie/hexary.py:113) (12 samples, 0.12%)__enter__ (contextlib.py:112) (12 samples, 0.12%)_prune_node (trie/hexary.py:237) (12 samples, 0.12%)_node_to_db_mapping (trie/hexary.py:295) (10 samples, 0.10%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_set (trie/hexary.py:120) (17 samples, 0.18%)_set_branch_node (trie/hexary.py:425) (9 samples, 0.09%)_set (trie/hexary.py:122) (19 samples, 0.20%)_set_branch_node (trie/hexary.py:425) (55 samples, 0.57%)_create_node_to_db_mapping (trie/hexary.py:309) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (10 samples, 0.10%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)_set (trie/hexary.py:122) (109 samples, 1.13%)_set_branch_node (trie/hexary.py:426) (19 samples, 0.20%)_persist_node (trie/hexary.py:317) (19 samples, 0.20%)_node_to_db_mapping (trie/hexary.py:295) (19 samples, 0.20%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (16 samples, 0.17%)_set_branch_node (trie/hexary.py:425) (144 samples, 1.49%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_persist_node (trie/hexary.py:317) (13 samples, 0.13%)_node_to_db_mapping (trie/hexary.py:295) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (12 samples, 0.12%)_set (trie/hexary.py:122) (211 samples, 2.19%)_.._set_branch_node (trie/hexary.py:426) (15 samples, 0.16%)_set_branch_node (trie/hexary.py:425) (260 samples, 2.69%)_s.._set (trie/hexary.py:124) (10 samples, 0.10%)encode_raw (rlp/codec.py:75) (13 samples, 0.13%)__instancecheck__ (abc.py:139) (10 samples, 0.10%)_create_node_to_db_mapping (trie/hexary.py:309) (20 samples, 0.21%)encode_raw (rlp/codec.py:81) (18 samples, 0.19%)<genexpr> (rlp/codec.py:81) (15 samples, 0.16%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (25 samples, 0.26%)_set (trie/hexary.py:122) (365 samples, 3.78%)_set.._set_branch_node (trie/hexary.py:426) (33 samples, 0.34%)_persist_node (trie/hexary.py:317) (32 samples, 0.33%)_node_to_db_mapping (trie/hexary.py:295) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:425) (421 samples, 4.36%)_set_..encode_raw (rlp/codec.py:81) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (12 samples, 0.12%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (18 samples, 0.19%)_persist_node (trie/hexary.py:317) (26 samples, 0.27%)_node_to_db_mapping (trie/hexary.py:295) (26 samples, 0.27%)_set (trie/hexary.py:122) (519 samples, 5.37%)_set (.._set_branch_node (trie/hexary.py:426) (27 samples, 0.28%)_set_branch_node (trie/hexary.py:425) (552 samples, 5.72%)_set_br..encode_raw (rlp/codec.py:75) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (14 samples, 0.14%)_create_node_to_db_mapping (trie/hexary.py:309) (20 samples, 0.21%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (31 samples, 0.32%)_persist_node (trie/hexary.py:317) (36 samples, 0.37%)_node_to_db_mapping (trie/hexary.py:295) (36 samples, 0.37%)_set (trie/hexary.py:122) (632 samples, 6.55%)_set (tr.._set_branch_node (trie/hexary.py:426) (38 samples, 0.39%)set (trie/hexary.py:104) (647 samples, 6.70%)set (trie..__getitem__ (eth/db/backends/level.py:53) (121 samples, 1.25%)_exists (eth/db/batch.py:61) (143 samples, 1.48%)__getitem__ (eth/db/batch.py:74) (140 samples, 1.45%)_set_root_node (trie/hexary.py:270) (148 samples, 1.53%)__contains__ (eth/db/backends/base.py:35) (146 samples, 1.51%)_cached_create_node_to_db_mapping (trie/hexary.py:302) (15 samples, 0.16%)inner (eth_utils/functional.py:45) (13 samples, 0.13%)_create_node_to_db_mapping (trie/hexary.py:306) (27 samples, 0.28%)encode_raw (rlp/codec.py:75) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (30 samples, 0.31%)<genexpr> (rlp/codec.py:81) (26 samples, 0.27%)_create_node_to_db_mapping (trie/hexary.py:309) (40 samples, 0.41%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (75 samples, 0.78%)_set_raw_node (trie/hexary.py:249) (125 samples, 1.29%)_node_to_db_mapping (trie/hexary.py:295) (123 samples, 1.27%)inner (eth_utils/functional.py:45) (25 samples, 0.26%)set (trie/hexary.py:108) (278 samples, 2.88%)se.._set_root_node (trie/hexary.py:273) (128 samples, 1.33%)__setitem__ (eth/db/storage.py:100) (961 samples, 9.95%)__setitem__ (e..__setitem__ (trie/hexary.py:518) (961 samples, 9.95%)__setitem__ (t..make_state_root (eth/db/account.py:375) (1,295 samples, 13.41%)make_state_root (eth..make_storage_root (eth/db/storage.py:241) (1,295 samples, 13.41%)make_storage_root (e..persist (eth/db/journal.py:422) (968 samples, 10.02%)persist (eth/d..__setitem__ (eth/db/cache.py:27) (967 samples, 10.01%)__setitem__ (e..make_state_root (eth/db/account.py:383) (10 samples, 0.10%)_set_storage_root (eth/db/account.py:198) (9 samples, 0.09%)batch_commit (trie/utils/db.py:59) (10 samples, 0.10%)__getitem__ (eth/db/diff.py:78) (13 samples, 0.13%)__getitem__ (eth/db/batch.py:69) (57 samples, 0.59%)__getitem__ (eth/db/diff.py:80) (31 samples, 0.32%)__init__ (eth/db/diff.py:48) (16 samples, 0.17%)__getitem__ (eth/db/backends/level.py:53) (781 samples, 8.09%)__getitem__..pop (_collections_abc.py:795) (865 samples, 8.96%)pop (_collec..__getitem__ (eth/db/batch.py:74) (796 samples, 8.24%)__getitem__..__getitem__ (eth/db/batch.py:69) (23 samples, 0.24%)__getitem__ (eth/db/diff.py:80) (17 samples, 0.18%)__getitem__ (eth/db/backends/level.py:53) (34 samples, 0.35%)__delitem__ (eth/db/batch.py:82) (72 samples, 0.75%)__contains__ (eth/db/backends/base.py:35) (67 samples, 0.69%)_exists (eth/db/batch.py:61) (66 samples, 0.68%)__getitem__ (eth/db/batch.py:74) (37 samples, 0.38%)__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..squash_changes (eth/db/hash_trie.py:21) (987 samples, 10.22%)squash_changes ..__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..squash_changes (trie/hexary.py:534) (987 samples, 10.22%)squash_changes ..__exit__ (contextlib.py:119) (987 samples, 10.22%)__exit__ (conte..batch_commit (trie/utils/db.py:61) (972 samples, 10.07%)batch_commit (..pop (_collections_abc.py:801) (86 samples, 0.89%)_delete_branch_node (trie/hexary.py:371) (19 samples, 0.20%)_delete (trie/hexary.py:158) (19 samples, 0.20%)_delete_branch_node (trie/hexary.py:371) (18 samples, 0.19%)_delete (trie/hexary.py:158) (16 samples, 0.17%)_delete_branch_node (trie/hexary.py:371) (16 samples, 0.17%)_delete (trie/hexary.py:158) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:371) (13 samples, 0.13%)_delete (trie/hexary.py:158) (13 samples, 0.13%)_delete_branch_node (trie/hexary.py:371) (10 samples, 0.10%)_delete (trie/hexary.py:158) (10 samples, 0.10%)delete (trie/hexary.py:142) (22 samples, 0.23%)_delete (trie/hexary.py:158) (22 samples, 0.23%)_apply_account_diff_without_proof (eth/db/account.py:473) (30 samples, 0.31%)__delitem__ (eth/db/keymap.py:36) (30 samples, 0.31%)__delitem__ (trie/hexary.py:521) (30 samples, 0.31%)set (trie/hexary.py:102) (31 samples, 0.32%)get_node (trie/hexary.py:285) (31 samples, 0.32%)decode_node (trie/utils/nodes.py:83) (30 samples, 0.31%)decode (rlp/codec.py:230) (28 samples, 0.29%)consume_item (rlp/codec.py:206) (22 samples, 0.23%)decode (rlp/codec.py:230) (11 samples, 0.11%)_set_branch_node (trie/hexary.py:423) (17 samples, 0.18%)get_node (trie/hexary.py:285) (17 samples, 0.18%)decode_node (trie/utils/nodes.py:83) (17 samples, 0.18%)_set_branch_node (trie/hexary.py:423) (27 samples, 0.28%)get_node (trie/hexary.py:285) (20 samples, 0.21%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)decode (rlp/codec.py:230) (19 samples, 0.20%)consume_item (rlp/codec.py:206) (16 samples, 0.17%)_create_node_to_db_mapping (trie/hexary.py:309) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (13 samples, 0.13%)__enter__ (contextlib.py:112) (22 samples, 0.23%)_prune_node (trie/hexary.py:237) (21 samples, 0.22%)_node_to_db_mapping (trie/hexary.py:295) (21 samples, 0.22%)_set (trie/hexary.py:113) (25 samples, 0.26%)get_node (trie/hexary.py:284) (51 samples, 0.53%)__getitem__ (trie/utils/db.py:33) (51 samples, 0.53%)__getitem__ (eth/db/batch.py:74) (48 samples, 0.50%)__getitem__ (eth/db/backends/level.py:53) (47 samples, 0.49%)decode (rlp/codec.py:230) (17 samples, 0.18%)consume_item (rlp/codec.py:206) (14 samples, 0.14%)_set_branch_node (trie/hexary.py:423) (71 samples, 0.74%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (19 samples, 0.20%)_create_node_to_db_mapping (trie/hexary.py:306) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (15 samples, 0.16%)<genexpr> (rlp/codec.py:81) (13 samples, 0.13%)_create_node_to_db_mapping (trie/hexary.py:309) (19 samples, 0.20%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (35 samples, 0.36%)_prune_node (trie/hexary.py:237) (42 samples, 0.43%)_node_to_db_mapping (trie/hexary.py:295) (42 samples, 0.43%)__enter__ (contextlib.py:112) (43 samples, 0.45%)_set (trie/hexary.py:113) (44 samples, 0.46%)get_node (trie/hexary.py:284) (36 samples, 0.37%)__getitem__ (trie/utils/db.py:33) (36 samples, 0.37%)__getitem__ (eth/db/batch.py:74) (35 samples, 0.36%)__getitem__ (eth/db/backends/level.py:53) (35 samples, 0.36%)_set_branch_node (trie/hexary.py:423) (60 samples, 0.62%)get_node (trie/hexary.py:285) (24 samples, 0.25%)decode_node (trie/utils/nodes.py:83) (23 samples, 0.24%)decode (rlp/codec.py:230) (22 samples, 0.23%)consume_item (rlp/codec.py:206) (20 samples, 0.21%)encode_raw (rlp/codec.py:75) (22 samples, 0.23%)__instancecheck__ (abc.py:139) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (31 samples, 0.32%)<genexpr> (rlp/codec.py:81) (28 samples, 0.29%)_create_node_to_db_mapping (trie/hexary.py:309) (35 samples, 0.36%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (45 samples, 0.47%)__enter__ (contextlib.py:112) (59 samples, 0.61%)_prune_node (trie/hexary.py:237) (55 samples, 0.57%)_node_to_db_mapping (trie/hexary.py:295) (55 samples, 0.57%)_set (trie/hexary.py:113) (65 samples, 0.67%)get_node (trie/hexary.py:284) (85 samples, 0.88%)__getitem__ (trie/utils/db.py:33) (85 samples, 0.88%)__getitem__ (eth/db/batch.py:74) (79 samples, 0.82%)__getitem__ (eth/db/backends/level.py:53) (75 samples, 0.78%)_set_branch_node (trie/hexary.py:423) (105 samples, 1.09%)get_node (trie/hexary.py:285) (19 samples, 0.20%)decode_node (trie/utils/nodes.py:83) (17 samples, 0.18%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)encode_raw (rlp/codec.py:75) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (20 samples, 0.21%)<genexpr> (rlp/codec.py:81) (18 samples, 0.19%)_create_node_to_db_mapping (trie/hexary.py:309) (26 samples, 0.27%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (29 samples, 0.30%)__enter__ (contextlib.py:112) (35 samples, 0.36%)_prune_node (trie/hexary.py:237) (35 samples, 0.36%)_node_to_db_mapping (trie/hexary.py:295) (34 samples, 0.35%)_set (trie/hexary.py:113) (37 samples, 0.38%)get_node (trie/hexary.py:284) (61 samples, 0.63%)__getitem__ (trie/utils/db.py:33) (60 samples, 0.62%)__getitem__ (eth/db/batch.py:74) (59 samples, 0.61%)__getitem__ (eth/db/backends/level.py:53) (57 samples, 0.59%)_set_branch_node (trie/hexary.py:423) (76 samples, 0.79%)get_node (trie/hexary.py:285) (15 samples, 0.16%)decode_node (trie/utils/nodes.py:83) (15 samples, 0.16%)decode (rlp/codec.py:230) (14 samples, 0.14%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)encode_raw (rlp/codec.py:75) (17 samples, 0.18%)__instancecheck__ (abc.py:139) (11 samples, 0.11%)encode_raw (rlp/codec.py:81) (27 samples, 0.28%)<genexpr> (rlp/codec.py:81) (21 samples, 0.22%)_create_node_to_db_mapping (trie/hexary.py:309) (29 samples, 0.30%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (36 samples, 0.37%)__enter__ (contextlib.py:112) (44 samples, 0.46%)_prune_node (trie/hexary.py:237) (43 samples, 0.45%)_node_to_db_mapping (trie/hexary.py:295) (43 samples, 0.45%)_set (trie/hexary.py:113) (50 samples, 0.52%)get_node (trie/hexary.py:284) (61 samples, 0.63%)__getitem__ (trie/utils/db.py:33) (60 samples, 0.62%)__getitem__ (eth/db/batch.py:74) (55 samples, 0.57%)__getitem__ (eth/db/backends/level.py:53) (51 samples, 0.53%)_set_branch_node (trie/hexary.py:423) (71 samples, 0.74%)get_node (trie/hexary.py:285) (9 samples, 0.09%)_set (trie/hexary.py:111) (12 samples, 0.12%)get_node_type (trie/utils/nodes.py:42) (12 samples, 0.12%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (11 samples, 0.11%)__enter__ (contextlib.py:112) (18 samples, 0.19%)_prune_node (trie/hexary.py:237) (18 samples, 0.19%)_node_to_db_mapping (trie/hexary.py:295) (16 samples, 0.17%)_set (trie/hexary.py:113) (24 samples, 0.25%)_set (trie/hexary.py:120) (29 samples, 0.30%)_set_branch_node (trie/hexary.py:423) (11 samples, 0.11%)get_node (trie/hexary.py:284) (11 samples, 0.11%)__getitem__ (trie/utils/db.py:33) (11 samples, 0.11%)__getitem__ (eth/db/batch.py:74) (10 samples, 0.10%)__getitem__ (eth/db/backends/level.py:53) (10 samples, 0.10%)_set (trie/hexary.py:113) (9 samples, 0.09%)_set_branch_node (trie/hexary.py:425) (15 samples, 0.16%)_set (trie/hexary.py:122) (30 samples, 0.31%)_set_branch_node (trie/hexary.py:425) (97 samples, 1.00%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (9 samples, 0.09%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (17 samples, 0.18%)_set (trie/hexary.py:122) (192 samples, 1.99%)_.._set_branch_node (trie/hexary.py:426) (24 samples, 0.25%)_persist_node (trie/hexary.py:317) (22 samples, 0.23%)_node_to_db_mapping (trie/hexary.py:295) (22 samples, 0.23%)_set_branch_node (trie/hexary.py:425) (251 samples, 2.60%)_s.._create_node_to_db_mapping (trie/hexary.py:309) (18 samples, 0.19%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (11 samples, 0.11%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (28 samples, 0.29%)_set (trie/hexary.py:122) (362 samples, 3.75%)_set.._set_branch_node (trie/hexary.py:426) (34 samples, 0.35%)_persist_node (trie/hexary.py:317) (34 samples, 0.35%)_node_to_db_mapping (trie/hexary.py:295) (34 samples, 0.35%)_set_branch_node (trie/hexary.py:425) (402 samples, 4.16%)_set..encode_raw (rlp/codec.py:81) (11 samples, 0.11%)<genexpr> (rlp/codec.py:81) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:309) (13 samples, 0.13%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (24 samples, 0.25%)_set (trie/hexary.py:122) (541 samples, 5.60%)_set (t.._set_branch_node (trie/hexary.py:426) (32 samples, 0.33%)_persist_node (trie/hexary.py:317) (32 samples, 0.33%)_node_to_db_mapping (trie/hexary.py:295) (32 samples, 0.33%)_set_branch_node (trie/hexary.py:425) (611 samples, 6.33%)_set_bra..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)_create_node_to_db_mapping (trie/hexary.py:309) (19 samples, 0.20%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (15 samples, 0.16%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (31 samples, 0.32%)_persist_node (trie/hexary.py:317) (38 samples, 0.39%)_node_to_db_mapping (trie/hexary.py:295) (38 samples, 0.39%)_set (trie/hexary.py:122) (711 samples, 7.36%)_set (trie.._set_branch_node (trie/hexary.py:426) (40 samples, 0.41%)_set_branch_node (trie/hexary.py:425) (761 samples, 7.88%)_set_branch..encode_raw (rlp/codec.py:75) (17 samples, 0.18%)__instancecheck__ (abc.py:139) (13 samples, 0.13%)encode_raw (rlp/codec.py:81) (23 samples, 0.24%)<genexpr> (rlp/codec.py:81) (21 samples, 0.22%)_create_node_to_db_mapping (trie/hexary.py:309) (27 samples, 0.28%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (37 samples, 0.38%)_persist_node (trie/hexary.py:317) (44 samples, 0.46%)_node_to_db_mapping (trie/hexary.py:295) (44 samples, 0.46%)_set (trie/hexary.py:122) (879 samples, 9.10%)_set (trie/he.._set_branch_node (trie/hexary.py:426) (47 samples, 0.49%)_set_branch_node (trie/hexary.py:425) (907 samples, 9.39%)_set_branch_n..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)__instancecheck__ (abc.py:139) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (21 samples, 0.22%)<genexpr> (rlp/codec.py:81) (16 samples, 0.17%)_create_node_to_db_mapping (trie/hexary.py:309) (24 samples, 0.25%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (34 samples, 0.35%)_set (trie/hexary.py:122) (974 samples, 10.09%)_set (trie/hex.._set_branch_node (trie/hexary.py:426) (39 samples, 0.40%)_persist_node (trie/hexary.py:317) (38 samples, 0.39%)_node_to_db_mapping (trie/hexary.py:295) (37 samples, 0.38%)_set_branch_node (trie/hexary.py:425) (982 samples, 10.17%)_set_branch_no..encode_raw (rlp/codec.py:75) (12 samples, 0.12%)__instancecheck__ (abc.py:139) (12 samples, 0.12%)__subclasscheck__ (abc.py:143) (9 samples, 0.09%)encode_raw (rlp/codec.py:81) (17 samples, 0.18%)<genexpr> (rlp/codec.py:81) (17 samples, 0.18%)_create_node_to_db_mapping (trie/hexary.py:309) (22 samples, 0.23%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (29 samples, 0.30%)_set (trie/hexary.py:122) (1,034 samples, 10.71%)_set (trie/hexa.._set_branch_node (trie/hexary.py:426) (35 samples, 0.36%)_persist_node (trie/hexary.py:317) (35 samples, 0.36%)_node_to_db_mapping (trie/hexary.py:295) (35 samples, 0.36%)set (trie/hexary.py:104) (1,045 samples, 10.82%)set (trie/hexary.._set_root_node (trie/hexary.py:267) (13 samples, 0.13%)__getitem__ (eth/db/backends/level.py:53) (149 samples, 1.54%)_exists (eth/db/batch.py:61) (171 samples, 1.77%)__getitem__ (eth/db/batch.py:74) (167 samples, 1.73%)__getitem__ (eth/db/backends/level.py:55) (12 samples, 0.12%)_set_root_node (trie/hexary.py:270) (184 samples, 1.91%)_..__contains__ (trie/utils/db.py:45) (182 samples, 1.88%)_..__contains__ (eth/db/backends/base.py:35) (179 samples, 1.85%)_.._cached_create_node_to_db_mapping (trie/hexary.py:302) (16 samples, 0.17%)inner (eth_utils/functional.py:45) (13 samples, 0.13%)validate_is_node (trie/validation.py:39) (9 samples, 0.09%)_create_node_to_db_mapping (trie/hexary.py:306) (35 samples, 0.36%)encode_raw (rlp/codec.py:75) (16 samples, 0.17%)encode_raw (rlp/codec.py:81) (37 samples, 0.38%)<genexpr> (rlp/codec.py:81) (29 samples, 0.30%)_create_node_to_db_mapping (trie/hexary.py:309) (46 samples, 0.48%)_cached_create_node_to_db_mapping (trie/hexary.py:303) (89 samples, 0.92%)tuplify (trie/hexary.py:554) (10 samples, 0.10%)_set_raw_node (trie/hexary.py:249) (149 samples, 1.54%)_node_to_db_mapping (trie/hexary.py:295) (145 samples, 1.50%)inner (eth_utils/functional.py:45) (28 samples, 0.29%)set (trie/hexary.py:108) (351 samples, 3.64%)set .._set_root_node (trie/hexary.py:273) (153 samples, 1.58%)persist (eth/db/account.py:399) (3,758 samples, 38.92%)persist (eth/db/account.py:399)make_state_root (eth/db/account.py:391) (2,453 samples, 25.40%)make_state_root (eth/db/account.py:391)_apply_account_diff_without_proof (eth/db/account.py:501) (1,436 samples, 14.87%)_apply_account_diff_wi..__setitem__ (eth/db/keymap.py:32) (1,431 samples, 14.82%)__setitem__ (eth/db/ke..__setitem__ (trie/hexary.py:518) (1,431 samples, 14.82%)__setitem__ (trie/hexa..persist (eth/db/account.py:405) (10 samples, 0.10%)persist (eth/db/account.py:424) (9 samples, 0.09%)finalize_block (eth/vm/base.py:361) (3,781 samples, 39.16%)finalize_block (eth/vm/base.py:361)persist (eth/vm/state.py:179) (3,781 samples, 39.16%)persist (eth/vm/state.py:179)deepcopy (copy.py:161) (14 samples, 0.14%)__deepcopy__ (rlp/sedes/serializable.py:295) (14 samples, 0.14%)mine_block (eth/vm/base.py:297) (3,799 samples, 39.34%)mine_block (eth/vm/base.py:297)finalize_block (eth/vm/base.py:363) (18 samples, 0.19%)copy (rlp/sedes/serializable.py:284) (18 samples, 0.19%)<dictcomp> (rlp/sedes/serializable.py:285) (18 samples, 0.19%)deepcopy (copy.py:150) (18 samples, 0.19%)_deepcopy_tuple (copy.py:220) (18 samples, 0.19%)<listcomp> (copy.py:220) (18 samples, 0.19%)encode (rlp/codec.py:63) (9 samples, 0.09%)serialize (rlp/sedes/serializable.py:259) (9 samples, 0.09%)inner (eth_utils/functional.py:45) (9 samples, 0.09%)validate_block (eth/vm/base.py:507) (16 samples, 0.17%)make_trie_root_and_nodes (eth/db/trie.py:24) (16 samples, 0.17%)<genexpr> (eth/db/trie.py:24) (16 samples, 0.17%)import_block (eth/chains/base.py:427) (9,536 samples, 98.76%)import_block (eth/chains/base.py:427)import_block (eth/vm/base.py:292) (3,838 samples, 39.75%)import_block (eth/vm/base.py:292)mine_block (eth/vm/base.py:300) (22 samples, 0.23%)get (trie/hexary.py:73) (9 samples, 0.09%)_get_branch_node (trie/hexary.py:490) (16 samples, 0.17%)get_node (trie/hexary.py:285) (12 samples, 0.12%)decode_node (trie/utils/nodes.py:83) (12 samples, 0.12%)decode (rlp/codec.py:230) (12 samples, 0.12%)consume_item (rlp/codec.py:206) (11 samples, 0.11%)_get_block_transactions (eth/db/chain.py:328) (44 samples, 0.46%)_get_block_transaction_data (eth/db/chain.py:313) (42 samples, 0.43%)__getitem__ (trie/hexary.py:515) (42 samples, 0.43%)get (trie/hexary.py:75) (32 samples, 0.33%)_get (trie/hexary.py:87) (31 samples, 0.32%)_get_branch_node (trie/hexary.py:491) (14 samples, 0.14%)_get (trie/hexary.py:87) (13 samples, 0.13%)decode (rlp/codec.py:237) (14 samples, 0.14%)process_blocks (gethimport.py:471) (9,613 samples, 99.55%)process_blocks (gethimport.py:471)import_block (eth/chains/base.py:448) (63 samples, 0.65%)<genexpr> (eth/chains/base.py:447) (63 samples, 0.65%)get_block_by_hash (eth/chains/base.py:311) (63 samples, 0.65%)get_block_by_header (eth/chains/base.py:315) (63 samples, 0.65%)get_block (eth/vm/base.py:114) (63 samples, 0.65%)from_header (eth/vm/forks/frontier/blocks.py:112) (63 samples, 0.65%)get_block_transactions (eth/db/chain.py:221) (63 samples, 0.65%)inner (eth_utils/functional.py:45) (63 samples, 0.65%)_get_block_transactions (eth/db/chain.py:329) (19 samples, 0.20%)all (9,656 samples, 100%)<module> (gethimport.py:526) (9,656 samples, 100.00%)<module> (gethimport.py:526) \ No newline at end of file From 51fa48189441db088d96a5f8feb16710f2bc4a64 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Thu, 5 Dec 2019 17:25:46 -0800 Subject: [PATCH 16/19] Add subcommand to compact the database --- scripts/gethimport.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index a4171a59f9..072687c080 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -507,6 +507,12 @@ def read_trinity(location): logger.info(f'canonical_head={canonical_head}') +def compact(chain): + logger.info('this might take a while') + leveldb = chain.headerdb.db.db # what law of demeter? + leveldb.compact_range() + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -594,6 +600,16 @@ def read_trinity(location): ) read_geth_parser.add_argument('-gethdb', type=str, required=True) + compact_parser = subparsers.add_parser( + "compact", + help="Runs a compaction over the database, do this after importing state!", + description=""" + If the database is not compacted it will compact itself at an + unconvenient time, freezing your process for uncomfortably long. + """ + ) + compact_parser.add_argument('-destdb', type=str, required=True) + args = parser.parse_args() if args.command == 'import_body_range': @@ -620,5 +636,8 @@ def read_trinity(location): gethdb = open_gethdb(args.gethdb) chain = open_trinitydb(args.destdb) sweep_state(gethdb, chain.headerdb.db) + elif args.command == 'compact': + chain = open_trinitydb(args.destdb) + compact(chain) else: logger.error(f'unrecognized command. command={args.command}') From 54c2223186eeb085a43f9aed492c3f52e9affbf5 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Fri, 6 Dec 2019 20:18:35 -0800 Subject: [PATCH 17/19] Fix typo in logger.warning --- scripts/gethimport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 072687c080..84e93acc46 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -298,8 +298,8 @@ def open_trinitydb(location): logger.info(f'Trinity database did not already exist, initializing it now') chain = MainnetChain.from_genesis_header(leveldb, MAINNET_GENESIS_HEADER) - logger.warining('The new db contains the genesis header but not the genesis state.') - logger.warining('Attempts to full sync will fail.') + logger.warning('The new db contains the genesis header but not the genesis state.') + logger.warning('Attempts to full sync will fail.') return chain From 2357186b587babd7064ee4c6e0fd0b6f5faf25f2 Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Sat, 14 Mar 2020 10:40:16 -0700 Subject: [PATCH 18/19] add scan_bodies command --- scripts/gethimport.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index 84e93acc46..fae4a7b11d 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -12,6 +12,7 @@ import snappy import struct import time +import random import plyvel @@ -513,6 +514,30 @@ def compact(chain): leveldb.compact_range() +def scan_bodies(gethdb): + fake_bloom = bytes(random.getrandbits(8) for _ in range(32)) + + for blocknum in range(9000000, 9060000): + header = gethdb.block_header(blocknum) + body = gethdb.block_body(blocknum, header.hash) + + new_block = rlp.encode([header, body.transactions, body.uncles]) + new_block_2 = rlp.encode([ + header, + [transaction.hash for transaction in body.transactions], + body.uncles + ]) + new_block_3 = rlp.encode([ + header, fake_bloom, body.uncles + ]) + + c_new_block = snappy.compress(new_block) + c_new_block_2 = snappy.compress(new_block_2) + c_new_block_3 = snappy.compress(new_block_3) + + logger.info(f'{blocknum} {len(new_block)} {len(new_block_2)} {len(new_block_3)} {len(c_new_block)} {len(c_new_block_2)} {len(c_new_block_3)}') + + if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, @@ -610,6 +635,11 @@ def compact(chain): ) compact_parser.add_argument('-destdb', type=str, required=True) + scan_bodies_parser = subparsers.add_parser( + "scan_bodies" + ) + scan_bodies_parser.add_argument('-gethdb', type=str, required=True) + args = parser.parse_args() if args.command == 'import_body_range': @@ -639,5 +669,8 @@ def compact(chain): elif args.command == 'compact': chain = open_trinitydb(args.destdb) compact(chain) + elif args.command == 'scan_bodies': + gethdb = open_gethdb(args.gethdb) + scan_bodies(gethdb) else: logger.error(f'unrecognized command. command={args.command}') From d2509dfa56387428acc5682194d4ba59ce9c8f8d Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Tue, 31 Mar 2020 21:52:38 -0700 Subject: [PATCH 19/19] Add function to process blocks straight from a geth database --- scripts/gethimport.py | 319 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 306 insertions(+), 13 deletions(-) diff --git a/scripts/gethimport.py b/scripts/gethimport.py index fae4a7b11d..9b3c5f5058 100755 --- a/scripts/gethimport.py +++ b/scripts/gethimport.py @@ -13,6 +13,7 @@ import struct import time import random +from typing import Tuple, Iterable, List, Type, Dict import plyvel @@ -32,6 +33,26 @@ from trie.utils.nibbles import nibbles_to_bytes +from eth.abc import HeaderDatabaseAPI, ChainDatabaseAPI, BlockHeaderAPI, ReceiptAPI +from eth.db.header import HeaderDB +from eth.db.chain import ChainDB + +from eth.vm.chain_context import ChainContext +from eth.chains.mainnet.constants import MAINNET_CHAIN_ID + +from eth.consensus import ConsensusContext + +from eth_typing import BlockNumber, Hash32 + +from eth.db.batch import BatchDB +from eth.db.atomic import AtomicDB + +from eth._utils.rlp import ( + validate_imported_block_unchanged, +) + +from eth.db.backends.memory import MemoryDB + logger = logging.getLogger('importer') @@ -44,6 +65,7 @@ class GethKeys: headerPrefix = b'h' headerNumberPrefix = b'H' headerHashSuffix = b'n' + headerTDSuffix = b't' blockBodyPrefix = b'b' blockReceiptsPrefix = b'r' @@ -54,6 +76,12 @@ def header_hash_for_block_number(cls, block_number: int) -> bytes: packed_block_number = struct.pack('>Q', block_number) return cls.headerPrefix + packed_block_number + cls.headerHashSuffix + @classmethod + def header_difficulty_for_block_number(cls, block_number: int) -> bytes: + "The key to get the hash of the header with the given block number" + packed_block_number = struct.pack('>Q', block_number) + return cls.headerPrefix + packed_block_number + cls.headerTDSuffix + @classmethod def block_number_for_header_hash(cls, header_hash: bytes) -> bytes: "The key to get the block number of the header with the given hash" @@ -190,6 +218,7 @@ def __init__(self, path): self.ancient_headers = GethFreezerTable(ancient_path, 'headers', True) self.ancient_bodies = GethFreezerTable(ancient_path, 'bodies', True) self.ancient_receipts = GethFreezerTable(ancient_path, 'receipts', True) + self.ancient_difficulties = GethFreezerTable(ancient_path, 'diffs', False) if self.database_version != b'\x07': raise Exception(f'geth database version {self.database_version} is not supported') @@ -205,6 +234,8 @@ def last_block_hash(self) -> bytes: def block_num_for_hash(self, header_hash: bytes) -> int: raw_num = self.db.get(GethKeys.block_number_for_header_hash(header_hash)) + if raw_num is None: + raise Exception(f"could not find block with given header hash: 0x{header_hash.hex()}") return struct.unpack('>Q', raw_num)[0] def block_header(self, block_number: int, header_hash: bytes = None) -> BlockHeader: @@ -219,7 +250,6 @@ def block_header(self, block_number: int, header_hash: bytes = None) -> BlockHea return rlp.decode(raw_data, sedes=BlockHeader) def header_hash_for_block_number(self, block_number: int) -> bytes: - # This needs to check the ancient db (freezerHashTable) result = self.db.get(GethKeys.header_hash_for_block_number(block_number)) if result is not None: @@ -227,6 +257,14 @@ def header_hash_for_block_number(self, block_number: int) -> bytes: return self.ancient_hashes.get(block_number) + def header_td_for_block_number(self, block_number: int) -> bytes: + result = self.db.get(GethKeys.header_difficulty_for_block_number(block_number)) + + if result is not None: + return result + + return self.ancient_difficulties.get(block_number) + def block_body(self, block_number: int, header_hash: bytes = None): if header_hash is None: header_hash = self.header_hash_for_block_number(block_number) @@ -249,6 +287,210 @@ def block_receipts(self, block_number: int, header_hash: bytes = None): raw_data = self.ancient_receipts.get(block_number) return raw_data +class GethHeaderDB(HeaderDatabaseAPI): + """ + An implemention of HeaderDB which can read from Geth's database format + """ + + def __init__(self, geth: GethDatabase) -> None: + self.geth = geth + + ### Canonical Chain API + + def get_canonical_block_hash(self, block_number: BlockNumber) -> Hash32: + # https://github.com/ethereum/go-ethereum/blob/v1.8.27/core/rawdb/schema.go#L91 + + return cast(Hash32, self.geth.header_hash_for_block_number(block_number)) + + def get_canonical_block_header_by_number(self, block_number: BlockNumber) -> BlockHeader: + return self.geth.block_header(block_number) + + def get_canonical_head(self) -> BlockHeader: + geth_last_block_hash = self.geth.last_block_hash + geth_last_block_num = self.geth.block_num_for_hash(geth_last_block_hash) + return self.get_canonical_block_header_by_number(geth_last_block_num) + + ### Header API + + def get_block_header_by_hash(self, block_hash: Hash32) -> BlockHeader: + block_num = self.geth.block_num_for_hash(block_hash) + return self.geth.block_header(block_num, block_hash) + + def get_score(self, block_hash: Hash32) -> int: + block_num = self.geth.block_num_for_hash(block_hash) + return self.geth.header_td_for_block_number(block_num) + + def header_exists(self, block_hash: Hash32) -> bool: + raise NotImplementedError("Hope I don't need this") + + def persist_checkpoint_header(self, header: BlockHeaderAPI, score: int): + raise NotImplementedError("Writing to Geth databases is not supported") + + def persist_header(self, + header: BlockHeader + ) -> Tuple[Tuple[BlockHeader, ...], Tuple[BlockHeader, ...]]: + raise NotImplementedError("Writing to Geth databases is not supported") + + def persist_header_chain(self, + headers: Iterable[BlockHeader] + ) -> Tuple[Tuple[BlockHeader, ...], Tuple[BlockHeader, ...]]: + raise NotImplementedError("Writing to Geth databases is not supported") + + +class WrapperDB: + def __init__(self, db): + self.db = db + + def __getitem__(self, key: bytes) -> bytes: + v = self.db.get(key) + if v is None: + raise KeyError(key) + return v + + def __setitem__(self, key: bytes, value: bytes) -> None: + raise NotImplementedError("sorry") + + def __delitem__(self, key: bytes) -> None: + raise NotImplementedError("sorry") + + +class GethChainDB(GethHeaderDB, ChainDatabaseAPI): + """ + An implementation of ChainDB which can read from Geth's database format + """ + + def __init__(self, geth: GethDatabase) -> None: + self.geth = geth + self.db = AtomicDB( + BatchDB(wrapped_db=WrapperDB(geth.db)) # prevent writes from being committed + ) + + def _get_block_body(self, block_hash: Hash32) -> BlockBody: + block_num = self.geth.block_num_for_hash(block_hash) + return self.geth.block_body(block_num, block_hash) + + def _get_block_transactions(self, + block_header: BlockHeader) -> Iterable['BaseTransaction']: + body = self._get_block_body(block_hash) + return body.transactions + + ### Header API + + def get_block_uncles(self, uncles_hash: Hash32) -> List[BlockHeader]: + body = self._get_block_body(uncles_hash) + return list(body.uncles) # (it's naturally a tuple) + + ### Block API + + def persist_block(self, + block: 'BaseBlock' + ) -> Tuple[Tuple[Hash32, ...], Tuple[Hash32, ...]]: + raise NotImplementedError("Writing to Geth databases is not supported") + + def persist_uncles(self, uncles: Tuple[BlockHeader]) -> Hash32: + raise NotImplementedError("Writing to Geth databases is not supported") + + ### Transaction API + + def add_receipt(self, + block_header: BlockHeader, + index_key: int, receipt: ReceiptAPI) -> Hash32: + raise NotImplementedError("Writing to Geth databases is not supported") + + def add_transaction(self, + block_header: BlockHeader, + index_key: int, transaction: 'BaseTransaction') -> Hash32: + raise NotImplementedError("Writing to Geth databases is not supported") + + def get_block_transactions( + self, + block_header: BlockHeader, + transaction_class: Type['BaseTransaction']) -> Iterable['BaseTransaction']: + # This is sometimes called with a fake header with an invalid hash... + + body = self._get_block_body(block_header.hash) + + encoded = [rlp.encode(txn) for txn in body.transactions] + decoded = [rlp.decode(txn, sedes=transaction_class) for txn in encoded] + + return decoded + + def get_block_transaction_hashes(self, block_header: BlockHeader) -> Iterable[Hash32]: + body = self._get_block_body(block_header.hash) + return [txn.hash for txn in body.transactions] + + def get_receipt_by_index(self, + block_number: BlockNumber, + receipt_index: int) -> ReceiptAPI: + raise NotImplementedError("ChainDB classes must implement this method") + receipts = self.geth.block_receipts(block_number) + decoded = rlp.decode(receipts) + return decoded[receipt_index] + + def get_receipts(self, + header: BlockHeader, + receipt_class: Type[ReceiptAPI]) -> Iterable[ReceiptAPI]: + receipts = self.geth.block_receipts(block_number) + return rlp.decode(receipts) + # https://github.com/ethereum/go-ethereum/blob/v1.8.27/core/rawdb/schema.go#L51 + + # geth stores receipts with a custom RLP: + + # type receiptStorageRLP struct { + # PostStateOrStatus []byte + # CumulativeGasUsed uint64 + # TxHash common.Hash + # ContractAddress common.Address + # Logs []*LogForStorage + # GasUsed uint64 + # } + + # TODO: implement receipts + + raise NotImplementedError("ChainDB classes must implement this method") + + def get_transaction_by_index( + self, + block_number: BlockNumber, + transaction_index: int, + transaction_class: Type['BaseTransaction']) -> 'BaseTransaction': + + block_header = self.get_canonical_block_header_by_number(block_number) + txns = self.get_block_transactions(block_header, transaction_class) + return txns[transaction_index] + + def get_transaction_index(self, transaction_hash: Hash32) -> Tuple[BlockNumber, int]: + # https://github.com/ethereum/go-ethereum/blob/v1.8.27/core/rawdb/schema.go#L53 + + raise NotImplementedError("ChainDB classes must implement this method") + + block_hash = self.db.get(self.TX_LOOKUP_PREFIX + transaction_hash) + # https://github.com/ethereum/go-ethereum/blob/f9aa1cd21f776a4d3267d9c89772bdc622468d6d/core/rawdb/accessors_indexes.go#L36 + # there was also a legacy thing which went here + assert len(block_hash) == 32 + + encoded_block_num = self._number_for_block(block_hash) + block_num = self._decode_block_number(encoded_block_num) + + body = self._get_block_body(block_hash) + for index, transaction in enumerate(body.transactions): + if transaction.hash == transaction_hash: + return block_num, index + raise Exception('could not find transaction') + + ### Raw Database API + + def exists(self, key: bytes) -> bool: + return self.db.exists(key) + + def get(self, key: bytes) -> bytes: + return self.db[key] + + def persist_trie_data_dict(self, trie_data_dict: Dict[Hash32, bytes]) -> None: + # write to self.db, which never commits to the real database + with self.db.atomic_batch() as db: + for key, value in trie_data_dict.items(): + db[key] = value class ImportDatabase: "Creates a 'ChainDB' which can be passed to the trie_iteration utils" @@ -453,20 +695,62 @@ def process_blocks(gethdb, chain, end_block): start_block = max(canonical_head.block_number, 1) for i in range(start_block, end_block + 1): - header_hash = gethdb.header_hash_for_block_number(i) - header = gethdb.block_header(i, header_hash) - vm_class = chain.get_vm_class(header) - block_class = vm_class.get_block_class() - transaction_class = vm_class.get_transaction_class() + import_block(gethdb, chain, i) + +def import_block(gethdb, i): + logger.debug(f'importing block: {i}') - body = gethdb.block_body(i) - transactions = [ - transaction_class.from_base_transaction(txn) for txn in body.transactions - ] - block = block_class(header, transactions, body.uncles) - imported_block, _, _ = chain.import_block(block, perform_validation=True) - logger.debug(f'imported block: {imported_block}') + chaindb = GethChainDB(gethdb) + chain = MainnetChain.from_genesis_header(chaindb.db, MAINNET_GENESIS_HEADER) + # chain builds its own ChainDB, force it to use our GethChainDB + chain.chaindb = chaindb + chain.headerdb = chaindb + + header_hash = gethdb.header_hash_for_block_number(i) + header = gethdb.block_header(i, header_hash) + + vm_class = chain.get_vm_class(header) + block_class = vm_class.get_block_class() + transaction_class = vm_class.get_transaction_class() + + body = gethdb.block_body(i) + transactions = [ + transaction_class.from_base_transaction(txn) for txn in body.transactions + ] + block = block_class(header, transactions, body.uncles) + + parent_header = gethdb.block_header(i-1, header.parent_hash) + base_header_for_import = vm_class.create_header_from_parent(parent_header) + + vm = vm_class( + header=header, + chaindb=chaindb, + chain_context=ChainContext(MAINNET_CHAIN_ID), + consensus_context=ConsensusContext(gethdb.db) + ) + + """ + - vm.import_block() first calls vm.get_block() + - vm.get_block() creates a block from the provided header + - creating a block requires reading its transactions out of the database + - this fails with the GethDB, because transactions are looked up by header hash + - base_header_for_import is completely fake and that hash does not exist in the db + - py-evm has no problem with this because it looks transactions up by the trie hash + - the better solution is to change how BaseVM works, but this is good enough for now + """ + vm.get_block() + vm._initial_header = base_header_for_import + vm._block = vm._block.copy( + header = base_header_for_import + ) + + imported_block = vm.import_block(block) + + validate_imported_block_unchanged(imported_block, block) + chain.validate_block(imported_block) + + logger.debug(f'imported block: {imported_block}') def read_receipts(gethdb, block_number): logger.info(f'reading receipts for block. block_number={block_number}') @@ -640,6 +924,12 @@ def scan_bodies(gethdb): ) scan_bodies_parser.add_argument('-gethdb', type=str, required=True) + import_block_parser = subparsers.add_parser( + "import_block" + ) + import_block_parser.add_argument('-gethdb', type=str, required=True) + import_block_parser.add_argument('-block', type=int, required=True) + args = parser.parse_args() if args.command == 'import_body_range': @@ -672,5 +962,8 @@ def scan_bodies(gethdb): elif args.command == 'scan_bodies': gethdb = open_gethdb(args.gethdb) scan_bodies(gethdb) + elif args.command == 'import_block': + gethdb = open_gethdb(args.gethdb) + import_block(gethdb, args.block) else: logger.error(f'unrecognized command. command={args.command}')