Skip to content

Commit 1c381c9

Browse files
committed
Semantic state override object.
1 parent e1023a1 commit 1c381c9

File tree

2 files changed

+33
-37
lines changed

2 files changed

+33
-37
lines changed

category/execution/ethereum/state3/state.hpp

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,7 @@ class State
8282
, incarnation_{incarnation}
8383
, relaxed_validation_{relaxed_validation}
8484
{
85-
for (auto const &[addr, state_delta] : state_overrides) {
86-
// address
87-
Address address{};
88-
std::memcpy(address.bytes, addr.data(), sizeof(Address));
89-
85+
for (auto const &[address, state_delta] : state_overrides) {
9086
OriginalAccountState &original_account_state =
9187
this->original_account_state(address);
9288
if (!original_account_state.account_.has_value()) {
@@ -96,39 +92,26 @@ class State
9692
Account &account = original_account_state.account_.value();
9793

9894
if (state_delta.balance.has_value()) {
99-
auto const balance = intx::be::unsafe::load<uint256_t>(
100-
state_delta.balance.value().data());
101-
account.balance = balance;
95+
account.balance = state_delta.balance.value();
10296
}
10397

10498
if (state_delta.nonce.has_value()) {
10599
account.nonce = state_delta.nonce.value();
106100
}
107101

108102
if (state_delta.code.has_value()) {
109-
byte_string const code{
110-
state_delta.code.value().data(),
111-
state_delta.code.value().size()};
103+
auto const code = state_delta.code.value();
112104
auto const code_hash = to_bytes(keccak256(code));
113105
code_[code_hash] = block_state_.vm().try_insert_varcode(
114106
code_hash, vm::make_shared_intercode(code));
115107
account.code_hash = code_hash;
116108
}
117109

118110
auto const update_state =
119-
[&](std::map<byte_string, byte_string> const &diff) {
111+
[&](std::map<bytes32_t, bytes32_t> const &diff) {
120112
for (auto const &[key, value] : diff) {
121-
bytes32_t storage_key;
122-
bytes32_t storage_value;
123-
std::memcpy(
124-
storage_key.bytes, key.data(), sizeof(bytes32_t));
125-
std::memcpy(
126-
storage_value.bytes,
127-
value.data(),
128-
sizeof(bytes32_t));
129-
130113
(void)original_account_state.set_storage(
131-
storage_key, storage_value, bytes32_t{});
114+
key, value, bytes32_t{});
132115
}
133116
};
134117

category/rpc/eth_call.cpp

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ struct monad_state_override
7171
{
7272
struct monad_state_override_object
7373
{
74-
std::optional<byte_string> balance{std::nullopt};
74+
std::optional<uint256_t> balance{std::nullopt};
7575
std::optional<uint64_t> nonce{std::nullopt};
7676
std::optional<byte_string> code{std::nullopt};
77-
std::map<byte_string, byte_string> state{};
78-
std::map<byte_string, byte_string> state_diff{};
77+
std::map<bytes32_t, bytes32_t> state{};
78+
std::map<bytes32_t, bytes32_t> state_diff{};
7979
};
8080

81-
std::map<byte_string, monad_state_override_object> override_sets;
81+
std::map<Address, monad_state_override_object> override_sets;
8282
};
8383

8484
namespace
@@ -195,7 +195,8 @@ void add_override_address(
195195

196196
MONAD_ASSERT(addr);
197197
MONAD_ASSERT(addr_len == sizeof(Address));
198-
byte_string const address{addr, addr + addr_len};
198+
Address address;
199+
std::memcpy(address.bytes, addr, sizeof(Address));
199200

200201
MONAD_ASSERT(m->override_sets.find(address) == m->override_sets.end());
201202
m->override_sets.emplace(address, StateOverrideObj{});
@@ -210,11 +211,13 @@ void set_override_balance(
210211

211212
MONAD_ASSERT(addr);
212213
MONAD_ASSERT(addr_len == sizeof(Address));
213-
byte_string const address{addr, addr + addr_len};
214+
Address address;
215+
std::memcpy(address.bytes, addr, sizeof(Address));
214216
MONAD_ASSERT(m->override_sets.find(address) != m->override_sets.end());
215217

216218
MONAD_ASSERT(balance);
217-
byte_string const b{balance, balance + balance_len};
219+
MONAD_ASSERT(balance_len == sizeof(uint256_t));
220+
uint256_t const b = intx::be::unsafe::load<uint256_t>(balance);
218221
m->override_sets[address].balance = std::move(b);
219222
}
220223

@@ -226,7 +229,8 @@ void set_override_nonce(
226229

227230
MONAD_ASSERT(addr);
228231
MONAD_ASSERT(addr_len == sizeof(Address));
229-
byte_string const address{addr, addr + addr_len};
232+
Address address;
233+
std::memcpy(address.bytes, addr, sizeof(Address));
230234
MONAD_ASSERT(m->override_sets.find(address) != m->override_sets.end());
231235

232236
m->override_sets[address].nonce = nonce;
@@ -240,7 +244,8 @@ void set_override_code(
240244

241245
MONAD_ASSERT(addr);
242246
MONAD_ASSERT(addr_len == sizeof(Address));
243-
byte_string const address{addr, addr + addr_len};
247+
Address address;
248+
std::memcpy(address.bytes, addr, sizeof(Address));
244249
MONAD_ASSERT(m->override_sets.find(address) != m->override_sets.end());
245250

246251
MONAD_ASSERT(code);
@@ -257,15 +262,19 @@ void set_override_state_diff(
257262

258263
MONAD_ASSERT(addr);
259264
MONAD_ASSERT(addr_len == sizeof(Address));
260-
byte_string const address{addr, addr + addr_len};
265+
Address address;
266+
std::memcpy(address.bytes, addr, sizeof(Address));
261267
MONAD_ASSERT(m->override_sets.find(address) != m->override_sets.end());
262268

263269
MONAD_ASSERT(key);
264270
MONAD_ASSERT(key_len == sizeof(bytes32_t));
265-
byte_string const k{key, key + key_len};
271+
bytes32_t k;
272+
std::memcpy(k.bytes, key, sizeof(bytes32_t));
266273

267274
MONAD_ASSERT(value);
268-
byte_string const v{value, value + value_len};
275+
MONAD_ASSERT(value_len == sizeof(bytes32_t));
276+
bytes32_t v;
277+
std::memcpy(v.bytes, value, sizeof(bytes32_t));
269278

270279
auto &state_object = m->override_sets[address].state_diff;
271280
MONAD_ASSERT(state_object.find(k) == state_object.end());
@@ -281,15 +290,19 @@ void set_override_state(
281290

282291
MONAD_ASSERT(addr);
283292
MONAD_ASSERT(addr_len == sizeof(Address));
284-
byte_string const address{addr, addr + addr_len};
293+
Address address;
294+
std::memcpy(address.bytes, addr, sizeof(Address));
285295
MONAD_ASSERT(m->override_sets.find(address) != m->override_sets.end());
286296

287297
MONAD_ASSERT(key);
288298
MONAD_ASSERT(key_len == sizeof(bytes32_t));
289-
byte_string const k{key, key + key_len};
299+
bytes32_t k;
300+
std::memcpy(k.bytes, key, sizeof(bytes32_t));
290301

291302
MONAD_ASSERT(value);
292-
byte_string const v{value, value + value_len};
303+
MONAD_ASSERT(value_len == sizeof(bytes32_t));
304+
bytes32_t v;
305+
std::memcpy(v.bytes, value, sizeof(bytes32_t));
293306

294307
auto &state_object = m->override_sets[address].state;
295308
MONAD_ASSERT(state_object.find(k) == state_object.end());

0 commit comments

Comments
 (0)