EVMHost: Use recorded_logs from MockedHost

This commit is contained in:
Paweł Bylica 2019-11-28 11:38:47 +01:00 committed by Alex Beregszaszi
parent 1718250248
commit 2683c83ad2
4 changed files with 11 additions and 41 deletions

View File

@ -250,23 +250,6 @@ evmc::bytes32 EVMHost::get_block_hash(int64_t _number) const noexcept
return convertToEVMC(u256("0x3737373737373737373737373737373737373737373737373737373737373737") + _number); return convertToEVMC(u256("0x3737373737373737373737373737373737373737373737373737373737373737") + _number);
} }
void EVMHost::emit_log(
evmc::address const& _addr,
uint8_t const* _data,
size_t _dataSize,
evmc::bytes32 const _topics[],
size_t _topicsCount
) noexcept
{
LogEntry entry;
entry.address = convertFromEVMC(_addr);
for (size_t i = 0; i < _topicsCount; ++i)
entry.topics.emplace_back(convertFromEVMC(_topics[i]));
entry.data = bytes(_data, _data + _dataSize);
m_state.logs.emplace_back(std::move(entry));
}
Address EVMHost::convertFromEVMC(evmc::address const& _addr) Address EVMHost::convertFromEVMC(evmc::address const& _addr)
{ {
return Address(bytes(begin(_addr.bytes), end(_addr.bytes))); return Address(bytes(begin(_addr.bytes), end(_addr.bytes)));

View File

@ -54,19 +54,11 @@ public:
std::map<evmc::bytes32, evmc::bytes32> storage; std::map<evmc::bytes32, evmc::bytes32> storage;
}; };
struct LogEntry
{
Address address;
std::vector<h256> topics;
bytes data;
};
struct State struct State
{ {
size_t blockNumber; size_t blockNumber;
uint64_t timestamp; uint64_t timestamp;
std::map<evmc::address, Account> accounts; std::map<evmc::address, Account> accounts;
std::vector<LogEntry> logs;
}; };
Account const* account(evmc::address const& _address) const Account const* account(evmc::address const& _address) const
@ -86,7 +78,7 @@ public:
{ {
m_state.blockNumber++; m_state.blockNumber++;
m_state.timestamp += 15; m_state.timestamp += 15;
m_state.logs.clear(); recorded_logs.clear();
} }
bool account_exists(evmc::address const& _addr) const noexcept final bool account_exists(evmc::address const& _addr) const noexcept final
@ -154,14 +146,6 @@ public:
evmc::bytes32 get_block_hash(int64_t number) const noexcept; evmc::bytes32 get_block_hash(int64_t number) const noexcept;
void emit_log(
evmc::address const& _addr,
uint8_t const* _data,
size_t _dataSize,
evmc::bytes32 const _topics[],
size_t _topicsCount
) noexcept;
static Address convertFromEVMC(evmc::address const& _addr); static Address convertFromEVMC(evmc::address const& _addr);
static evmc::address convertToEVMC(Address const& _addr); static evmc::address convertToEVMC(Address const& _addr);
static h256 convertFromEVMC(evmc::bytes32 const& _data); static h256 convertFromEVMC(evmc::bytes32 const& _data);

View File

@ -201,27 +201,30 @@ bool ExecutionFramework::addressHasCode(Address const& _addr)
size_t ExecutionFramework::numLogs() const size_t ExecutionFramework::numLogs() const
{ {
return m_evmHost->m_state.logs.size(); return m_evmHost->recorded_logs.size();
} }
size_t ExecutionFramework::numLogTopics(size_t _logIdx) const size_t ExecutionFramework::numLogTopics(size_t _logIdx) const
{ {
return m_evmHost->m_state.logs.at(_logIdx).topics.size(); return m_evmHost->recorded_logs.at(_logIdx).topics.size();
} }
h256 ExecutionFramework::logTopic(size_t _logIdx, size_t _topicIdx) const h256 ExecutionFramework::logTopic(size_t _logIdx, size_t _topicIdx) const
{ {
return m_evmHost->m_state.logs.at(_logIdx).topics.at(_topicIdx); return EVMHost::convertFromEVMC(m_evmHost->recorded_logs.at(_logIdx).topics.at(_topicIdx));
} }
Address ExecutionFramework::logAddress(size_t _logIdx) const Address ExecutionFramework::logAddress(size_t _logIdx) const
{ {
return m_evmHost->m_state.logs.at(_logIdx).address; return EVMHost::convertFromEVMC(m_evmHost->recorded_logs.at(_logIdx).creator);
} }
bytes const& ExecutionFramework::logData(size_t _logIdx) const bytes ExecutionFramework::logData(size_t _logIdx) const
{ {
return m_evmHost->m_state.logs.at(_logIdx).data; const auto& data = m_evmHost->recorded_logs.at(_logIdx).data;
// TODO: Return a copy of log data, because this is expected from REQUIRE_LOG_DATA(),
// but reference type like string_view would be preferable.
return {data.begin(), data.end()};
} }
u256 ExecutionFramework::balanceAt(Address const& _addr) u256 ExecutionFramework::balanceAt(Address const& _addr)

View File

@ -266,7 +266,7 @@ protected:
size_t numLogTopics(size_t _logIdx) const; size_t numLogTopics(size_t _logIdx) const;
h256 logTopic(size_t _logIdx, size_t _topicIdx) const; h256 logTopic(size_t _logIdx, size_t _topicIdx) const;
Address logAddress(size_t _logIdx) const; Address logAddress(size_t _logIdx) const;
bytes const& logData(size_t _logIdx) const; bytes logData(size_t _logIdx) const;
langutil::EVMVersion m_evmVersion; langutil::EVMVersion m_evmVersion;
solidity::OptimiserSettings m_optimiserSettings = solidity::OptimiserSettings::minimal(); solidity::OptimiserSettings m_optimiserSettings = solidity::OptimiserSettings::minimal();