mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-02-09 10:44:48 +00:00
evm: fixes EIP2929 opcodes
op balanceEIP2929, extCodeHashEIP2929, extCodeSizeEIP2929, and extCodeCopyEIP2929 are fixed due to their wrong gasConsume position
This commit is contained in:
parent
0135189e4c
commit
908dc21478
@ -724,6 +724,12 @@ func istanbulGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
|||||||
func berlinGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
func berlinGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
||||||
# https://eips.ethereum.org/EIPS/eip-2929
|
# https://eips.ethereum.org/EIPS/eip-2929
|
||||||
result = previousFees
|
result = previousFees
|
||||||
|
|
||||||
|
# these opcodes gas are calculated inside opcode
|
||||||
|
result[GasBalance] = 0
|
||||||
|
result[GasExtCodeHash] = 0
|
||||||
|
result[GasExtCode] = 0
|
||||||
|
|
||||||
# SLOAD gasCost become fully dynamic, see sloadEIP2929
|
# SLOAD gasCost become fully dynamic, see sloadEIP2929
|
||||||
result[GasSLoad] = 0
|
result[GasSLoad] = 0
|
||||||
result[GasCall] = WarmStorageReadCost
|
result[GasCall] = WarmStorageReadCost
|
||||||
|
@ -1018,20 +1018,20 @@ op extCodeHash, inline = true:
|
|||||||
op balanceEIP2929, inline = true:
|
op balanceEIP2929, inline = true:
|
||||||
## 0x31, Get balance of the given account.
|
## 0x31, Get balance of the given account.
|
||||||
let address = c.stack.popAddress()
|
let address = c.stack.popAddress()
|
||||||
c.gasMeter.consumeGas(c.accessGas(address) - gasFees[c.fork][GasBalance],
|
c.gasMeter.consumeGas(c.accessGas(address),
|
||||||
reason = "balanceEIP2929")
|
reason = "balanceEIP2929")
|
||||||
push: c.getBalance(address)
|
push: c.getBalance(address)
|
||||||
|
|
||||||
op extCodeHashEIP2929, inline = true:
|
op extCodeHashEIP2929, inline = true:
|
||||||
let address = c.stack.popAddress()
|
let address = c.stack.popAddress()
|
||||||
c.gasMeter.consumeGas(c.accessGas(address) - gasFees[c.fork][GasExtCodeHash],
|
c.gasMeter.consumeGas(c.accessGas(address),
|
||||||
reason = "extCodeHashEIP2929")
|
reason = "extCodeHashEIP2929")
|
||||||
push: c.getCodeHash(address)
|
push: c.getCodeHash(address)
|
||||||
|
|
||||||
op extCodeSizeEIP2929, inline = true:
|
op extCodeSizeEIP2929, inline = true:
|
||||||
## 0x3b, Get size of an account's code
|
## 0x3b, Get size of an account's code
|
||||||
let address = c.stack.popAddress()
|
let address = c.stack.popAddress()
|
||||||
c.gasMeter.consumeGas(c.accessGas(address) - gasFees[c.fork][GasExtCode],
|
c.gasMeter.consumeGas(c.accessGas(address),
|
||||||
reason = "extCodeSizeEIP2929")
|
reason = "extCodeSizeEIP2929")
|
||||||
push: c.getCodeSize(address)
|
push: c.getCodeSize(address)
|
||||||
|
|
||||||
@ -1045,7 +1045,7 @@ op extCodeCopyEIP2929, inline = true:
|
|||||||
c.gasCosts[ExtCodeCopy].m_handler(c.memory.len, memPos, len),
|
c.gasCosts[ExtCodeCopy].m_handler(c.memory.len, memPos, len),
|
||||||
reason="ExtCodeCopy fee")
|
reason="ExtCodeCopy fee")
|
||||||
|
|
||||||
c.gasMeter.consumeGas(c.accessGas(address) - gasFees[c.fork][GasExtCode],
|
c.gasMeter.consumeGas(c.accessGas(address),
|
||||||
reason = "extCodeCopyEIP2929")
|
reason = "extCodeCopyEIP2929")
|
||||||
|
|
||||||
let codeBytes = c.getCode(address)
|
let codeBytes = c.getCode(address)
|
||||||
|
@ -693,6 +693,12 @@ func istanbulGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
|||||||
func berlinGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
func berlinGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
|
||||||
# https://eips.ethereum.org/EIPS/eip-2929
|
# https://eips.ethereum.org/EIPS/eip-2929
|
||||||
result = previousFees
|
result = previousFees
|
||||||
|
|
||||||
|
# these opcodes gas are calculated inside opcode
|
||||||
|
result[GasBalance] = 0
|
||||||
|
result[GasExtCodeHash] = 0
|
||||||
|
result[GasExtCode] = 0
|
||||||
|
|
||||||
# SLOAD gasCost become fully dynamic, see sloadEIP2929
|
# SLOAD gasCost become fully dynamic, see sloadEIP2929
|
||||||
result[GasSLoad] = 0
|
result[GasSLoad] = 0
|
||||||
result[GasCall] = WarmStorageReadCost
|
result[GasCall] = WarmStorageReadCost
|
||||||
|
@ -75,8 +75,7 @@ const
|
|||||||
## 0x31, EIP292: Get balance of the given account for Berlin and later
|
## 0x31, EIP292: Get balance of the given account for Berlin and later
|
||||||
let address = k.cpt.stack.popAddress()
|
let address = k.cpt.stack.popAddress()
|
||||||
|
|
||||||
k.cpt.gasEip2929AccountCheck(
|
k.cpt.gasEip2929AccountCheck(address)
|
||||||
address, gasFees[k.cpt.fork][GasBalance])
|
|
||||||
k.cpt.stack.push:
|
k.cpt.stack.push:
|
||||||
k.cpt.getBalance(address)
|
k.cpt.getBalance(address)
|
||||||
|
|
||||||
@ -177,8 +176,7 @@ const
|
|||||||
## 0x3b, Get size of an account's code
|
## 0x3b, Get size of an account's code
|
||||||
let address = k.cpt.stack.popAddress()
|
let address = k.cpt.stack.popAddress()
|
||||||
|
|
||||||
k.cpt.gasEip2929AccountCheck(
|
k.cpt.gasEip2929AccountCheck(address)
|
||||||
address, gasFees[k.cpt.fork][GasExtCode])
|
|
||||||
k.cpt.stack.push:
|
k.cpt.stack.push:
|
||||||
k.cpt.getCodeSize(address)
|
k.cpt.getCodeSize(address)
|
||||||
|
|
||||||
@ -211,8 +209,7 @@ const
|
|||||||
k.cpt.gasCosts[ExtCodeCopy].m_handler(k.cpt.memory.len, memPos, len),
|
k.cpt.gasCosts[ExtCodeCopy].m_handler(k.cpt.memory.len, memPos, len),
|
||||||
reason = "ExtCodeCopy fee")
|
reason = "ExtCodeCopy fee")
|
||||||
|
|
||||||
k.cpt.gasEip2929AccountCheck(
|
k.cpt.gasEip2929AccountCheck(address)
|
||||||
address, gasFees[k.cpt.fork][GasExtCode])
|
|
||||||
|
|
||||||
let codeBytes = k.cpt.getCode(address)
|
let codeBytes = k.cpt.getCode(address)
|
||||||
k.cpt.memory.writePaddedResult(codeBytes, memPos, codePos, len)
|
k.cpt.memory.writePaddedResult(codeBytes, memPos, codePos, len)
|
||||||
@ -258,8 +255,7 @@ const
|
|||||||
## 0x3f, EIP2929: Returns the keccak256 hash of a contract’s code
|
## 0x3f, EIP2929: Returns the keccak256 hash of a contract’s code
|
||||||
let address = k.cpt.stack.popAddress()
|
let address = k.cpt.stack.popAddress()
|
||||||
|
|
||||||
k.cpt.gasEip2929AccountCheck(
|
k.cpt.gasEip2929AccountCheck(address)
|
||||||
address, gasFees[k.cpt.fork][GasExtCodeHash])
|
|
||||||
|
|
||||||
k.cpt.stack.push:
|
k.cpt.stack.push:
|
||||||
k.cpt.getCodeHash(address)
|
k.cpt.getCodeHash(address)
|
||||||
|
@ -28,8 +28,7 @@ import
|
|||||||
# Public
|
# Public
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
proc gasEip2929AccountCheck*(c: Computation;
|
proc gasEip2929AccountCheck*(c: Computation; address: EthAddress) =
|
||||||
address: EthAddress, prevCost = 0.GasInt) =
|
|
||||||
c.vmState.mutateStateDB:
|
c.vmState.mutateStateDB:
|
||||||
let gasCost = if not db.inAccessList(address):
|
let gasCost = if not db.inAccessList(address):
|
||||||
db.accessList(address)
|
db.accessList(address)
|
||||||
@ -38,7 +37,7 @@ proc gasEip2929AccountCheck*(c: Computation;
|
|||||||
WarmStorageReadCost
|
WarmStorageReadCost
|
||||||
|
|
||||||
c.gasMeter.consumeGas(
|
c.gasMeter.consumeGas(
|
||||||
gasCost - prevCost,
|
gasCost,
|
||||||
reason = "gasEIP2929AccountCheck")
|
reason = "gasEIP2929AccountCheck")
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,6 +187,15 @@ proc opCustomMain*() =
|
|||||||
Balance
|
Balance
|
||||||
stack: "0x000000000000000000000000000000000000000000000000cff56a1b273a8000"
|
stack: "0x000000000000000000000000000000000000000000000000cff56a1b273a8000"
|
||||||
|
|
||||||
|
assembler: # EIP2929 BALANCE OP
|
||||||
|
title: "EIP2929 BALANCE_1"
|
||||||
|
code:
|
||||||
|
Address
|
||||||
|
Balance
|
||||||
|
stack: "0x000000000000000000000000000000000000000000000000cff56a1b273a8000"
|
||||||
|
fork: berlin
|
||||||
|
gasused: 2602
|
||||||
|
|
||||||
assembler: # ORIGIN OP
|
assembler: # ORIGIN OP
|
||||||
title: "ORIGIN_1"
|
title: "ORIGIN_1"
|
||||||
code:
|
code:
|
||||||
@ -302,3 +311,6 @@ proc opCustomMain*() =
|
|||||||
code: "0x60012F6002"
|
code: "0x60012F6002"
|
||||||
stack: "0x0000000000000000000000000000000000000000000000000000000000000001"
|
stack: "0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||||
success: false
|
success: false
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
opCustomMain()
|
||||||
|
@ -307,3 +307,27 @@ proc opEnvMain*() =
|
|||||||
"0x6014525451606001601e5254516080016028525460a052546016604860003960"
|
"0x6014525451606001601e5254516080016028525460a052546016604860003960"
|
||||||
"0x166000f26000603f556103e75660005460005360200235"
|
"0x166000f26000603f556103e75660005460005360200235"
|
||||||
stack: "0x94"
|
stack: "0x94"
|
||||||
|
|
||||||
|
assembler: # EIP2929 EXTCODESIZE OP
|
||||||
|
title: "EIP2929 EXTCODESIZE_1"
|
||||||
|
code:
|
||||||
|
Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73"
|
||||||
|
ExtCodeSize
|
||||||
|
STOP
|
||||||
|
stack: "0x94"
|
||||||
|
fork: berlin
|
||||||
|
gasused: 2603
|
||||||
|
|
||||||
|
assembler: # EIP2929 EXTCODEHASH OP
|
||||||
|
title: "EIP2929 EXTCODEHASH_1"
|
||||||
|
code:
|
||||||
|
Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73"
|
||||||
|
ExtCodeHash
|
||||||
|
STOP
|
||||||
|
stack:
|
||||||
|
"0xc862129bffb73168481c6a51fd36afb8342887fbc5314c763ac731c732d7310c"
|
||||||
|
fork: berlin
|
||||||
|
gasused: 2603
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
opEnvMain()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user