Skip to content

Commit 8fe90f6

Browse files
authored
fix(evm): sstore istanbul gas (#308)
1 parent 23cf85b commit 8fe90f6

File tree

5 files changed

+20
-10
lines changed

5 files changed

+20
-10
lines changed

src/compiler/evm_frontend/evm_imported.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,12 @@ void evmSetSStore(zen::runtime::EVMInstance *Instance,
11421142
return;
11431143
}
11441144
const evmc_message *Msg = Instance->getCurrentMessage();
1145-
evmc_revision Rev = Instance->getRevision();
1145+
const evmc_revision Rev = Instance->getRevision();
1146+
if (Rev >= EVMC_ISTANBUL &&
1147+
Instance->getGas() <= zen::evm::SSTORE_REQUIRED_ISTANBUL) {
1148+
zen::runtime::EVMInstance::triggerInstanceExceptionOnJIT(
1149+
Instance, zen::common::ErrorCode::GasLimitExceeded);
1150+
}
11461151
const auto Key = intx::be::store<evmc::bytes32>(Index);
11471152
const auto Val = intx::be::store<evmc::bytes32>(Value);
11481153

@@ -1157,10 +1162,6 @@ void evmSetSStore(zen::runtime::EVMInstance *Instance,
11571162
const auto [GasCostWarm, GasReFund] = zen::evm::SSTORE_COSTS[Rev][Status];
11581163

11591164
const auto GasCost = GasCostCold + GasCostWarm;
1160-
if ((uint64_t)GasCost > Instance->getGas()) {
1161-
zen::runtime::EVMInstance::triggerInstanceExceptionOnJIT(
1162-
Instance, zen::common::ErrorCode::GasLimitExceeded);
1163-
}
11641165
Instance->chargeGas(GasCost);
11651166
Instance->addGasRefund(GasReFund);
11661167
}

src/evm/gas_storage_cost.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ constexpr auto WORD_COPY_COST = 3;
1818
// Applied from EVMC_TANGERINE_WHISTLE through EVMC_ISTANBUL versions
1919
constexpr auto DELEGATECALL_EXTRA_GAS_TW_TO_ISTANBUL = 600;
2020

21+
// OOG if gas is less than or equal 2300 (since Istanbul fork)
22+
constexpr auto SSTORE_REQUIRED_ISTANBUL = 2300;
23+
2124
struct StorageStoreCost {
2225
int16_t GasCost;
2326
int16_t GasReFund;

src/evm/opcode_handlers.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -786,11 +786,16 @@ void SStoreHandler::doExecute() {
786786
EVM_FRAME_CHECK(Frame);
787787
EVM_SET_EXCEPTION_UNLESS(!Frame->isStaticMode(), EVMC_STATIC_MODE_VIOLATION);
788788

789+
const auto Rev = currentRevision();
790+
if (Rev >= EVMC_ISTANBUL && Frame->Msg.gas <= SSTORE_REQUIRED_ISTANBUL) {
791+
getContext()->setStatus(EVMC_OUT_OF_GAS);
792+
return;
793+
}
794+
789795
EVM_STACK_CHECK(Frame, 2);
790796
const auto Key = intx::be::store<evmc::bytes32>(Frame->pop());
791797
const auto Value = intx::be::store<evmc::bytes32>(Frame->pop());
792798

793-
const auto Rev = currentRevision();
794799
const auto GasCostCold =
795800
(Rev >= EVMC_BERLIN && Frame->Host->access_storage(
796801
Frame->Msg.recipient, Key) == EVMC_ACCESS_COLD)
@@ -803,12 +808,10 @@ void SStoreHandler::doExecute() {
803808
const auto [GasCostWarm, GasReFund] = SSTORE_COSTS[Rev][Status];
804809

805810
const auto GasCost = GasCostCold + GasCostWarm;
806-
if (Frame->Msg.gas < GasCost) {
807-
Frame->Host->set_storage(Frame->Msg.recipient, Key, PrevValue);
808-
Context->setStatus(EVMC_OUT_OF_GAS);
811+
if (!chargeGas(Frame, GasCost)) {
812+
getContext()->setStatus(EVMC_OUT_OF_GAS);
809813
return;
810814
}
811-
Frame->Msg.gas -= GasCost;
812815

813816
// Track refund at Instance level (consolidate all gas refund tracking there)
814817
Context->getInstance()->addGasRefund(GasReFund);

tests/evmone_unittests/EVMOneInterpreterUnitTestsRunList.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ multi_vm/evm.eip2929_extcodehash_oog/external_vm
8787
multi_vm/evm.eip2929_sload_cold/external_vm
8888
multi_vm/evm.eip2929_sload_two_slots/external_vm
8989
multi_vm/evm.eip2929_sload_warm/external_vm
90+
multi_vm/evm.eip2929_sstore_modify_cold/external_vm
9091
multi_vm/evm.eip2929_delegatecall_cold/external_vm
9192
multi_vm/evm.basefee_nominal_case/external_vm
9293
multi_vm/evm.push0/external_vm
@@ -124,6 +125,7 @@ multi_vm/evm.sstore_out_of_block_gas/external_vm
124125
multi_vm/evm.sstore_cost/external_vm
125126
multi_vm/evm.sstore_cost_legacy/external_vm
126127
multi_vm/evm.sstore_cost_net_gas_metering/external_vm
128+
multi_vm/evm.sstore_below_stipend/external_vm
127129
multi_vm/evm.evmone_loaded_program_relocation/external_vm
128130
multi_vm/evm.jumpdest_with_high_offset/external_vm
129131
multi_vm/evm.grow_memory_with_mload/external_vm

tests/evmone_unittests/EVMOneMultipassUnitTestsRunList.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ multi_vm/evm.sstore_out_of_block_gas/external_vm
129129
multi_vm/evm.sstore_cost/external_vm
130130
multi_vm/evm.sstore_cost_legacy/external_vm
131131
multi_vm/evm.sstore_cost_net_gas_metering/external_vm
132+
multi_vm/evm.sstore_below_stipend/external_vm
132133
multi_vm/evm.evmone_loaded_program_relocation/external_vm
133134
multi_vm/evm.jumpdest_with_high_offset/external_vm
134135
multi_vm/evm.grow_memory_with_mload/external_vm

0 commit comments

Comments
 (0)