Skip to content

Commit cd80428

Browse files
authored
execution: use domain GetAsOf queries in LocalState (#2686)
1 parent 1ca6a44 commit cd80428

File tree

3 files changed

+35
-40
lines changed

3 files changed

+35
-40
lines changed

silkworm/db/datastore/snapshots/history_get_query.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ struct HistoryGetQuery {
4848

4949
private:
5050
InvertedIndexSeekQuery<TKeyEncoder> timestamp_query_;
51-
FindByTimestampMapQuery<FindByKeySegmentQuery<HistoryAccessorIndexKeyEncoder<TKeyEncoder>, segment::SegmentReader<TValueDecoder>, segment_names>> value_query_;
51+
FindByTimestampMapQuery<FindByKeySegmentQuery<HistoryAccessorIndexKeyEncoder<TKeyEncoder>, TValueDecoder, segment_names>> value_query_;
5252
};
5353

5454
} // namespace silkworm::snapshots

silkworm/execution/local_state.cpp

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
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

2524
namespace silkworm::execution {
@@ -28,18 +27,14 @@ using namespace db::state;
2827
using namespace datastore;
2928

3029
std::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
}

silkworm/execution/local_state.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ class LocalState : public State {
9797
return db::DataModelFactory{data_store_}(tx_);
9898
}
9999

100+
template <typename DomainQuery>
101+
auto make_query() const {
102+
return DomainQuery{data_store_.chaindata, tx_, data_store_.state_repository};
103+
}
104+
100105
std::optional<TxnId> txn_id_;
101106
db::DataStoreRef data_store_;
102107
mutable datastore::kvdb::ROTxnManaged tx_;

0 commit comments

Comments
 (0)