Merge pull request #13594 from ethereum/evmc-selfdestruct

EVMHost: implement selfdestruct better
This commit is contained in:
Kamil Śliwak 2022-10-21 21:07:22 +02:00 committed by GitHub
commit b4c85c6d37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 8 deletions

View File

@ -170,7 +170,7 @@ void EVMHost::reset()
} }
} }
void EVMHost::resetWarmAccess() void EVMHost::newTransactionFrame()
{ {
// Clear EIP-2929 account access indicator // Clear EIP-2929 account access indicator
recorded_account_accesses.clear(); recorded_account_accesses.clear();
@ -178,6 +178,10 @@ void EVMHost::resetWarmAccess()
for (auto& [address, account]: accounts) for (auto& [address, account]: accounts)
for (auto& [slot, value]: account.storage) for (auto& [slot, value]: account.storage)
value.access_status = EVMC_ACCESS_COLD; value.access_status = EVMC_ACCESS_COLD;
// Process selfdestruct list
for (auto& [address, _]: recorded_selfdestructs)
accounts.erase(address);
recorded_selfdestructs.clear();
} }
void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept 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
void EVMHost::selfdestruct(const evmc::address& _addr, const evmc::address& _beneficiary) noexcept void EVMHost::selfdestruct(const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
{ {
// TODO actual selfdestruct is even more complicated. // TODO actual selfdestruct is even more complicated.
// TODO reuse MockedHost::selfdestruct.
transfer(accounts[_addr], accounts[_beneficiary], convertFromEVMC(accounts[_addr].balance)); transfer(accounts[_addr], accounts[_beneficiary], convertFromEVMC(accounts[_addr].balance));
accounts.erase(_addr);
// Record self destructs // Record self destructs. Clearing will be done in newTransactionFrame().
recorded_selfdestructs.push_back({_addr, _beneficiary}); MockedHost::selfdestruct(_addr, _beneficiary);
} }
void EVMHost::recordCalls(evmc_message const& _message) noexcept void EVMHost::recordCalls(evmc_message const& _message) noexcept

View File

@ -82,7 +82,7 @@ public:
tx_context.block_number++; tx_context.block_number++;
tx_context.block_timestamp += 15; tx_context.block_timestamp += 15;
recorded_logs.clear(); recorded_logs.clear();
resetWarmAccess(); newTransactionFrame();
} }
/// @returns contents of storage at @param _addr. /// @returns contents of storage at @param _addr.
@ -98,8 +98,9 @@ private:
/// Transfer value between accounts. Checks for sufficient balance. /// Transfer value between accounts. Checks for sufficient balance.
void transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept; void transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept;
/// Clears EIP-2929 account and storage access indicator /// Start a new transaction frame.
void resetWarmAccess(); /// This will perform selfdestructs and clear account/storage access indicator for EIP-2929.
void newTransactionFrame();
/// Records calls made via @param _message. /// Records calls made via @param _message.
void recordCalls(evmc_message const& _message) noexcept; void recordCalls(evmc_message const& _message) noexcept;