@@ -122,10 +122,15 @@ EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm):
122
122
m_evmRevision = EVMC_BERLIN;
123
123
else if (_evmVersion == langutil::EVMVersion::london ())
124
124
m_evmRevision = EVMC_LONDON;
125
+ // TODO: support EVMVersion::paris()
125
126
else
126
127
assertThrow (false , Exception, " Unsupported EVM version" );
127
128
128
- tx_context.block_difficulty = evmc::uint256be{200000000 };
129
+ if (m_evmRevision >= EVMC_PARIS)
130
+ // This is the value from the merge block.
131
+ tx_context.block_prev_randao = 0xa86c2e601b6c44eb4848f7d23d9df3113fbcac42041c49cbed5000cb4f118777_bytes32;
132
+ else
133
+ tx_context.block_prev_randao = evmc::uint256be{200000000 };
129
134
tx_context.block_gas_limit = 20000000 ;
130
135
tx_context.block_coinbase = 0x7878787878787878787878787878787878787878_address;
131
136
tx_context.tx_gas_price = evmc::uint256be{3000000000 };
@@ -145,7 +150,6 @@ EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm):
145
150
void EVMHost::reset ()
146
151
{
147
152
accounts.clear ();
148
- m_currentAddress = {};
149
153
// Clear self destruct records
150
154
recorded_selfdestructs.clear ();
151
155
// Clear call records
@@ -194,14 +198,14 @@ void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recip
194
198
_recipient.balance = convertToEVMC (u256 (convertFromEVMC (_recipient.balance )) + _value);
195
199
}
196
200
197
- void EVMHost::selfdestruct (const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
201
+ bool EVMHost::selfdestruct (const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
198
202
{
199
203
// TODO actual selfdestruct is even more complicated.
200
204
201
205
transfer (accounts[_addr], accounts[_beneficiary], convertFromEVMC (accounts[_addr].balance ));
202
206
203
207
// Record self destructs. Clearing will be done in newTransactionFrame().
204
- MockedHost::selfdestruct (_addr, _beneficiary);
208
+ return MockedHost::selfdestruct (_addr, _beneficiary);
205
209
}
206
210
207
211
void EVMHost::recordCalls (evmc_message const & _message) noexcept
@@ -212,34 +216,34 @@ void EVMHost::recordCalls(evmc_message const& _message) noexcept
212
216
213
217
// NOTE: this is used for both internal and external calls.
214
218
// External calls are triggered from ExecutionFramework and contain only EVMC_CREATE or EVMC_CALL.
215
- evmc::result EVMHost::call (evmc_message const & _message) noexcept
219
+ evmc::Result EVMHost::call (evmc_message const & _message) noexcept
216
220
{
217
221
recordCalls (_message);
218
- if (_message.destination == 0x0000000000000000000000000000000000000001_address)
222
+ if (_message.recipient == 0x0000000000000000000000000000000000000001_address)
219
223
return precompileECRecover (_message);
220
- else if (_message.destination == 0x0000000000000000000000000000000000000002_address)
224
+ else if (_message.recipient == 0x0000000000000000000000000000000000000002_address)
221
225
return precompileSha256 (_message);
222
- else if (_message.destination == 0x0000000000000000000000000000000000000003_address)
226
+ else if (_message.recipient == 0x0000000000000000000000000000000000000003_address)
223
227
return precompileRipeMD160 (_message);
224
- else if (_message.destination == 0x0000000000000000000000000000000000000004_address)
228
+ else if (_message.recipient == 0x0000000000000000000000000000000000000004_address)
225
229
return precompileIdentity (_message);
226
- else if (_message.destination == 0x0000000000000000000000000000000000000005_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
230
+ else if (_message.recipient == 0x0000000000000000000000000000000000000005_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
227
231
return precompileModExp (_message);
228
- else if (_message.destination == 0x0000000000000000000000000000000000000006_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
232
+ else if (_message.recipient == 0x0000000000000000000000000000000000000006_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
229
233
{
230
234
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
231
235
return precompileALTBN128G1Add<EVMC_ISTANBUL>(_message);
232
236
else
233
237
return precompileALTBN128G1Add<EVMC_LONDON>(_message);
234
238
}
235
- else if (_message.destination == 0x0000000000000000000000000000000000000007_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
239
+ else if (_message.recipient == 0x0000000000000000000000000000000000000007_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
236
240
{
237
241
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
238
242
return precompileALTBN128G1Mul<EVMC_ISTANBUL>(_message);
239
243
else
240
244
return precompileALTBN128G1Mul<EVMC_LONDON>(_message);
241
245
}
242
- else if (_message.destination == 0x0000000000000000000000000000000000000008_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
246
+ else if (_message.recipient == 0x0000000000000000000000000000000000000008_address && m_evmVersion >= langutil::EVMVersion::byzantium ())
243
247
{
244
248
if (m_evmVersion <= langutil::EVMVersion::istanbul ())
245
249
return precompileALTBN128PairingProduct<EVMC_ISTANBUL>(_message);
@@ -262,7 +266,7 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
262
266
message.gas -= message.input_data [i] == 0 ? evmasm::GasCosts::txDataZeroGas : evmasm::GasCosts::txDataNonZeroGas (m_evmVersion);
263
267
if (message.gas < 0 )
264
268
{
265
- evmc::result result ({}) ;
269
+ evmc::Result result;
266
270
result.status_code = EVMC_OUT_OF_GAS;
267
271
accounts = stateBackup;
268
272
return result;
@@ -299,8 +303,8 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
299
303
encodedNonce
300
304
), h160::AlignRight);
301
305
302
- message.destination = convertToEVMC (createAddress);
303
- assertThrow (accounts.count (message.destination ) == 0 , Exception, " Account cannot exist" );
306
+ message.recipient = convertToEVMC (createAddress);
307
+ assertThrow (accounts.count (message.recipient ) == 0 , Exception, " Account cannot exist" );
304
308
305
309
code = evmc::bytes (message.input_data , message.input_data + message.input_size );
306
310
}
@@ -313,35 +317,30 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
313
317
keccak256 (bytes (message.input_data , message.input_data + message.input_size )).asBytes ()
314
318
), h160::AlignRight);
315
319
316
- message.destination = convertToEVMC (createAddress);
317
- if (accounts.count (message.destination ) && (
318
- accounts[message.destination ].nonce > 0 ||
319
- !accounts[message.destination ].code .empty ()
320
+ message.recipient = convertToEVMC (createAddress);
321
+ if (accounts.count (message.recipient ) && (
322
+ accounts[message.recipient ].nonce > 0 ||
323
+ !accounts[message.recipient ].code .empty ()
320
324
))
321
325
{
322
- evmc::result result ({}) ;
326
+ evmc::Result result;
323
327
result.status_code = EVMC_OUT_OF_GAS;
324
328
accounts = stateBackup;
325
329
return result;
326
330
}
327
331
328
332
code = evmc::bytes (message.input_data , message.input_data + message.input_size );
329
333
}
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
334
else
336
- code = accounts[message.destination ].code ;
335
+ code = accounts[message.code_address ].code ;
337
336
338
- auto & destination = accounts[message.destination ];
337
+ auto & destination = accounts[message.recipient ];
339
338
340
339
if (value != 0 && message.kind != EVMC_DELEGATECALL && message.kind != EVMC_CALLCODE)
341
340
{
342
341
if (value > convertFromEVMC (sender.balance ))
343
342
{
344
- evmc::result result ({}) ;
343
+ evmc::Result result;
345
344
result.status_code = EVMC_INSUFFICIENT_BALANCE;
346
345
accounts = stateBackup;
347
346
return result;
@@ -355,12 +354,9 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
355
354
if (m_evmRevision >= EVMC_BERLIN)
356
355
{
357
356
access_account (message.sender );
358
- access_account (message.destination );
357
+ access_account (message.recipient );
359
358
}
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;
359
+ evmc::Result result = m_vm.execute (*this , m_evmRevision, message, code.data (), code.size ());
364
360
365
361
if (message.kind == EVMC_CREATE || message.kind == EVMC_CREATE2)
366
362
{
@@ -373,7 +369,7 @@ evmc::result EVMHost::call(evmc_message const& _message) noexcept
373
369
}
374
370
else
375
371
{
376
- result.create_address = message.destination ;
372
+ result.create_address = message.recipient ;
377
373
destination.code = evmc::bytes (result.output_data , result.output_data + result.output_size );
378
374
destination.codehash = convertToEVMC (keccak256 ({result.output_data , result.output_size }));
379
375
}
@@ -416,7 +412,7 @@ evmc::bytes32 EVMHost::convertToEVMC(h256 const& _data)
416
412
return d;
417
413
}
418
414
419
- evmc::result EVMHost::precompileECRecover (evmc_message const & _message) noexcept
415
+ evmc::Result EVMHost::precompileECRecover (evmc_message const & _message) noexcept
420
416
{
421
417
// NOTE this is a partial implementation for some inputs.
422
418
@@ -449,20 +445,14 @@ evmc::result EVMHost::precompileECRecover(evmc_message const& _message) noexcept
449
445
}
450
446
}
451
447
};
452
- evmc::result result = precompileGeneric (_message, inputOutput);
448
+ evmc::Result result = precompileGeneric (_message, inputOutput);
453
449
// ECRecover will return success with empty response in case of failure
454
450
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
- }
451
+ return resultWithGas (_message.gas , gas_cost, {});
462
452
return result;
463
453
}
464
454
465
- evmc::result EVMHost::precompileSha256 (evmc_message const & _message) noexcept
455
+ evmc::Result EVMHost::precompileSha256 (evmc_message const & _message) noexcept
466
456
{
467
457
// static data so that we do not need a release routine...
468
458
bytes static hash;
@@ -477,7 +467,7 @@ evmc::result EVMHost::precompileSha256(evmc_message const& _message) noexcept
477
467
return resultWithGas (_message.gas , gas_cost, hash);
478
468
}
479
469
480
- evmc::result EVMHost::precompileRipeMD160 (evmc_message const & _message) noexcept
470
+ evmc::Result EVMHost::precompileRipeMD160 (evmc_message const & _message) noexcept
481
471
{
482
472
// NOTE this is a partial implementation for some inputs.
483
473
@@ -579,7 +569,7 @@ evmc::result EVMHost::precompileRipeMD160(evmc_message const& _message) noexcept
579
569
return precompileGeneric (_message, inputOutput);
580
570
}
581
571
582
- evmc::result EVMHost::precompileIdentity (evmc_message const & _message) noexcept
572
+ evmc::Result EVMHost::precompileIdentity (evmc_message const & _message) noexcept
583
573
{
584
574
// static data so that we do not need a release routine...
585
575
bytes static data;
@@ -591,14 +581,14 @@ evmc::result EVMHost::precompileIdentity(evmc_message const& _message) noexcept
591
581
return resultWithGas (_message.gas , gas_cost, data);
592
582
}
593
583
594
- evmc::result EVMHost::precompileModExp (evmc_message const &) noexcept
584
+ evmc::Result EVMHost::precompileModExp (evmc_message const &) noexcept
595
585
{
596
586
// TODO implement
597
587
return resultWithFailure ();
598
588
}
599
589
600
590
template <evmc_revision Revision>
601
- evmc::result EVMHost::precompileALTBN128G1Add (evmc_message const & _message) noexcept
591
+ evmc::Result EVMHost::precompileALTBN128G1Add (evmc_message const & _message) noexcept
602
592
{
603
593
// NOTE this is a partial implementation for some inputs.
604
594
@@ -866,7 +856,7 @@ evmc::result EVMHost::precompileALTBN128G1Add(evmc_message const& _message) noex
866
856
}
867
857
868
858
template <evmc_revision Revision>
869
- evmc::result EVMHost::precompileALTBN128G1Mul (evmc_message const & _message) noexcept
859
+ evmc::Result EVMHost::precompileALTBN128G1Mul (evmc_message const & _message) noexcept
870
860
{
871
861
// NOTE this is a partial implementation for some inputs.
872
862
@@ -956,7 +946,7 @@ evmc::result EVMHost::precompileALTBN128G1Mul(evmc_message const& _message) noex
956
946
}
957
947
958
948
template <evmc_revision Revision>
959
- evmc::result EVMHost::precompileALTBN128PairingProduct (evmc_message const & _message) noexcept
949
+ evmc::Result EVMHost::precompileALTBN128PairingProduct (evmc_message const & _message) noexcept
960
950
{
961
951
// Base + per pairing gas.
962
952
constexpr auto calc_cost = [](unsigned points) -> int64_t {
@@ -1124,7 +1114,7 @@ evmc::result EVMHost::precompileALTBN128PairingProduct(evmc_message const& _mess
1124
1114
return precompileGeneric (_message, inputOutput);
1125
1115
}
1126
1116
1127
- evmc::result EVMHost::precompileGeneric (
1117
+ evmc::Result EVMHost::precompileGeneric (
1128
1118
evmc_message const & _message,
1129
1119
map<bytes, EVMPrecompileOutput> const & _inOut) noexcept
1130
1120
{
@@ -1138,20 +1128,20 @@ evmc::result EVMHost::precompileGeneric(
1138
1128
return resultWithFailure ();
1139
1129
}
1140
1130
1141
- evmc::result EVMHost::resultWithFailure () noexcept
1131
+ evmc::Result EVMHost::resultWithFailure () noexcept
1142
1132
{
1143
- evmc::result result ({}) ;
1133
+ evmc::Result result;
1144
1134
result.status_code = EVMC_FAILURE;
1145
1135
return result;
1146
1136
}
1147
1137
1148
- evmc::result EVMHost::resultWithGas (
1138
+ evmc::Result EVMHost::resultWithGas (
1149
1139
int64_t gas_limit,
1150
1140
int64_t gas_required,
1151
1141
bytes const & _data
1152
1142
) noexcept
1153
1143
{
1154
- evmc::result result ({}) ;
1144
+ evmc::Result result;
1155
1145
if (gas_limit < gas_required)
1156
1146
{
1157
1147
result.status_code = EVMC_OUT_OF_GAS;
@@ -1162,7 +1152,7 @@ evmc::result EVMHost::resultWithGas(
1162
1152
result.status_code = EVMC_SUCCESS;
1163
1153
result.gas_left = gas_limit - gas_required;
1164
1154
}
1165
- result.output_data = _data.data ();
1155
+ result.output_data = _data.empty () ? nullptr : _data. data ();
1166
1156
result.output_size = _data.size ();
1167
1157
return result;
1168
1158
}
@@ -1209,10 +1199,11 @@ void EVMHostPrinter::balance()
1209
1199
void EVMHostPrinter::selfdestructRecords ()
1210
1200
{
1211
1201
for (auto const & record: m_host.recorded_selfdestructs )
1212
- m_stateStream << " SELFDESTRUCT"
1213
- << " BENEFICIARY "
1214
- << m_host.convertFromEVMC (record.beneficiary )
1215
- << endl;
1202
+ for (auto const & beneficiary: record.second )
1203
+ m_stateStream << " SELFDESTRUCT"
1204
+ << " BENEFICIARY "
1205
+ << m_host.convertFromEVMC (beneficiary)
1206
+ << endl;
1216
1207
}
1217
1208
1218
1209
void EVMHostPrinter::callRecords ()
0 commit comments