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));
bool sha3(bytesConstRef _input, bytesRef o_output) noexcept
vector_ref< byte const > bytesConstRef
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
std::unique_ptr< StateImporterFace > createStateImporter(OverlayDB &_stateDb)