Skip to content

Commit b4c85c6

Browse files
authored
Merge pull request #13594 from ethereum/evmc-selfdestruct
EVMHost: implement selfdestruct better
2 parents 5c5045e + 24946ec commit b4c85c6

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

test/EVMHost.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,18 @@ void EVMHost::reset()
170170
}
171171
}
172172

173-
void EVMHost::resetWarmAccess()
173+
void EVMHost::newTransactionFrame()
174174
{
175175
// Clear EIP-2929 account access indicator
176176
recorded_account_accesses.clear();
177177
// Clear EIP-2929 storage access indicator
178178
for (auto& [address, account]: accounts)
179179
for (auto& [slot, value]: account.storage)
180180
value.access_status = EVMC_ACCESS_COLD;
181+
// Process selfdestruct list
182+
for (auto& [address, _]: recorded_selfdestructs)
183+
accounts.erase(address);
184+
recorded_selfdestructs.clear();
181185
}
182186

183187
void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept
@@ -190,12 +194,11 @@ void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recip
190194
void EVMHost::selfdestruct(const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
191195
{
192196
// TODO actual selfdestruct is even more complicated.
193-
// TODO reuse MockedHost::selfdestruct.
194197

195198
transfer(accounts[_addr], accounts[_beneficiary], convertFromEVMC(accounts[_addr].balance));
196-
accounts.erase(_addr);
197-
// Record self destructs
198-
recorded_selfdestructs.push_back({_addr, _beneficiary});
199+
200+
// Record self destructs. Clearing will be done in newTransactionFrame().
201+
MockedHost::selfdestruct(_addr, _beneficiary);
199202
}
200203

201204
void EVMHost::recordCalls(evmc_message const& _message) noexcept

test/EVMHost.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class EVMHost: public evmc::MockedHost
8282
tx_context.block_number++;
8383
tx_context.block_timestamp += 15;
8484
recorded_logs.clear();
85-
resetWarmAccess();
85+
newTransactionFrame();
8686
}
8787

8888
/// @returns contents of storage at @param _addr.
@@ -98,8 +98,9 @@ class EVMHost: public evmc::MockedHost
9898
/// Transfer value between accounts. Checks for sufficient balance.
9999
void transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept;
100100

101-
/// Clears EIP-2929 account and storage access indicator
102-
void resetWarmAccess();
101+
/// Start a new transaction frame.
102+
/// This will perform selfdestructs and clear account/storage access indicator for EIP-2929.
103+
void newTransactionFrame();
103104

104105
/// Records calls made via @param _message.
105106
void recordCalls(evmc_message const& _message) noexcept;

0 commit comments

Comments
 (0)