Skip to content

Commit 8b70108

Browse files
authored
Merge pull request #13562 from ethereum/evmc-cleanup
EVMHost: Simplify some code and document functions
2 parents 70aa3ae + c967a62 commit 8b70108

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
lines changed

test/EVMHost.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ using namespace solidity::util;
3737
using namespace solidity::test;
3838
using namespace evmc::literals;
3939

40-
using StorageMap = std::map<evmc::bytes32, evmc::storage_value>;
41-
4240
evmc::VM& EVMHost::getVM(string const& _path)
4341
{
4442
static evmc::VM NullVM{nullptr};
@@ -192,6 +190,7 @@ void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recip
192190
void EVMHost::selfdestruct(const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
193191
{
194192
// TODO actual selfdestruct is even more complicated.
193+
// TODO reuse MockedHost::selfdestruct.
195194

196195
transfer(accounts[_addr], accounts[_beneficiary], convertFromEVMC(accounts[_addr].balance));
197196
accounts.erase(_addr);
@@ -205,6 +204,8 @@ void EVMHost::recordCalls(evmc_message const& _message) noexcept
205204
recorded_calls.emplace_back(_message);
206205
}
207206

207+
// NOTE: this is used for both internal and external calls.
208+
// External calls are triggered from ExecutionFramework and contain only EVMC_CREATE or EVMC_CALL.
208209
evmc::result EVMHost::call(evmc_message const& _message) noexcept
209210
{
210211
recordCalls(_message);
@@ -393,8 +394,14 @@ evmc::result EVMHost::precompileECRecover(evmc_message const& _message) noexcept
393394
}
394395
};
395396
evmc::result result = precompileGeneric(_message, inputOutput);
396-
result.status_code = EVMC_SUCCESS;
397-
result.gas_left = _message.gas;
397+
// ECRecover will return success with empty response in case of failure
398+
if (result.status_code != EVMC_SUCCESS)
399+
{
400+
result.status_code = EVMC_SUCCESS;
401+
result.gas_left = _message.gas;
402+
result.output_data = {};
403+
result.output_size = 0;
404+
}
398405
return result;
399406
}
400407

@@ -407,11 +414,7 @@ evmc::result EVMHost::precompileSha256(evmc_message const& _message) noexcept
407414
_message.input_data + _message.input_size
408415
));
409416

410-
evmc::result result({});
411-
result.gas_left = _message.gas;
412-
result.output_data = hash.data();
413-
result.output_size = hash.size();
414-
return result;
417+
return resultWithGas(_message, hash);
415418
}
416419

417420
evmc::result EVMHost::precompileRipeMD160(evmc_message const& _message) noexcept
@@ -485,11 +488,8 @@ evmc::result EVMHost::precompileIdentity(evmc_message const& _message) noexcept
485488
// static data so that we do not need a release routine...
486489
bytes static data;
487490
data = bytes(_message.input_data, _message.input_data + _message.input_size);
488-
evmc::result result({});
489-
result.gas_left = _message.gas;
490-
result.output_data = data.data();
491-
result.output_size = data.size();
492-
return result;
491+
492+
return resultWithGas(_message, data);
493493
}
494494

495495
evmc::result EVMHost::precompileModExp(evmc_message const&) noexcept

test/EVMHost.h

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,30 @@
3535
namespace solidity::test
3636
{
3737
using Address = util::h160;
38+
using StorageMap = std::map<evmc::bytes32, evmc::storage_value>;
3839

3940
class EVMHost: public evmc::MockedHost
4041
{
4142
public:
42-
using MockedHost::get_code_size;
43+
// Verbatim features of MockedHost.
44+
using MockedHost::account_exists;
45+
using MockedHost::get_storage;
46+
using MockedHost::set_storage;
4347
using MockedHost::get_balance;
48+
using MockedHost::get_code_size;
49+
using MockedHost::get_code_hash;
50+
using MockedHost::copy_code;
51+
using MockedHost::get_tx_context;
52+
using MockedHost::emit_log;
53+
using MockedHost::access_account;
54+
using MockedHost::access_storage;
55+
56+
// Modified features of MockedHost.
57+
void selfdestruct(evmc::address const& _addr, evmc::address const& _beneficiary) noexcept final;
58+
evmc::result call(evmc_message const& _message) noexcept final;
59+
evmc::bytes32 get_block_hash(int64_t number) const noexcept final;
60+
61+
// Solidity testing specific features.
4462

4563
/// Tries to dynamically load an evmc vm supporting evm1 or ewasm and caches the loaded VM.
4664
/// @returns vmc::VM(nullptr) on failure.
@@ -55,9 +73,10 @@ class EVMHost: public evmc::MockedHost
5573

5674
explicit EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm);
5775

76+
/// Reset entire state (including accounts).
5877
void reset();
59-
/// Clears EIP-2929 account and storage access indicator
60-
void resetWarmAccess();
78+
79+
/// Start new block.
6180
void newBlock()
6281
{
6382
tx_context.block_number++;
@@ -67,35 +86,21 @@ class EVMHost: public evmc::MockedHost
6786
}
6887

6988
/// @returns contents of storage at @param _addr.
70-
std::map<evmc::bytes32, evmc::storage_value> const& get_address_storage(evmc::address const& _addr);
71-
72-
bool account_exists(evmc::address const& _addr) const noexcept final
73-
{
74-
return evmc::MockedHost::account_exists(_addr);
75-
}
76-
77-
void selfdestruct(evmc::address const& _addr, evmc::address const& _beneficiary) noexcept final;
78-
79-
evmc::result call(evmc_message const& _message) noexcept final;
80-
81-
evmc::bytes32 get_block_hash(int64_t number) const noexcept final;
89+
StorageMap const& get_address_storage(evmc::address const& _addr);
8290

8391
static Address convertFromEVMC(evmc::address const& _addr);
8492
static evmc::address convertToEVMC(Address const& _addr);
8593
static util::h256 convertFromEVMC(evmc::bytes32 const& _data);
8694
static evmc::bytes32 convertToEVMC(util::h256 const& _data);
87-
88-
/// @returns true, if the evmc VM has the given capability.
89-
bool hasCapability(evmc_capabilities capability) const noexcept
90-
{
91-
return m_vm.has_capability(capability);
92-
}
93-
9495
private:
9596
evmc::address m_currentAddress = {};
9697

98+
/// Transfer value between accounts. Checks for sufficient balance.
9799
void transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const& _value) noexcept;
98100

101+
/// Clears EIP-2929 account and storage access indicator
102+
void resetWarmAccess();
103+
99104
/// Records calls made via @param _message.
100105
void recordCalls(evmc_message const& _message) noexcept;
101106

@@ -113,9 +118,9 @@ class EVMHost: public evmc::MockedHost
113118
static evmc::result resultWithGas(evmc_message const& _message, bytes const& _data) noexcept;
114119

115120
evmc::VM& m_vm;
116-
// EVM version requested by the testing tool
121+
/// EVM version requested by the testing tool
117122
langutil::EVMVersion m_evmVersion;
118-
// EVM version requested from EVMC (matches the above)
123+
/// EVM version requested from EVMC (matches the above)
119124
evmc_revision m_evmRevision;
120125
};
121126

0 commit comments

Comments
 (0)