@@ -125,7 +125,7 @@ EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm):
125
125
else
126
126
assertThrow (false , Exception, " Unsupported EVM version" );
127
127
128
- tx_context.block_difficulty = evmc::uint256be{200000000 };
128
+ tx_context.block_prev_randao = evmc::uint256be{200000000 }; // TODO: should make it >2**64 for >Paris
129
129
tx_context.block_gas_limit = 20000000 ;
130
130
tx_context.block_coinbase = 0x7878787878787878787878787878787878787878_address;
131
131
tx_context.tx_gas_price = evmc::uint256be{3000000000 };
@@ -145,7 +145,6 @@ EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm):
145
145
void EVMHost::reset ()
146
146
{
147
147
accounts.clear ();
148
- m_currentAddress = {};
149
148
// Clear self destruct records
150
149
recorded_selfdestructs.clear ();
151
150
// Clear call records
@@ -194,14 +193,14 @@ void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recip
194
193
_recipient.balance = convertToEVMC (u256 (convertFromEVMC (_recipient.balance )) + _value);
195
194
}
196
195
197
- void EVMHost::selfdestruct (const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
196
+ bool EVMHost::selfdestruct (const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
198
197
{
199
198
// TODO actual selfdestruct is even more complicated.
200
199
201
200
transfer (accounts[_addr], accounts[_beneficiary], convertFromEVMC (accounts[_addr].balance ));
202
201
203
202
// Record self destructs. Clearing will be done in newTransactionFrame().
204
- MockedHost::selfdestruct (_addr, _beneficiary);
203
+ return MockedHost::selfdestruct (_addr, _beneficiary);
205
204
}
206
205
207
206
void EVMHost::recordCalls (evmc_message const & _message) noexcept
@@ -212,34 +211,34 @@ void EVMHost::recordCalls(evmc_message const& _message) noexcept
212
211
213
212
// NOTE: this is used for both internal and external calls.
214
213
// External calls are triggered from ExecutionFramework and contain only EVMC_CREATE or EVMC_CALL.
215
- evmc::result EVMHost::call (evmc_message const & _message) noexcept
214
+ evmc::Result EVMHost::call (evmc_message const & _message) noexcept
216
215
{
217
216
recordCalls (_message);
218
- if (_message.destination == 0x0000000000000000000000000000000000000001_address)
217
+ if (_message.recipient == 0x0000000000000000000000000000000000000001_address)
219
218
return precompileECRecover (_message);
220
- else if (_message.destination == 0x0000000000000000000000000000000000000002_address)
219
+ else if (_message.recipient == 0x0000000000000000000000000000000000000002_address)
221
220
return precompileSha256 (_message);
222
- else if (_message.destination == 0x0000000000000000000000000000000000000003_address)
221
+ else if (_message.recipient == 0x0000000000000000000000000000000000000003_address)
223
222
return precompileRipeMD160 (_message);
224
- else if (_message.destination == 0x0000000000000000000000000000000000000004_address)
223
+ else if (_message.recipient == 0x0000000000000000000000000000000000000004_address)
225
224
return precompileIdentity (_message);
226
- else if (_message.destination == 0x0000000000000000000000000000000000000005_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
225
+ else if (_message.recipient == 0x0000000000000000000000000000000000000005_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
227
226
return precompileModExp (_message);
228
- else if (_message.destination == 0x0000000000000000000000000000000000000006_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
227
+ else if (_message.recipient == 0x0000000000000000000000000000000000000006_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
229
228
{
230
229
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
231
230
return precompileALTBN128G1Add<EVMC_ISTANBUL>(_message);
232
231
else
233
232
return precompileALTBN128G1Add<EVMC_LONDON>(_message);
234
233
}
235
- else if (_message.destination == 0x0000000000000000000000000000000000000007_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
234
+ else if (_message.recipient == 0x0000000000000000000000000000000000000007_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
236
235
{
237
236
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
238
237
return precompileALTBN128G1Mul<EVMC_ISTANBUL>(_message);
239
238
else
240
239
return precompileALTBN128G1Mul<EVMC_LONDON>(_message);
241
240
}
242
- else if (_message.destination == 0x0000000000000000000000000000000000000008_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
241
+ else if (_message.recipient == 0x0000000000000000000000000000000000000008_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
243
242
{
244
243
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
245
244
return precompileALTBN128PairingProduct<EVMC_ISTANBUL>(_message);
@@ -262,7 +261,7 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
262
261
message.gas -= message.input_data [i] == 0 ? evmasm::GasCosts::txDataZeroGas : evmasm::GasCosts::txDataNonZeroGas (m_evmVersion);
263
262
if (message.gas < 0 )
264
263
{
265
- evmc::result result ({}) ;
264
+ evmc::Result result;
266
265
result.status_code = EVMC_OUT_OF_GAS;
267
266
accounts = stateBackup;
268
267
return result;
@@ -299,8 +298,8 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
299
298
encodedNonce
300
299
), h160::AlignRight);
301
300
302
- message.destination = convertToEVMC (createAddress);
303
- assertThrow (accounts.count (message.destination ) == 0 , Exception, " Account cannot exist" );
301
+ message.recipient = convertToEVMC (createAddress);
302
+ assertThrow (accounts.count (message.recipient ) == 0 , Exception, " Account cannot exist" );
304
303
305
304
code = evmc::bytes (message.input_data , message.input_data + message.input_size );
306
305
}
@@ -313,35 +312,30 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
313
312
keccak256 (bytes (message.input_data , message.input_data + message.input_size )).asBytes ()
314
313
), h160::AlignRight);
315
314
316
- message.destination = convertToEVMC (createAddress);
317
- if (accounts.count (message.destination ) && (
318
- accounts[message.destination ].nonce > 0 ||
319
- !accounts[message.destination ].code .empty ()
315
+ message.recipient = convertToEVMC (createAddress);
316
+ if (accounts.count (message.recipient ) && (
317
+ accounts[message.recipient ].nonce > 0 ||
318
+ !accounts[message.recipient ].code .empty ()
320
319
))
321
320
{
322
- evmc::result result ({}) ;
321
+ evmc::Result result;
323
322
result.status_code = EVMC_OUT_OF_GAS;
324
323
accounts = stateBackup;
325
324
return result;
326
325
}
327
326
328
327
code = evmc::bytes (message.input_data , message.input_data + message.input_size );
329
328
}
330
- else if (message.kind == EVMC_DELEGATECALL || message.kind == EVMC_CALLCODE)
331
- {
332
- code = accounts[message.destination ].code ;
333
- message.destination = m_currentAddress;
334
- }
335
329
else
336
- code = accounts[message.destination ].code ;
330
+ code = accounts[message.code_address ].code ;
337
331
338
- auto & destination = accounts[message.destination ];
332
+ auto & destination = accounts[message.recipient ];
339
333
340
334
if (value != 0 && message.kind != EVMC_DELEGATECALL && message.kind != EVMC_CALLCODE)
341
335
{
342
336
if (value > convertFromEVMC (sender.balance ))
343
337
{
344
- evmc::result result ({}) ;
338
+ evmc::Result result;
345
339
result.status_code = EVMC_INSUFFICIENT_BALANCE;
346
340
accounts = stateBackup;
347
341
return result;
@@ -355,12 +349,9 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
355
349
if (m_evmRevision >= EVMC_BERLIN)
356
350
{
357
351
access_account (message.sender );
358
- access_account (message.destination );
352
+ access_account (message.recipient );
359
353
}
360
- evmc::address currentAddress = m_currentAddress;
361
- m_currentAddress = message.destination ;
362
- evmc::result result = m_vm.execute (*this , m_evmRevision, message, code.data (), code.size ());
363
- m_currentAddress = currentAddress;
354
+ evmc::Result result = m_vm.execute (*this , m_evmRevision, message, code.data (), code.size ());
364
355
365
356
if (message.kind == EVMC_CREATE || message.kind == EVMC_CREATE2)
366
357
{
@@ -373,7 +364,7 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
373
364
}
374
365
else
375
366
{
376
- result.create_address = message.destination ;
367
+ result.create_address = message.recipient ;
377
368
destination.code = evmc::bytes (result.output_data , result.output_data + result.output_size );
378
369
destination.codehash = convertToEVMC (keccak256 ({result.output_data , result.output_size }));
379
370
}
@@ -416,7 +407,7 @@ evmc::bytes32 EVMHost::convertToEVMC(h256 const& _data)
416
407
return d;
417
408
}
418
409
419
- evmc::result EVMHost::precompileECRecover (evmc_message const & _message) noexcept
410
+ evmc::Result EVMHost::precompileECRecover (evmc_message const & _message) noexcept
420
411
{
421
412
// NOTE this is a partial implementation for some inputs.
422
413
@@ -449,20 +440,14 @@ evmc::result EVMHost::precompileECRecover(evmc_message const& _message) noexcept
449
440
}
450
441
}
451
442
};
452
- evmc::result result = precompileGeneric (_message, inputOutput);
443
+ evmc::Result result = precompileGeneric (_message, inputOutput);
453
444
// ECRecover will return success with empty response in case of failure
454
445
if (result.status_code != EVMC_SUCCESS && result.status_code != EVMC_OUT_OF_GAS)
455
- // return resultWithGas(_message.gas, gas_cost, {});
456
- {
457
- result.status_code = EVMC_SUCCESS;
458
- result.gas_left = _message.gas - gas_cost;
459
- result.output_data = {};
460
- result.output_size = 0 ;
461
- }
446
+ return resultWithGas (_message.gas , gas_cost, {});
462
447
return result;
463
448
}
464
449
465
- evmc::result EVMHost::precompileSha256 (evmc_message const & _message) noexcept
450
+ evmc::Result EVMHost::precompileSha256 (evmc_message const & _message) noexcept
466
451
{
467
452
// static data so that we do not need a release routine...
468
453
bytes static hash;
@@ -477,7 +462,7 @@ evmc::result EVMHost::precompileSha256(evmc_message const& _message) noexcept
477
462
return resultWithGas (_message.gas , gas_cost, hash);
478
463
}
479
464
480
- evmc::result EVMHost::precompileRipeMD160 (evmc_message const & _message) noexcept
465
+ evmc::Result EVMHost::precompileRipeMD160 (evmc_message const & _message) noexcept
481
466
{
482
467
// NOTE this is a partial implementation for some inputs.
483
468
@@ -579,7 +564,7 @@ evmc::result EVMHost::precompileRipeMD160(evmc_message const& _message) noexcept
579
564
return precompileGeneric (_message, inputOutput);
580
565
}
581
566
582
- evmc::result EVMHost::precompileIdentity (evmc_message const & _message) noexcept
567
+ evmc::Result EVMHost::precompileIdentity (evmc_message const & _message) noexcept
583
568
{
584
569
// static data so that we do not need a release routine...
585
570
bytes static data;
@@ -591,14 +576,14 @@ evmc::result EVMHost::precompileIdentity(evmc_message const& _message) noexcept
591
576
return resultWithGas (_message.gas , gas_cost, data);
592
577
}
593
578
594
- evmc::result EVMHost::precompileModExp (evmc_message const &) noexcept
579
+ evmc::Result EVMHost::precompileModExp (evmc_message const &) noexcept
595
580
{
596
581
// TODO implement
597
582
return resultWithFailure ();
598
583
}
599
584
600
585
template <evmc_revision Revision>
601
- evmc::result EVMHost::precompileALTBN128G1Add (evmc_message const & _message) noexcept
586
+ evmc::Result EVMHost::precompileALTBN128G1Add (evmc_message const & _message) noexcept
602
587
{
603
588
// NOTE this is a partial implementation for some inputs.
604
589
@@ -866,7 +851,7 @@ evmc::result EVMHost::precompileALTBN128G1Add(evmc_message const& _message) noex
866
851
}
867
852
868
853
template <evmc_revision Revision>
869
- evmc::result EVMHost::precompileALTBN128G1Mul (evmc_message const & _message) noexcept
854
+ evmc::Result EVMHost::precompileALTBN128G1Mul (evmc_message const & _message) noexcept
870
855
{
871
856
// NOTE this is a partial implementation for some inputs.
872
857
@@ -956,7 +941,7 @@ evmc::result EVMHost::precompileALTBN128G1Mul(evmc_message const& _message) noex
956
941
}
957
942
958
943
template <evmc_revision Revision>
959
- evmc::result EVMHost::precompileALTBN128PairingProduct (evmc_message const & _message) noexcept
944
+ evmc::Result EVMHost::precompileALTBN128PairingProduct (evmc_message const & _message) noexcept
960
945
{
961
946
// Base + per pairing gas.
962
947
constexpr auto calc_cost = [](unsigned points) -> int64_t {
@@ -1124,7 +1109,7 @@ evmc::result EVMHost::precompileALTBN128PairingProduct(evmc_message const& _mess
1124
1109
return precompileGeneric (_message, inputOutput);
1125
1110
}
1126
1111
1127
- evmc::result EVMHost::precompileGeneric (
1112
+ evmc::Result EVMHost::precompileGeneric (
1128
1113
evmc_message const & _message,
1129
1114
map<bytes, EVMPrecompileOutput> const & _inOut) noexcept
1130
1115
{
@@ -1138,20 +1123,20 @@ evmc::result EVMHost::precompileGeneric(
1138
1123
return resultWithFailure ();
1139
1124
}
1140
1125
1141
- evmc::result EVMHost::resultWithFailure () noexcept
1126
+ evmc::Result EVMHost::resultWithFailure () noexcept
1142
1127
{
1143
- evmc::result result ({}) ;
1128
+ evmc::Result result;
1144
1129
result.status_code = EVMC_FAILURE;
1145
1130
return result;
1146
1131
}
1147
1132
1148
- evmc::result EVMHost::resultWithGas (
1133
+ evmc::Result EVMHost::resultWithGas (
1149
1134
int64_t gas_limit,
1150
1135
int64_t gas_required,
1151
1136
bytes const & _data
1152
1137
) noexcept
1153
1138
{
1154
- evmc::result result ({}) ;
1139
+ evmc::Result result;
1155
1140
if (gas_limit < gas_required)
1156
1141
{
1157
1142
result.status_code = EVMC_OUT_OF_GAS;
@@ -1162,7 +1147,7 @@ evmc::result EVMHost::resultWithGas(
1162
1147
result.status_code = EVMC_SUCCESS;
1163
1148
result.gas_left = gas_limit - gas_required;
1164
1149
}
1165
- result.output_data = _data.data ();
1150
+ result.output_data = _data.empty () ? nullptr : _data. data ();
1166
1151
result.output_size = _data.size ();
1167
1152
return result;
1168
1153
}
@@ -1209,10 +1194,11 @@ void EVMHostPrinter::balance()
1209
1194
void EVMHostPrinter::selfdestructRecords ()
1210
1195
{
1211
1196
for (auto const & record: m_host.recorded_selfdestructs )
1212
- m_stateStream << " SELFDESTRUCT"
1213
- << " BENEFICIARY "
1214
- << m_host.convertFromEVMC (record.beneficiary )
1215
- << endl;
1197
+ for (auto const & beneficiary: record.second )
1198
+ m_stateStream << " SELFDESTRUCT"
1199
+ << " BENEFICIARY "
1200
+ << m_host.convertFromEVMC (beneficiary)
1201
+ << endl;
1216
1202
}
1217
1203
1218
1204
void EVMHostPrinter::callRecords ()
0 commit comments