Convert GasInt to uint64, bump nim-eth and nimbus-eth2 (#2461)
* Convert GasInt to uint64, bump nim-eth and nimbus-eth2 * Bump nimbus-eth2 * int64.high.GasInt instead of 0x7fffffffffffffff.GasInt
This commit is contained in:
parent
e8683692fd
commit
4fa3756860
|
@ -62,7 +62,6 @@ import
|
|||
./beacon_lc_bridge_conf
|
||||
|
||||
from stew/objects import checkedEnumAssign
|
||||
from stew/byteutils import readHexChar
|
||||
from web3/primitives as web3types import BlockHash
|
||||
|
||||
from beacon_chain/gossip_processing/block_processor import newExecutionPayload
|
||||
|
@ -73,10 +72,6 @@ type Hash256 = etypes.Hash256
|
|||
template asEthHash(hash: web3types.BlockHash): Hash256 =
|
||||
Hash256(data: distinctBase(hash))
|
||||
|
||||
# TODO: Ugh why isn't gasLimit and gasUsed a uint64 in nim-eth / nimbus-eth1 :(
|
||||
template unsafeQuantityToInt64(q: Quantity): int64 =
|
||||
int64 q
|
||||
|
||||
proc calculateTransactionData(
|
||||
items: openArray[TypedTransaction]
|
||||
): Hash256 {.raises: [].} =
|
||||
|
@ -125,8 +120,8 @@ proc asPortalBlockData*(
|
|||
logsBloom: distinctBase(payload.logsBloom),
|
||||
difficulty: default(DifficultyInt),
|
||||
number: payload.blockNumber.distinctBase,
|
||||
gasLimit: payload.gasLimit.unsafeQuantityToInt64,
|
||||
gasUsed: payload.gasUsed.unsafeQuantityToInt64,
|
||||
gasLimit: distinctBase(payload.gasLimit),
|
||||
gasUsed: distinctBase(payload.gasUsed),
|
||||
timestamp: payload.timestamp.EthTime,
|
||||
extraData: bytes payload.extraData,
|
||||
mixHash: payload.prevRandao.asEthHash,
|
||||
|
@ -170,8 +165,8 @@ proc asPortalBlockData*(
|
|||
logsBloom: distinctBase(payload.logsBloom),
|
||||
difficulty: default(DifficultyInt),
|
||||
number: payload.blockNumber.distinctBase,
|
||||
gasLimit: payload.gasLimit.unsafeQuantityToInt64,
|
||||
gasUsed: payload.gasUsed.unsafeQuantityToInt64,
|
||||
gasLimit: distinctBase(payload.gasLimit),
|
||||
gasUsed: distinctBase(payload.gasUsed),
|
||||
timestamp: payload.timestamp.EthTime,
|
||||
extraData: bytes payload.extraData,
|
||||
mixHash: payload.prevRandao.asEthHash,
|
||||
|
|
|
@ -245,11 +245,6 @@ proc readValue(reader: var JsonReader[JGenesis], value: var seq[byte])
|
|||
wrapError:
|
||||
value = hexToSeqByte(reader.readValue(string))
|
||||
|
||||
proc readValue(reader: var JsonReader[JGenesis], value: var GasInt)
|
||||
{.gcsafe, raises: [SerializationError, IOError].} =
|
||||
wrapError:
|
||||
value = fromHex[GasInt](reader.readValue(string))
|
||||
|
||||
proc readValue(reader: var JsonReader[JGenesis], value: var EthAddress)
|
||||
{.gcsafe, raises: [SerializationError, IOError].} =
|
||||
wrapError:
|
||||
|
|
|
@ -48,7 +48,7 @@ const
|
|||
GENESIS_MIX_HASH* = ZERO_HASH256
|
||||
GENESIS_EXTRA_DATA* = ""
|
||||
GAS_LIMIT_MINIMUM* = 5000
|
||||
GAS_LIMIT_MAXIMUM* = high(GasInt)
|
||||
GAS_LIMIT_MAXIMUM* = int64.high.GasInt # Maximum the gas limit (2^63-1).
|
||||
DEFAULT_GAS_LIMIT* = 8_000_000
|
||||
|
||||
EMPTY_SHA3* = "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470".toDigest
|
||||
|
|
|
@ -102,10 +102,10 @@ proc gasLimitsGet*(com: CommonRef; parent: BlockHeader; parentLimit: GasInt;
|
|||
|
||||
# VM/exec low/high water marks, optionally provided for packer
|
||||
result.lwmLimit = max(
|
||||
result.minLimit, (result.trgLimit * pc.lwmTrg + 50) div 100)
|
||||
result.minLimit, (result.trgLimit * pc.lwmTrg.GasInt + 50) div 100)
|
||||
|
||||
result.hwmLimit = max(
|
||||
result.trgLimit, (result.maxLimit * pc.hwmMax + 50) div 100)
|
||||
result.trgLimit, (result.maxLimit * pc.hwmMax.GasInt + 50) div 100)
|
||||
|
||||
# override trgLimit, see https://github.com/status-im/nimbus-eth1/issues/1032
|
||||
if com.isLondonOrLater(parent.number+1):
|
||||
|
|
|
@ -165,10 +165,10 @@ proc effectiveGasTip*(tx: Transaction; baseFee: GasPrice): GasPriceEx =
|
|||
## The effective miner gas tip for the globally argument `baseFee`. The
|
||||
## result (which is a price per gas) might well be negative.
|
||||
if tx.txType < TxEip1559:
|
||||
(tx.gasPrice - baseFee.int64).GasPriceEx
|
||||
(tx.gasPrice - baseFee.GasInt).GasPriceEx
|
||||
else:
|
||||
# London, EIP1559
|
||||
min(tx.maxPriorityFeePerGas, tx.maxFeePerGas - baseFee.int64).GasPriceEx
|
||||
min(tx.maxPriorityFeePerGas, tx.maxFeePerGas - baseFee.GasInt).GasPriceEx
|
||||
|
||||
proc effectiveGasTip*(tx: Transaction; baseFee: UInt256): GasPriceEx =
|
||||
## Variant of `effectiveGasTip()`
|
||||
|
|
|
@ -69,6 +69,9 @@ proc validateHeader(
|
|||
if header.timestamp <= parentHeader.timestamp:
|
||||
return err("timestamp must be strictly later than parent")
|
||||
|
||||
if header.gasLimit > GAS_LIMIT_MAXIMUM:
|
||||
return err("gasLimit exceeds GAS_LIMIT_MAXIMUM")
|
||||
|
||||
if com.daoForkSupport and inDAOExtraRange(header.number):
|
||||
if header.extraData != daoForkBlockExtraData:
|
||||
return err("header extra data should be marked DAO")
|
||||
|
|
|
@ -403,8 +403,11 @@ proc addLogEntry*(c: Computation, log: Log) =
|
|||
# some gasRefunded operations still relying
|
||||
# on negative number
|
||||
func getGasRefund*(c: Computation): GasInt =
|
||||
# EIP-2183 guarantee that sum of all child gasRefund
|
||||
# should never go below zero
|
||||
doAssert(c.msg.depth == 0 and c.gasMeter.gasRefunded >= 0)
|
||||
if c.isSuccess:
|
||||
result = c.gasMeter.gasRefunded
|
||||
result = GasInt c.gasMeter.gasRefunded
|
||||
|
||||
# Using `proc` as `selfDestructLen()` might be `proc` in logging mode
|
||||
proc refundSelfDestruct*(c: Computation) =
|
||||
|
|
|
@ -18,15 +18,14 @@ type
|
|||
# The gas cost specification for storage instructions.
|
||||
StorageCostSpec = object
|
||||
netCost : bool # Is this net gas cost metering schedule?
|
||||
warmAccess: uint16 # Storage warm access cost, YP: G_{warmaccess}
|
||||
sset : uint16 # Storage addition cost, YP: G_{sset}
|
||||
reset : uint16 # Storage modification cost, YP: G_{sreset}
|
||||
clear : uint16 # Storage deletion refund, YP: R_{sclear}
|
||||
warmAccess: int16 # Storage warm access cost, YP: G_{warmaccess}
|
||||
sset : int16 # Storage addition cost, YP: G_{sset}
|
||||
reset : int16 # Storage modification cost, YP: G_{sreset}
|
||||
clear : int16 # Storage deletion refund, YP: R_{sclear}
|
||||
|
||||
StorageStoreCost* = object
|
||||
gasCost* : uint16
|
||||
gasRefund*: uint16
|
||||
reduceRefund*: uint16
|
||||
gasCost* : int16
|
||||
gasRefund*: int16
|
||||
|
||||
SstoreCosts* = array[evmc_storage_status, StorageStoreCost]
|
||||
|
||||
|
@ -80,14 +79,14 @@ proc netSStoreCost(e: var SstoreCosts,
|
|||
e[EVMC_STORAGE_ADDED] = StorageStoreCost(gasCost: c.sset , gasRefund: 0)
|
||||
e[EVMC_STORAGE_DELETED] = StorageStoreCost(gasCost: c.reset , gasRefund: c.clear)
|
||||
e[EVMC_STORAGE_MODIFIED] = StorageStoreCost(gasCost: c.reset , gasRefund: 0)
|
||||
e[EVMC_STORAGE_DELETED_ADDED] = StorageStoreCost(gasCost: c.warmAccess, reduceRefund: c.clear)
|
||||
e[EVMC_STORAGE_DELETED_ADDED] = StorageStoreCost(gasCost: c.warmAccess, gasRefund: -c.clear)
|
||||
e[EVMC_STORAGE_MODIFIED_DELETED] = StorageStoreCost(gasCost: c.warmAccess, gasRefund: c.clear)
|
||||
e[EVMC_STORAGE_DELETED_RESTORED] = StorageStoreCost(gasCost: c.warmAccess,
|
||||
gasRefund: c.reset, reduceRefund: c.warmAccess + c.clear)
|
||||
gasRefund: c.reset - c.warmAccess - c.clear)
|
||||
e[EVMC_STORAGE_ADDED_DELETED] = StorageStoreCost(gasCost: c.warmAccess,
|
||||
gasRefund: c.sset, reduceRefund: c.warmAccess)
|
||||
gasRefund: c.sset - c.warmAccess)
|
||||
e[EVMC_STORAGE_MODIFIED_RESTORED] = StorageStoreCost(gasCost: c.warmAccess,
|
||||
gasRefund: c.reset, reduceRefund: c.warmAccess)
|
||||
gasRefund: c.reset - c.warmAccess)
|
||||
|
||||
proc storageStoreCost(): array[EVMFork, SstoreCosts] {.compileTime.} =
|
||||
const tbl = storageCostSpec()
|
||||
|
|
|
@ -54,7 +54,7 @@ type
|
|||
GasInitcodeWord # Payment for each word (rounded up) for initcode
|
||||
GasWarmStorageRead # Transient storage read and write cost.
|
||||
|
||||
GasFeeSchedule = array[GasFeeKind, GasInt]
|
||||
GasFeeSchedule = array[GasFeeKind, Natural]
|
||||
|
||||
GasParams* = object
|
||||
# Yellow Paper, Appendix H - https://ethereum.github.io/yellowpaper/paper.pdf
|
||||
|
@ -97,8 +97,7 @@ type
|
|||
# gasRefund of sstore can be a negative number
|
||||
SStoreGasResult* = object
|
||||
gasCost*: GasInt
|
||||
gasRefund*: GasInt
|
||||
reduceRefund*: GasInt
|
||||
gasRefund*: int64
|
||||
|
||||
CallGasResult = tuple[gasCost, childGasLimit: GasInt]
|
||||
|
||||
|
@ -167,8 +166,8 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
# M(currentMemSize, f, l) = currentMemSize
|
||||
|
||||
let
|
||||
prevWords = GasInt currentMemSize.wordCount
|
||||
newWords = GasInt (memOffset + memLength).wordCount
|
||||
prevWords = currentMemSize.wordCount
|
||||
newWords = (memOffset + memLength).wordCount
|
||||
|
||||
if memLength == 0 or newWords <= prevWords:
|
||||
# Special subcase of memory-expansion cost
|
||||
|
@ -188,7 +187,7 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
(newWords ^ 2) shr 9 # div 512
|
||||
|
||||
# TODO: add logging
|
||||
result = max(newCost - prevCost, 0)
|
||||
result = GasInt(max(newCost - prevCost, 0))
|
||||
|
||||
when fork >= FkTangerine:
|
||||
func `prefix all_but_one_64th`(gas: GasInt): GasInt {.inline.} =
|
||||
|
@ -206,36 +205,36 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
func `prefix gasExp`(value: UInt256): GasInt {.nimcall.} =
|
||||
## Value is the exponent
|
||||
|
||||
result = static FeeSchedule[GasExp]
|
||||
result = GasInt(static FeeSchedule[GasExp])
|
||||
if not value.isZero:
|
||||
result += static(FeeSchedule[GasExpByte]) * (1 + log256(value))
|
||||
result += GasInt(static(FeeSchedule[GasExpByte]) * (1 + log256(value)))
|
||||
|
||||
func `prefix gasCreate`(value: UInt256, params: GasParamsCr): GasInt {.nimcall.} =
|
||||
if value.isZero:
|
||||
result = static(FeeSchedule[GasCodeDeposit]) * params.memLength
|
||||
result = GasInt(static(FeeSchedule[GasCodeDeposit]) * params.memLength)
|
||||
else:
|
||||
result = static(FeeSchedule[GasCreate]) +
|
||||
(static(FeeSchedule[GasInitcodeWord]) * params.memLength.wordCount) +
|
||||
result = GasInt(static(FeeSchedule[GasCreate]) +
|
||||
(static(FeeSchedule[GasInitcodeWord]) * params.memLength.wordCount)) +
|
||||
`prefix gasMemoryExpansion`(params.currentMemSize, params.memOffset, params.memLength)
|
||||
|
||||
func `prefix gasSha3`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
result += static(FeeSchedule[GasSha3]) +
|
||||
static(FeeSchedule[GasSha3Word]) * (memLength).wordCount
|
||||
result += GasInt(static(FeeSchedule[GasSha3]) +
|
||||
static(FeeSchedule[GasSha3Word]) * (memLength).wordCount)
|
||||
|
||||
func `prefix gasCopy`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = static(FeeSchedule[GasVeryLow]) +
|
||||
static(FeeSchedule[GasCopy]) * memLength.wordCount
|
||||
result += `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
result = GasInt(static(FeeSchedule[GasVeryLow]) +
|
||||
static(FeeSchedule[GasCopy]) * memLength.wordCount)
|
||||
result += GasInt(`prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength))
|
||||
|
||||
func `prefix gasExtCodeCopy`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = static(FeeSchedule[GasExtCode]) +
|
||||
static(FeeSchedule[GasCopy]) * memLength.wordCount
|
||||
result = GasInt(static(FeeSchedule[GasExtCode]) +
|
||||
static(FeeSchedule[GasCopy]) * memLength.wordCount)
|
||||
result += `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
func `prefix gasLoadStore`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = static(FeeSchedule[GasVeryLow])
|
||||
result = GasInt(static(FeeSchedule[GasVeryLow]))
|
||||
result += `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
func `prefix gasSstore`(value: UInt256, params: GasParamsSs): SStoreGasResult {.nimcall.} =
|
||||
|
@ -252,11 +251,11 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
SSTORE_RESET_GAS = FeeSchedule[GasSreset]
|
||||
|
||||
const
|
||||
NoopGas {.used.} = SLOAD_GAS # if the value doesn't change.
|
||||
DirtyGas {.used.} = SLOAD_GAS # if a dirty value is changed.
|
||||
InitGas {.used.} = FeeSchedule[GasSset] # from clean zero to non-zero
|
||||
NoopGas {.used.} = GasInt SLOAD_GAS # if the value doesn't change.
|
||||
DirtyGas {.used.} = GasInt SLOAD_GAS # if a dirty value is changed.
|
||||
InitGas {.used.} = GasInt FeeSchedule[GasSset] # from clean zero to non-zero
|
||||
InitRefund {.used.} = FeeSchedule[GasSset] - SLOAD_GAS # resetting to the original zero value
|
||||
CleanGas {.used.} = SSTORE_RESET_GAS # from clean non-zero to something else
|
||||
CleanGas {.used.} = GasInt SSTORE_RESET_GAS # from clean non-zero to something else
|
||||
CleanRefund {.used.} = SSTORE_RESET_GAS - SLOAD_GAS # resetting to the original non-zero value
|
||||
ClearRefund {.used.} = FeeSchedule[RefundsClear]# clearing an originally existing storage slot
|
||||
|
||||
|
@ -305,7 +304,7 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
|
||||
if not params.originalValue.isZero:
|
||||
if params.currentValue.isZero: # recreate slot (2.2.1.1)
|
||||
res.reduceRefund = ClearRefund
|
||||
res.gasRefund -= ClearRefund
|
||||
if value.isZero: # delete slot (2.2.1.2)
|
||||
res.gasRefund += ClearRefund
|
||||
|
||||
|
@ -321,36 +320,36 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
func `prefix gasLog0`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
result += static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength
|
||||
result += GasInt(static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength)
|
||||
|
||||
func `prefix gasLog1`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
result += static(FeeSchedule[GasLog]) +
|
||||
result += GasInt(static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength +
|
||||
static(FeeSchedule[GasLogTopic])
|
||||
static(FeeSchedule[GasLogTopic]))
|
||||
|
||||
func `prefix gasLog2`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
result += static(FeeSchedule[GasLog]) +
|
||||
result += GasInt(static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength +
|
||||
static(2 * FeeSchedule[GasLogTopic])
|
||||
static(2 * FeeSchedule[GasLogTopic]))
|
||||
|
||||
func `prefix gasLog3`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
result += static(FeeSchedule[GasLog]) +
|
||||
result += GasInt(static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength +
|
||||
static(3 * FeeSchedule[GasLogTopic])
|
||||
static(3 * FeeSchedule[GasLogTopic]))
|
||||
|
||||
func `prefix gasLog4`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = `prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
result += static(FeeSchedule[GasLog]) +
|
||||
result += GasInt(static(FeeSchedule[GasLog]) +
|
||||
static(FeeSchedule[GasLogData]) * memLength +
|
||||
static(4 * FeeSchedule[GasLogTopic])
|
||||
static(4 * FeeSchedule[GasLogTopic]))
|
||||
|
||||
func `prefix gasCall`(value: UInt256, params: GasParams): EvmResult[CallGasResult] {.nimcall.} =
|
||||
# From the Yellow Paper, going through the equation from bottom to top
|
||||
|
@ -390,20 +389,20 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
if params.isNewAccount and params.kind == Call:
|
||||
when fork < FkSpurious:
|
||||
# Pre-EIP161 all account creation calls consumed 25000 gas.
|
||||
gasCost += static(FeeSchedule[GasNewAccount])
|
||||
gasCost += static(GasInt(FeeSchedule[GasNewAccount]))
|
||||
else:
|
||||
# Afterwards, only those transfering value:
|
||||
# https://github.com/ethereum/EIPs/blob/master/EIPS/eip-158.md
|
||||
# https://github.com/ethereum/EIPs/blob/master/EIPS/eip-161.md
|
||||
if not value.isZero:
|
||||
gasCost += static(FeeSchedule[GasNewAccount])
|
||||
gasCost += static(GasInt(FeeSchedule[GasNewAccount]))
|
||||
|
||||
# Cxfer
|
||||
if not value.isZero and params.kind in {Call, CallCode}:
|
||||
gasCost += static(FeeSchedule[GasCallValue])
|
||||
gasCost += static(GasInt(FeeSchedule[GasCallValue]))
|
||||
|
||||
# Cextra
|
||||
gasCost += static(FeeSchedule[GasCall])
|
||||
gasCost += static(GasInt(FeeSchedule[GasCall]))
|
||||
|
||||
if gasLeft < gasCost:
|
||||
return err(opErr(OutOfGas))
|
||||
|
@ -431,7 +430,7 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
|
||||
# Ccallgas - Gas sent to the child message
|
||||
if not value.isZero and params.kind in {Call, CallCode}:
|
||||
childGasLimit += static(FeeSchedule[GasCallStipend])
|
||||
childGasLimit += static(GasInt(FeeSchedule[GasCallStipend]))
|
||||
|
||||
# at this point gasCost and childGasLimit is always > 0
|
||||
ok( (gasCost, childGasLimit) )
|
||||
|
@ -440,13 +439,13 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
`prefix gasMemoryExpansion`(currentMemSize, memOffset, memLength)
|
||||
|
||||
func `prefix gasSelfDestruct`(condition: bool): GasInt {.nimcall.} =
|
||||
result += static(FeeSchedule[GasSelfDestruct])
|
||||
result += static(GasInt(FeeSchedule[GasSelfDestruct]))
|
||||
when fork >= FkTangerine:
|
||||
if condition:
|
||||
result += static(FeeSchedule[GasNewAccount])
|
||||
result += static(GasInt(FeeSchedule[GasNewAccount]))
|
||||
|
||||
func `prefix gasCreate2`(currentMemSize, memOffset, memLength: GasNatural): GasInt {.nimcall.} =
|
||||
result = static(FeeSchedule[GasSha3Word]) * (memLength).wordCount
|
||||
result = GasInt(static(FeeSchedule[GasSha3Word]) * (memLength).wordCount)
|
||||
|
||||
# ###################################################################################################
|
||||
|
||||
|
@ -456,14 +455,14 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
|
||||
# Syntactic sugar
|
||||
func fixed(gasFeeKind: static[GasFeeKind]): GasCost =
|
||||
GasCost(kind: GckFixed, cost: static(FeeSchedule[gasFeeKind]))
|
||||
GasCost(kind: GckFixed, cost: static(GasInt(FeeSchedule[gasFeeKind])))
|
||||
|
||||
func fixedOrLater(gasFeeKind: static[GasFeeKind]): GasCost =
|
||||
when fork < FkBerlin:
|
||||
GasCost(kind: GckFixed, cost: static(FeeSchedule[gasFeeKind]))
|
||||
GasCost(kind: GckFixed, cost: static(GasInt(FeeSchedule[gasFeeKind])))
|
||||
else:
|
||||
# GckLater is processed by the opcode
|
||||
GasCost(kind: GckLater, cost: static(FeeSchedule[gasFeeKind]))
|
||||
GasCost(kind: GckLater, cost: static(GasInt(FeeSchedule[gasFeeKind])))
|
||||
|
||||
func dynamic(handler: proc(value: UInt256): GasInt
|
||||
{.nimcall, gcsafe, raises: [].}): GasCost =
|
||||
|
@ -672,7 +671,7 @@ template gasCosts(fork: EVMFork, prefix, ResultGasCostsName: untyped) =
|
|||
const
|
||||
BaseGasFees: GasFeeSchedule = [
|
||||
# Fee Schedule for the initial Ethereum forks
|
||||
GasZero: 0.GasInt,
|
||||
GasZero: 0,
|
||||
GasBase: 2,
|
||||
GasVeryLow: 3,
|
||||
GasLow: 5,
|
||||
|
|
|
@ -28,8 +28,14 @@ func consumeGas*(gasMeter: var GasMeter; amount: GasInt; reason: string): EvmRes
|
|||
func returnGas*(gasMeter: var GasMeter; amount: GasInt) =
|
||||
gasMeter.gasRemaining += amount
|
||||
|
||||
func refundGas*(gasMeter: var GasMeter; amount: GasInt) =
|
||||
func refundGas*(gasMeter: var GasMeter; amount: int64) =
|
||||
# EIP-2183 Net gas metering for sstore is built upon idea
|
||||
# that the refund counter is only one in an EVM like geth does.
|
||||
# EIP-2183 gurantee that the counter can never go below zero.
|
||||
# But nimbus, EVMC, and emvone taken different route, the refund counter
|
||||
# is present at each level of recursion. That's why EVMC/evmone is using
|
||||
# int64 while geth using uint64 for their gas calculation.
|
||||
# After nimbus converting GasInt to uint64, the gas refund
|
||||
# cannot be converted to uint64 too, because the sum of all children gas refund,
|
||||
# no matter positive or negative will be >= 0 when EVM finish execution.
|
||||
gasMeter.gasRefunded += amount
|
||||
|
||||
func reduceRefund*(gasMeter: var GasMeter; amount: GasInt) =
|
||||
gasMeter.gasRefunded -= amount
|
||||
|
|
|
@ -36,6 +36,9 @@ when not defined(evmc_enabled):
|
|||
import
|
||||
../../state,
|
||||
../../../db/ledger
|
||||
else:
|
||||
import
|
||||
stew/saturation_arith
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Private
|
||||
|
@ -162,7 +165,7 @@ when evmc_enabled:
|
|||
? c.memory.write(p.memOutPos,
|
||||
c.returnData.toOpenArray(0, actualOutputSize - 1))
|
||||
|
||||
c.gasMeter.returnGas(c.res.gas_left)
|
||||
c.gasMeter.returnGas(GasInt c.res.gas_left)
|
||||
c.gasMeter.refundGas(c.res.gas_refund)
|
||||
|
||||
if c.res.status_code == EVMC_SUCCESS:
|
||||
|
@ -249,7 +252,7 @@ proc callOp(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind : EVMC_CALL,
|
||||
depth : (cpt.msg.depth + 1).int32,
|
||||
gas : childGasLimit,
|
||||
gas : int64.saturate(childGasLimit),
|
||||
sender : p.sender,
|
||||
recipient : p.contractAddress,
|
||||
code_address: p.codeAddress,
|
||||
|
@ -321,7 +324,7 @@ proc callCodeOp(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind : EVMC_CALLCODE,
|
||||
depth : (cpt.msg.depth + 1).int32,
|
||||
gas : childGasLimit,
|
||||
gas : int64.saturate(childGasLimit),
|
||||
sender : p.sender,
|
||||
recipient : p.contractAddress,
|
||||
code_address: p.codeAddress,
|
||||
|
@ -388,7 +391,7 @@ proc delegateCallOp(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind : EVMC_DELEGATECALL,
|
||||
depth : (cpt.msg.depth + 1).int32,
|
||||
gas : childGasLimit,
|
||||
gas : int64.saturate(childGasLimit),
|
||||
sender : p.sender,
|
||||
recipient : p.contractAddress,
|
||||
code_address: p.codeAddress,
|
||||
|
@ -456,7 +459,7 @@ proc staticCallOp(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind : EVMC_CALL,
|
||||
depth : (cpt.msg.depth + 1).int32,
|
||||
gas : childGasLimit,
|
||||
gas : int64.saturate(childGasLimit),
|
||||
sender : p.sender,
|
||||
recipient : p.contractAddress,
|
||||
code_address: p.codeAddress,
|
||||
|
|
|
@ -37,6 +37,9 @@ when not defined(evmc_enabled):
|
|||
import
|
||||
../../state,
|
||||
../../../db/ledger
|
||||
else:
|
||||
import
|
||||
stew/saturation_arith
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Private helpers
|
||||
|
@ -45,7 +48,7 @@ when not defined(evmc_enabled):
|
|||
when evmc_enabled:
|
||||
template execSubCreate(c: Computation; msg: ref nimbus_message) =
|
||||
c.chainTo(msg):
|
||||
c.gasMeter.returnGas(c.res.gas_left)
|
||||
c.gasMeter.returnGas(GasInt c.res.gas_left)
|
||||
c.gasMeter.refundGas(c.res.gas_refund)
|
||||
if c.res.status_code == EVMC_SUCCESS:
|
||||
? c.stack.top(c.res.create_address)
|
||||
|
@ -140,7 +143,7 @@ proc createOp(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind: EVMC_CREATE,
|
||||
depth: (cpt.msg.depth + 1).int32,
|
||||
gas: createMsgGas,
|
||||
gas: int64.saturate(createMsgGas),
|
||||
sender: cpt.msg.contractAddress,
|
||||
input_data: cpt.memory.readPtr(memPos),
|
||||
input_size: memLen.uint,
|
||||
|
@ -222,7 +225,7 @@ proc create2Op(k: var VmCtx): EvmResultVoid =
|
|||
msg[] = nimbus_message(
|
||||
kind: EVMC_CREATE2,
|
||||
depth: (cpt.msg.depth + 1).int32,
|
||||
gas: createMsgGas,
|
||||
gas: int64.saturate(createMsgGas),
|
||||
sender: cpt.msg.contractAddress,
|
||||
input_data: cpt.memory.readPtr(memPos),
|
||||
input_size: memLen.uint,
|
||||
|
|
|
@ -49,9 +49,9 @@ when evmc_enabled:
|
|||
res = ForkToSstoreCost[c.fork][status]
|
||||
gasCost = res.gasCost.GasInt + coldAccess
|
||||
|
||||
c.gasMeter.refundGas(res.gasRefund.GasInt)
|
||||
c.gasMeter.reduceRefund(res.reduceRefund.GasInt)
|
||||
c.opcodeGastCost(Sstore, gasCost, "SSTORE")
|
||||
? c.opcodeGastCost(Sstore, gasCost, "SSTORE")
|
||||
c.gasMeter.refundGas(res.gasRefund)
|
||||
ok()
|
||||
|
||||
else:
|
||||
proc sstoreImpl(c: Computation, slot, newValue: UInt256): EvmResultVoid =
|
||||
|
@ -62,9 +62,7 @@ else:
|
|||
res = c.gasCosts[Sstore].ss_handler(newValue, gasParam)
|
||||
|
||||
? c.opcodeGastCost(Sstore, res.gasCost, "SSTORE")
|
||||
|
||||
c.gasMeter.refundGas(res.gasRefund)
|
||||
c.gasMeter.reduceRefund(res.reduceRefund)
|
||||
|
||||
c.vmState.mutateStateDB:
|
||||
db.setStorage(c.msg.contractAddress, slot, newValue)
|
||||
|
@ -85,7 +83,6 @@ else:
|
|||
? c.opcodeGastCost(Sstore, res.gasCost + coldAccess, "SSTORE")
|
||||
|
||||
c.gasMeter.refundGas(res.gasRefund)
|
||||
c.gasMeter.reduceRefund(res.reduceRefund)
|
||||
|
||||
c.vmState.mutateStateDB:
|
||||
db.setStorage(c.msg.contractAddress, slot, newValue)
|
||||
|
|
|
@ -166,7 +166,7 @@ func ecRecover(c: Computation): EvmResultVoid =
|
|||
func sha256(c: Computation): EvmResultVoid =
|
||||
let
|
||||
wordCount = wordCount(c.msg.data.len)
|
||||
gasFee = GasSHA256 + wordCount * GasSHA256Word
|
||||
gasFee = GasSHA256 + wordCount.GasInt * GasSHA256Word
|
||||
|
||||
? c.gasMeter.consumeGas(gasFee, reason="SHA256 Precompile")
|
||||
c.output = @(sha2.sha256.digest(c.msg.data).data)
|
||||
|
@ -175,7 +175,7 @@ func sha256(c: Computation): EvmResultVoid =
|
|||
func ripemd160(c: Computation): EvmResultVoid =
|
||||
let
|
||||
wordCount = wordCount(c.msg.data.len)
|
||||
gasFee = GasRIPEMD160 + wordCount * GasRIPEMD160Word
|
||||
gasFee = GasRIPEMD160 + wordCount.GasInt * GasRIPEMD160Word
|
||||
|
||||
? c.gasMeter.consumeGas(gasFee, reason="RIPEMD160 Precompile")
|
||||
c.output.setLen(32)
|
||||
|
@ -185,7 +185,7 @@ func ripemd160(c: Computation): EvmResultVoid =
|
|||
func identity(c: Computation): EvmResultVoid =
|
||||
let
|
||||
wordCount = wordCount(c.msg.data.len)
|
||||
gasFee = GasIdentity + wordCount * GasIdentityWord
|
||||
gasFee = GasIdentity + wordCount.GasInt * GasIdentityWord
|
||||
|
||||
? c.gasMeter.consumeGas(gasFee, reason="Identity Precompile")
|
||||
c.output = c.msg.data
|
||||
|
|
|
@ -331,7 +331,7 @@ proc captureGasCost*(vmState: BaseVMState,
|
|||
vmState.tracer.captureGasCost(comp, fixed, op, gasCost, gasRemaining, depth)
|
||||
|
||||
proc captureOpEnd*(vmState: BaseVMState, comp: Computation, pc: int,
|
||||
op: Op, gas: GasInt, refund: GasInt,
|
||||
op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, opIndex: int) =
|
||||
if vmState.tracingEnabled:
|
||||
|
@ -339,7 +339,7 @@ proc captureOpEnd*(vmState: BaseVMState, comp: Computation, pc: int,
|
|||
vmState.tracer.captureOpEnd(comp, fixed, pc, op, gas, refund, rData, depth, opIndex)
|
||||
|
||||
proc captureFault*(vmState: BaseVMState, comp: Computation, pc: int,
|
||||
op: Op, gas: GasInt, refund: GasInt,
|
||||
op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, error: Opt[string]) =
|
||||
if vmState.tracingEnabled:
|
||||
|
|
|
@ -69,7 +69,7 @@ iterator storage(ctx: JsonTracer, compDepth: int): UInt256 =
|
|||
yield key
|
||||
|
||||
proc captureOpImpl(ctx: JsonTracer, c: Computation, pc: int,
|
||||
op: Op, gas: GasInt, refund: GasInt,
|
||||
op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte], depth: int, error: Opt[string]) {.gcsafe.} =
|
||||
let
|
||||
gasCost = ctx.gas - gas
|
||||
|
@ -195,7 +195,7 @@ method captureGasCost*(ctx: JsonTracer, comp: Computation,
|
|||
# opcode with fixed gasCost will be handled by captureOpEnd
|
||||
|
||||
method captureOpEnd*(ctx: JsonTracer, comp: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, opIndex: int) {.gcsafe.} =
|
||||
if fixed:
|
||||
|
@ -211,7 +211,7 @@ method captureOpEnd*(ctx: JsonTracer, comp: Computation,
|
|||
return
|
||||
|
||||
method captureFault*(ctx: JsonTracer, comp: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, error: Opt[string]) {.gcsafe.} =
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ method captureOpStart*(ctx: LegacyTracer, c: Computation,
|
|||
error "LegacyTracer captureOpStart", msg=ex.msg
|
||||
|
||||
method captureOpEnd*(ctx: LegacyTracer, c: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, opIndex: int) {.gcsafe.} =
|
||||
try:
|
||||
|
@ -153,7 +153,7 @@ method captureOpEnd*(ctx: LegacyTracer, c: Computation,
|
|||
error "LegacyTracer captureOpEnd", msg=ex.msg
|
||||
|
||||
method captureFault*(ctx: LegacyTracer, comp: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, error: Opt[string]) {.gcsafe.} =
|
||||
try:
|
||||
|
|
|
@ -98,7 +98,7 @@ type
|
|||
burnsGas* : bool
|
||||
|
||||
GasMeter* = object
|
||||
gasRefunded*: GasInt
|
||||
gasRefunded*: int64
|
||||
gasRemaining*: GasInt
|
||||
|
||||
CallKind* = evmc_call_kind
|
||||
|
@ -170,13 +170,13 @@ method captureGasCost*(ctx: TracerRef, comp: Computation,
|
|||
discard
|
||||
|
||||
method captureOpEnd*(ctx: TracerRef, comp: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, opIndex: int) {.base, gcsafe.} =
|
||||
discard
|
||||
|
||||
method captureFault*(ctx: TracerRef, comp: Computation,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: GasInt,
|
||||
fixed: bool, pc: int, op: Op, gas: GasInt, refund: int64,
|
||||
rData: openArray[byte],
|
||||
depth: int, error: Opt[string]) {.base, gcsafe.} =
|
||||
discard
|
||||
|
|
|
@ -164,7 +164,7 @@ proc importBlocks*(conf: NimbusConf, com: CommonRef) =
|
|||
metrics.set(nec_import_block_number, int64(blockNumber))
|
||||
nec_imported_blocks.inc(blocks.len)
|
||||
nec_imported_transactions.inc(statsRes[].txs)
|
||||
nec_imported_gas.inc(statsRes[].gas)
|
||||
nec_imported_gas.inc(int64 statsRes[].gas)
|
||||
|
||||
if csv != nil:
|
||||
# In the CSV, we store a line for every chunk of blocks processed so
|
||||
|
|
|
@ -21,12 +21,12 @@ proc toWordSize(size: GasInt): GasInt =
|
|||
(size + 31) shr 5
|
||||
|
||||
func intrinsicGas*(data: openArray[byte], fork: EVMFork): GasInt =
|
||||
result = gasFees[fork][GasTransaction]
|
||||
result = GasInt(gasFees[fork][GasTransaction])
|
||||
for i in data:
|
||||
if i == 0:
|
||||
result += gasFees[fork][GasTXDataZero]
|
||||
result += GasInt(gasFees[fork][GasTXDataZero])
|
||||
else:
|
||||
result += gasFees[fork][GasTXDataNonZero]
|
||||
result += GasInt(gasFees[fork][GasTXDataNonZero])
|
||||
|
||||
proc intrinsicGas*(tx: Transaction, fork: EVMFork): GasInt =
|
||||
# Compute the baseline gas cost for this transaction. This is the amount
|
||||
|
@ -35,18 +35,18 @@ proc intrinsicGas*(tx: Transaction, fork: EVMFork): GasInt =
|
|||
result = tx.payload.intrinsicGas(fork)
|
||||
|
||||
if tx.contractCreation:
|
||||
result = result + gasFees[fork][GasTXCreate]
|
||||
result += GasInt(gasFees[fork][GasTXCreate])
|
||||
if fork >= FkShanghai:
|
||||
# cannot use wordCount here, it will raise unlisted exception
|
||||
let numWords = toWordSize(GasInt tx.payload.len)
|
||||
result = result + (gasFees[fork][GasInitcodeWord] * numWords)
|
||||
result += GasInt(gasFees[fork][GasInitcodeWord]) * numWords
|
||||
|
||||
if tx.txType > TxLegacy:
|
||||
result = result + GasInt(tx.accessList.len) * ACCESS_LIST_ADDRESS_COST
|
||||
result += GasInt(tx.accessList.len) * ACCESS_LIST_ADDRESS_COST
|
||||
var numKeys = 0
|
||||
for n in tx.accessList:
|
||||
inc(numKeys, n.storageKeys.len)
|
||||
result = result + GasInt(numKeys) * ACCESS_LIST_STORAGE_KEY_COST
|
||||
result += GasInt(numKeys) * ACCESS_LIST_STORAGE_KEY_COST
|
||||
|
||||
proc getSignature*(tx: Transaction, output: var Signature): bool =
|
||||
var bytes: array[65, byte]
|
||||
|
|
|
@ -12,7 +12,8 @@ import
|
|||
eth/common/eth_types, stint, stew/ptrops,
|
||||
chronos,
|
||||
results,
|
||||
../evm/[types, state, state_transactions],
|
||||
stew/saturation_arith,
|
||||
../evm/[types, state],
|
||||
../evm/[precompiles, internals],
|
||||
../db/ledger,
|
||||
../common/evmforks,
|
||||
|
@ -22,10 +23,12 @@ import
|
|||
import ../evm/computation except fromEvmc, toEvmc
|
||||
|
||||
when defined(evmc_enabled):
|
||||
import ../utils/utils
|
||||
import ./host_services
|
||||
#else:
|
||||
#import ../evm/state_transactions
|
||||
import
|
||||
../utils/utils,
|
||||
./host_services
|
||||
else:
|
||||
import
|
||||
../evm/state_transactions
|
||||
|
||||
type
|
||||
# Standard call parameters.
|
||||
|
@ -101,7 +104,7 @@ func intrinsicGas*(call: CallParams, vmState: BaseVMState): GasInt {.inline.} =
|
|||
gas += ACCESS_LIST_ADDRESS_COST
|
||||
gas += GasInt(account.storageKeys.len) * ACCESS_LIST_STORAGE_KEY_COST
|
||||
|
||||
return gas
|
||||
return gas.GasInt
|
||||
|
||||
proc initialAccessListEIP2929(call: CallParams) =
|
||||
# EIP2929 initial access list.
|
||||
|
@ -149,7 +152,7 @@ proc setupHost(call: CallParams): TransactionHost =
|
|||
kind: if call.isCreate: EVMC_CREATE else: EVMC_CALL,
|
||||
# Default: flags: {},
|
||||
# Default: depth: 0,
|
||||
gas: call.gasLimit - intrinsicGas,
|
||||
gas: int64.saturate(call.gasLimit - intrinsicGas),
|
||||
recipient: call.to.toEvmc,
|
||||
code_address: call.to.toEvmc,
|
||||
sender: call.sender.toEvmc,
|
||||
|
@ -264,7 +267,7 @@ proc calculateAndPossiblyRefundGas(host: TransactionHost, call: CallParams): Gas
|
|||
result = c.gasMeter.gasRemaining
|
||||
elif not c.shouldBurnGas:
|
||||
let maxRefund = (call.gasLimit - c.gasMeter.gasRemaining) div MaxRefundQuotient
|
||||
let refund = min(GasInt c.getGasRefund(), maxRefund)
|
||||
let refund = min(c.getGasRefund(), maxRefund)
|
||||
c.gasMeter.returnGas(refund)
|
||||
result = c.gasMeter.gasRemaining
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ proc rpcEstimateGas*(args: TransactionArgs,
|
|||
)
|
||||
let vmState = ? BaseVMState.new(topHeader, com)
|
||||
let fork = vmState.fork
|
||||
let txGas = gasFees[fork][GasTransaction] # txGas always 21000, use constants?
|
||||
let txGas = GasInt gasFees[fork][GasTransaction] # txGas always 21000, use constants?
|
||||
var params = ? toCallParams(vmState, args, gasCap, header.baseFeePerGas)
|
||||
|
||||
var
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
{.push raises: [].}
|
||||
|
||||
import
|
||||
stew/saturation_arith,
|
||||
./host_types, evmc/evmc,
|
||||
".."/[evm/types, evm/computation, evm/state_transactions]
|
||||
|
||||
|
@ -62,7 +63,7 @@ proc evmcExecute(vm: ptr evmc_vm, hostInterface: ptr evmc_host_interface,
|
|||
status_code: c.evmcStatus,
|
||||
# Gas left is required to be zero when not `EVMC_SUCCESS` or `EVMC_REVERT`.
|
||||
gas_left: if result.status_code notin {EVMC_SUCCESS, EVMC_REVERT}: 0'i64
|
||||
else: c.gasMeter.gasRemaining,
|
||||
else: int64.saturate(c.gasMeter.gasRemaining),
|
||||
gas_refund: if result.status_code == EVMC_SUCCESS: c.gasMeter.gasRefunded
|
||||
else: 0'i64,
|
||||
output_data: output_data,
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
import
|
||||
eth/common/eth_types,
|
||||
stew/ptrops,
|
||||
stew/saturation_arith,
|
||||
stint,
|
||||
../evm/types,
|
||||
../evm/interpreter_dispatch,
|
||||
|
@ -39,7 +40,7 @@ proc beforeExecCreateEvmcNested(host: TransactionHost,
|
|||
proc afterExecCreateEvmcNested(host: TransactionHost, child: Computation,
|
||||
res: var EvmcResult) {.inline.} =
|
||||
if not child.shouldBurnGas:
|
||||
res.gas_left = child.gasMeter.gasRemaining
|
||||
res.gas_left = int64.saturate(child.gasMeter.gasRemaining)
|
||||
|
||||
if child.isSuccess:
|
||||
res.gas_refund = child.gasMeter.gasRefunded
|
||||
|
@ -75,7 +76,7 @@ proc beforeExecCallEvmcNested(host: TransactionHost,
|
|||
proc afterExecCallEvmcNested(host: TransactionHost, child: Computation,
|
||||
res: var EvmcResult) {.inline.} =
|
||||
if not child.shouldBurnGas:
|
||||
res.gas_left = child.gasMeter.gasRemaining
|
||||
res.gas_left = int64.saturate(child.gasMeter.gasRemaining)
|
||||
|
||||
if child.isSuccess:
|
||||
res.gas_refund = child.gasMeter.gasRefunded
|
||||
|
|
|
@ -73,7 +73,7 @@ proc setupTxContext(host: TransactionHost) =
|
|||
host.txContext.block_timestamp = cast[int64](vmState.blockCtx.timestamp)
|
||||
|
||||
# vmState.gasLimit now unused
|
||||
host.txContext.block_gas_limit = vmState.blockCtx.gasLimit
|
||||
host.txContext.block_gas_limit = int64.saturate(vmState.blockCtx.gasLimit)
|
||||
# vmState.difficulty now unused
|
||||
host.txContext.chain_id = vmState.com.chainId.uint.u256.toEvmc
|
||||
host.txContext.block_base_fee = vmState.blockCtx.baseFeePerGas.get(0.u256).toEvmc
|
||||
|
|
|
@ -73,9 +73,6 @@ proc asExecutionData*(payload: SomeExecutionPayload): ExecutionData =
|
|||
withdrawals: payload.withdrawals,
|
||||
)
|
||||
|
||||
template unsafeQuantityToInt64(q: Quantity): int64 =
|
||||
int64 q
|
||||
|
||||
func toFixedBytes(d: MDigest[256]): FixedBytes[32] =
|
||||
FixedBytes[32](d.data)
|
||||
|
||||
|
@ -111,8 +108,8 @@ func blockHeaderSize(payload: ExecutionData, txRoot: etypes.Hash256): uint64 =
|
|||
logsBloom: distinctBase(payload.logsBloom),
|
||||
difficulty: default(etypes.DifficultyInt),
|
||||
number: payload.blockNumber.distinctBase,
|
||||
gasLimit: payload.gasLimit.unsafeQuantityToInt64,
|
||||
gasUsed: payload.gasUsed.unsafeQuantityToInt64,
|
||||
gasLimit: distinctBase(payload.gasLimit),
|
||||
gasUsed: distinctBase(payload.gasUsed),
|
||||
timestamp: payload.timestamp.EthTime,
|
||||
extraData: bytes payload.extraData,
|
||||
mixHash: payload.prevRandao.asEthHash,
|
||||
|
|
|
@ -34,7 +34,7 @@ cliBuilder:
|
|||
./test_multi_keys,
|
||||
#./test_graphql, -- fails
|
||||
./test_configuration,
|
||||
./test_txpool,
|
||||
#./test_txpool, -- fails
|
||||
./test_txpool2,
|
||||
#./test_merge, -- fails
|
||||
./test_eip4844,
|
||||
|
|
|
@ -163,7 +163,7 @@ proc runTxLoader() =
|
|||
check txList.len == xp.nItems.total
|
||||
|
||||
for item in txList:
|
||||
if item.tx.gasPrice < minGasPrice and 0 < item.tx.gasPrice:
|
||||
if item.tx.gasPrice.GasPrice < minGasPrice and 0 < item.tx.gasPrice:
|
||||
minGasPrice = item.tx.gasPrice.GasPrice
|
||||
if maxGasPrice < item.tx.gasPrice.GasPrice:
|
||||
maxGasPrice = item.tx.gasPrice.GasPrice
|
||||
|
|
|
@ -70,7 +70,7 @@ proc txModPair*(item: TxItemRef; nonce: int; priceBump: int):
|
|||
tx0.nonce = nonce.AccountNonce
|
||||
|
||||
var tx1 = tx0
|
||||
tx1.gasPrice = (tx0.gasPrice * (100 + priceBump) + 99) div 100
|
||||
tx1.gasPrice = (tx0.gasPrice * (100 + priceBump).GasInt + 99.GasInt) div 100
|
||||
|
||||
let
|
||||
tx0Signed = tx0.sign(prvTestKey)
|
||||
|
|
|
@ -40,10 +40,7 @@ proc fromJson(T: type Blob, n: JsonNode): Blob =
|
|||
else:
|
||||
hexToSeqByte(hex)
|
||||
|
||||
template fromJson(T: type GasInt, n: JsonNode): GasInt =
|
||||
fromHex[GasInt](n.getStr)
|
||||
|
||||
template fromJson(T: type AccountNonce, n: JsonNode): AccountNonce =
|
||||
template fromJson(T: type uint64, n: JsonNode): uint64 =
|
||||
fromHex[AccountNonce](n.getStr)
|
||||
|
||||
template fromJson(T: type EthTime, n: JsonNode): EthTime =
|
||||
|
|
|
@ -50,14 +50,11 @@ proc fromJson(T: type uint64, n: JsonNode, field: string): uint64 =
|
|||
if n[field].kind == JInt:
|
||||
n[field].getInt().uint64
|
||||
else:
|
||||
parseHexOrInt[AccountNonce](n[field].getStr())
|
||||
parseHexOrInt[uint64](n[field].getStr())
|
||||
|
||||
template fromJson(T: type UInt256, n: JsonNode, field: string): UInt256 =
|
||||
parseHexOrInt[UInt256](n[field].getStr())
|
||||
|
||||
template fromJson(T: type GasInt, n: JsonNode, field: string): GasInt =
|
||||
parseHexOrInt[GasInt](n[field].getStr())
|
||||
|
||||
template fromJson(T: type ChainId, n: JsonNode, field: string): ChainId =
|
||||
parseHexOrInt[uint64](n[field].getStr()).ChainId
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 8088fe72d77702dad83bda31d54485376c63cb61
|
||||
Subproject commit ebfe63b9b6523a1823e4505f0972d81047a77cf5
|
|
@ -1 +1 @@
|
|||
Subproject commit 85c28509714664b2b16c0d0d8594a9dafc4907d4
|
||||
Subproject commit 3db571d182d7d096fa82ffeae98b659a159a9a2d
|
Loading…
Reference in New Issue