mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #13594 from ethereum/evmc-selfdestruct
EVMHost: implement selfdestruct better
This commit is contained in:
commit
b4c85c6d37
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user