32 class StateImporter:
public StateImporterFace
35 explicit StateImporter(OverlayDB& _stateDb): m_trie(&_stateDb) { m_trie.init(); }
37 void importAccount(
h256 const& _addressHash,
u256 const& _nonce,
u256 const& _balance, std::map<h256, bytes>
const& _storage,
h256 const& _codeHash)
override
40 s << _nonce << _balance;
42 h256 const storageRoot = isAccountImported(_addressHash) ? accountStorageRoot(_addressHash) :
EmptyTrie;
44 s.append(storageRoot);
47 SpecificTrieDB<GenericTrieDB<OverlayDB>,
h256> storageDB(m_trie.db(), storageRoot);
48 for (
auto const& hashAndValue: _storage)
49 storageDB.insert(hashAndValue.first, hashAndValue.second);
51 s.append(storageDB.root());
56 m_trie.insert(_addressHash, &s.out());
62 m_trie.db()->insert(hash, _code);
66 void commitStateDatabase()
override { m_trie.db()->commit(); }
68 bool isAccountImported(
h256 const& _addressHash)
const override {
return m_trie.contains(_addressHash); }
70 h256 stateRoot()
const override {
return m_trie.root(); }
72 std::string lookupCode(
h256 const& _hash)
const override {
return m_trie.db()->lookup(_hash); }
76 h256 accountStorageRoot(
h256 const& _addressHash)
const
78 std::string
const account = m_trie.at(_addressHash);
79 assert(!account.empty());
81 RLP accountRlp(account);
82 if (accountRlp.itemCount() < 3)
83 BOOST_THROW_EXCEPTION(InvalidAccountInTheDatabase());
88 SpecificTrieDB<GenericTrieDB<OverlayDB>,
h256> m_trie;
95 return std::unique_ptr<StateImporterFace>(
new StateImporter(_stateDb));