1919#include < silkworm/core/common/util.hpp>
2020#include < silkworm/db/state/accounts_domain.hpp>
2121#include < silkworm/db/state/code_domain.hpp>
22- #include < silkworm/db/state/schema_config.hpp>
2322#include < silkworm/db/state/storage_domain.hpp>
2423
2524namespace silkworm ::execution {
@@ -28,18 +27,14 @@ using namespace db::state;
2827using namespace datastore ;
2928
3029std::optional<Account> LocalState::read_account (const evmc::address& address) const noexcept {
31- if (!txn_id_) {
32- AccountsDomainGetLatestQuery query{
33- data_store_.chaindata ,
34- tx_,
35- data_store_.state_repository ,
36- };
37- auto result = query.exec (address);
38- if (result) {
39- return std::move (result->value );
40- }
41- } else {
42- // TODO(canepat) historical AccountsDomainGetAsOfQuery on *txn_id timestamp
30+ if (txn_id_) {
31+ // Query historical state at required timestamp
32+ return make_query<AccountsDomainGetAsOfQuery>().exec (address, *txn_id_);
33+ }
34+ // Query latest i.e. current state
35+ auto result = make_query<AccountsDomainGetLatestQuery>().exec (address);
36+ if (result) {
37+ return std::move (result->value );
4338 }
4439 return std::nullopt ;
4540}
@@ -49,39 +44,34 @@ ByteView LocalState::read_code(const evmc::address& address, const evmc::bytes32
4944 return code_[address]; // NOLINT(runtime/arrays)
5045 }
5146
52- if (!txn_id_) {
53- CodeDomainGetLatestQuery query{
54- data_store_.chaindata ,
55- tx_,
56- data_store_.state_repository ,
57- };
58- auto result = query.exec (address);
47+ if (txn_id_) {
48+ // Query historical state at required timestamp
49+ auto result = make_query<CodeDomainGetAsOfQuery>().exec (address, *txn_id_);
5950 if (result) {
60- auto [it, _] = code_.emplace (address, std::move (result-> value ));
51+ auto [it, _] = code_.emplace (address, std::move (* result));
6152 return it->second ;
6253 }
63- } else {
64- // TODO(canepat) historical CodeDomainGetAsOfQuery on *txn_id timestamp
54+ return ByteView{};
55+ }
56+ // Query latest i.e. current state
57+ auto result = make_query<CodeDomainGetLatestQuery>().exec (address);
58+ if (result) {
59+ auto [it, _] = code_.emplace (address, std::move (result->value ));
60+ return it->second ;
6561 }
6662 return ByteView{};
6763}
6864
69- evmc::bytes32 LocalState::read_storage (
70- const evmc::address& address,
71- uint64_t /* incarnation*/ ,
72- const evmc::bytes32& location) const noexcept {
73- if (!txn_id_) {
74- StorageDomainGetLatestQuery query{
75- data_store_.chaindata ,
76- tx_,
77- data_store_.state_repository ,
78- };
79- auto result = query.exec ({address, location});
80- if (result) {
81- return result->value ;
82- }
83- } else {
84- // TODO(canepat) historical StorageDomainGetAsOfQuery on *txn_id timestamp
65+ evmc::bytes32 LocalState::read_storage (const evmc::address& address, uint64_t /* incarnation*/ , const evmc::bytes32& location) const noexcept {
66+ if (txn_id_) {
67+ // Query historical state at required timestamp
68+ auto result = make_query<StorageDomainGetAsOfQuery>().exec ({address, location}, *txn_id_);
69+ return result.value_or (evmc::bytes32{});
70+ }
71+ // Query latest i.e. current state
72+ auto result = make_query<StorageDomainGetLatestQuery>().exec ({address, location});
73+ if (result) {
74+ return result->value ;
8575 }
8676 return {};
8777}
0 commit comments