Skip to content

Commit 83abf97

Browse files
committed
adjust syscalls
1 parent 7bcff80 commit 83abf97

File tree

4 files changed

+44
-14
lines changed

4 files changed

+44
-14
lines changed

execution/protocol/block_exec.go

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package protocol
2121

2222
import (
2323
"cmp"
24+
"errors"
2425
"fmt"
2526
"slices"
2627
"time"
@@ -35,6 +36,7 @@ import (
3536
"github.com/erigontech/erigon/common/u256"
3637
"github.com/erigontech/erigon/diagnostics/metrics"
3738
"github.com/erigontech/erigon/execution/chain"
39+
"github.com/erigontech/erigon/execution/protocol/fixedgas"
3840
"github.com/erigontech/erigon/execution/protocol/params"
3941
"github.com/erigontech/erigon/execution/protocol/rules"
4042
"github.com/erigontech/erigon/execution/rlp"
@@ -273,10 +275,24 @@ func SysCallContractWithBlockContext(contract accounts.Address, data []byte, cha
273275
txContext = NewEVMTxContext(msg)
274276
}
275277
evm := vm.NewEVM(blockContext, txContext, ibs, chainConfig, vmConfig)
276-
mdGas := evmtypes.MdGas{
277-
Regular: msg.Gas(),
278-
State: math.MaxUint64,
278+
rules := evm.ChainRules()
279+
igasCalcRes, overflow := fixedgas.IntrinsicGas(fixedgas.IntrinsicGasCalcArgs{
280+
Data: data,
281+
IsContractCreation: msg.To().IsNil(),
282+
IsEIP2: rules.IsHomestead,
283+
IsEIP2028: rules.IsIstanbul,
284+
IsEIP3860: vmConfig.HasEip3860(rules),
285+
IsEIP7623: rules.IsPrague,
286+
IsEIP8037: rules.IsAmsterdam,
287+
})
288+
if overflow {
289+
return nil, errors.New("intrinsic gas calculation overflow in sys call")
279290
}
291+
igas := evmtypes.MdGas{
292+
Regular: igasCalcRes.RegularGas,
293+
State: igasCalcRes.StateGas,
294+
}
295+
mdGas := SplitIntoMdGas(msg.Gas(), SysCallGasLimit, igas, rules)
280296
ret, _, err := evm.Call(
281297
msg.From(),
282298
msg.To(),
@@ -314,10 +330,24 @@ func SysCreate(contract accounts.Address, data []byte, chainConfig *chain.Config
314330
txContext := NewEVMTxContext(msg)
315331
blockContext := NewEVMBlockContext(header, GetHashFn(header, nil), nil, author, chainConfig)
316332
evm := vm.NewEVM(blockContext, txContext, ibs, chainConfig, vmConfig)
317-
mdGas := evmtypes.MdGas{
318-
Regular: msg.Gas(),
319-
State: math.MaxUint64,
333+
rules := evm.ChainRules()
334+
igasCalcRes, overflow := fixedgas.IntrinsicGas(fixedgas.IntrinsicGasCalcArgs{
335+
Data: data,
336+
IsContractCreation: msg.To().IsNil(),
337+
IsEIP2: rules.IsHomestead,
338+
IsEIP2028: rules.IsIstanbul,
339+
IsEIP3860: vmConfig.HasEip3860(rules),
340+
IsEIP7623: rules.IsPrague,
341+
IsEIP8037: rules.IsAmsterdam,
342+
})
343+
if overflow {
344+
return nil, errors.New("intrinsic gas calculation overflow in sys create")
345+
}
346+
igas := evmtypes.MdGas{
347+
Regular: igasCalcRes.RegularGas,
348+
State: igasCalcRes.StateGas,
320349
}
350+
mdGas := SplitIntoMdGas(msg.Gas(), SysCallGasLimit, igas, rules)
321351
ret, _, err := evm.SysCreate(
322352
msg.From(),
323353
msg.Data(),

execution/protocol/md_gas.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ package protocol
1818

1919
import (
2020
"github.com/erigontech/erigon/execution/chain"
21-
"github.com/erigontech/erigon/execution/protocol/params"
2221
"github.com/erigontech/erigon/execution/vm/evmtypes"
2322
)
2423

25-
func SplitIntoMdGas(txnGasLimit uint64, intrinsicGas evmtypes.MdGas, rules *chain.Rules) evmtypes.MdGas {
24+
func SplitIntoMdGas(txnGasLimit uint64, maxTxnGasLimit uint64, intrinsicGas evmtypes.MdGas, rules *chain.Rules) evmtypes.MdGas {
2625
if rules.IsAmsterdam {
2726
//intrinsic_gas = intrinsic_regular_gas + intrinsic_state_gas
2827
//execution_gas = tx.gas - intrinsic_gas
@@ -31,7 +30,7 @@ func SplitIntoMdGas(txnGasLimit uint64, intrinsicGas evmtypes.MdGas, rules *chai
3130
//state_gas_reservoir = execution_gas - gas_left
3231
intrinsicGas := intrinsicGas.Regular + intrinsicGas.State
3332
executionGas := txnGasLimit - intrinsicGas
34-
regularGasBudget := params.MaxTxnGasLimit - intrinsicGas
33+
regularGasBudget := maxTxnGasLimit - intrinsicGas
3534
gasLeft := min(regularGasBudget, executionGas)
3635
stateGasReservoir := executionGas - gasLeft
3736
return evmtypes.MdGas{Regular: gasLeft, State: stateGasReservoir}

execution/protocol/state_transition.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ func (st *StateTransition) ApplyFrame() (*evmtypes.ExecutionResult, error) {
396396
Regular: intrinsicGasResult.RegularGas,
397397
State: intrinsicGasResult.StateGas,
398398
}
399-
st.gasRemaining = SplitIntoMdGas(st.msg.Gas(), imdGas, rules)
399+
st.gasRemaining = SplitIntoMdGas(st.msg.Gas(), params.MaxTxnGasLimit, imdGas, rules)
400400
st.initialGas = st.gasRemaining.Plus(imdGas)
401401

402402
// Execute the preparatory steps for state transition which includes:
@@ -532,7 +532,7 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (result *
532532
Regular: intrinsicGasResult.RegularGas,
533533
State: intrinsicGasResult.StateGas,
534534
}
535-
st.gasRemaining = SplitIntoMdGas(st.msg.Gas(), imdGas, rules)
535+
st.gasRemaining = SplitIntoMdGas(st.msg.Gas(), params.MaxTxnGasLimit, imdGas, rules)
536536
st.initialGas = st.gasRemaining.Plus(imdGas)
537537

538538
verifiedAuthorities, err := st.verifyAuthorities(auths, contractCreation, rules.ChainID.String())

execution/vm/runtime/runtime.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/erigontech/erigon/db/state/execctx"
3737
"github.com/erigontech/erigon/execution/chain"
3838
"github.com/erigontech/erigon/execution/protocol"
39+
"github.com/erigontech/erigon/execution/protocol/params"
3940
"github.com/erigontech/erigon/execution/state"
4041
"github.com/erigontech/erigon/execution/tracing"
4142
"github.com/erigontech/erigon/execution/types"
@@ -155,7 +156,7 @@ func Execute(code, input []byte, cfg *Config, tempdir string) ([]byte, *state.In
155156
sender,
156157
contractAsAddress,
157158
input,
158-
protocol.SplitIntoMdGas(cfg.GasLimit, evmtypes.MdGas{}, rules),
159+
protocol.SplitIntoMdGas(cfg.GasLimit, params.MaxTxnGasLimit, evmtypes.MdGas{}, rules),
159160
cfg.Value,
160161
false, /* bailout */
161162
)
@@ -208,7 +209,7 @@ func Create(input []byte, cfg *Config, blockNr uint64) ([]byte, common.Address,
208209
code, address, leftOverGas, err := vmenv.Create(
209210
sender,
210211
input,
211-
protocol.SplitIntoMdGas(cfg.GasLimit, evmtypes.MdGas{}, rules),
212+
protocol.SplitIntoMdGas(cfg.GasLimit, params.MaxTxnGasLimit, evmtypes.MdGas{}, rules),
212213
cfg.Value,
213214
false,
214215
)
@@ -242,7 +243,7 @@ func Call(address accounts.Address, input []byte, cfg *Config) ([]byte, evmtypes
242243
sender.Address(),
243244
address,
244245
input,
245-
protocol.SplitIntoMdGas(cfg.GasLimit, evmtypes.MdGas{}, rules),
246+
protocol.SplitIntoMdGas(cfg.GasLimit, params.MaxTxnGasLimit, evmtypes.MdGas{}, rules),
246247
cfg.Value,
247248
false, /* bailout */
248249
)

0 commit comments

Comments
 (0)