fixes EIP2929 opcodes impl

This commit is contained in:
jangko 2020-12-11 20:26:55 +07:00
parent 3db535aa39
commit 01dec1d359
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9

View File

@ -23,14 +23,14 @@ logScope:
# ################################## # ##################################
# Syntactic sugar # Syntactic sugar
proc gasEip2929AccountCheck(c: Computation, address: EthAddress) = proc gasEip2929AccountCheck(c: Computation, 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)
ColdAccountAccessCost ColdAccountAccessCost
else: else:
WarmStorageReadCost WarmStorageReadCost
c.gasMeter.consumeGas(gasCost, reason = "gasEIP2929AccountCheck") c.gasMeter.consumeGas(gasCost - prevCost, reason = "gasEIP2929AccountCheck")
template push(x: typed) {.dirty.} = template push(x: typed) {.dirty.} =
## Push an expression on the computation stack ## Push an expression on the computation stack
@ -788,11 +788,11 @@ template genCall(callName: untyped, opCode: Op): untyped =
# from 700 to 40 # from 700 to 40
#when opCode == StaticCall: #when opCode == StaticCall:
# if c.fork >= FkBerlin and destination.toInt <= MaxPrecompilesAddr: # if c.fork >= FkBerlin and destination.toInt <= MaxPrecompilesAddr:
# childGasFee = childGasFee - 660.GasInt # gasCost = gasCost - 660.GasInt
# EIP2929 # EIP2929
if c.fork >= FkBerlin: if c.fork >= FkBerlin:
c.gasEip2929AccountCheck(destination) c.gasEip2929AccountCheck(destination, gasFees[c.fork][GasCall])
if gasCost >= 0: if gasCost >= 0:
c.gasMeter.consumeGas(gasCost, reason = $opCode) c.gasMeter.consumeGas(gasCost, reason = $opCode)
@ -974,18 +974,19 @@ 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.gasEip2929AccountCheck(address)
c.gasEip2929AccountCheck(address, gasFees[c.fork][GasBalance])
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.gasEip2929AccountCheck(address) c.gasEip2929AccountCheck(address, gasFees[c.fork][GasExtCodeHash])
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.gasEip2929AccountCheck(address) c.gasEip2929AccountCheck(address, gasFees[c.fork][GasExtCode])
push: c.getCodeSize(address) push: c.getCodeSize(address)
op extCodeCopyEIP2929, inline = true: op extCodeCopyEIP2929, inline = true:
@ -998,7 +999,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.gasEip2929AccountCheck(address) c.gasEip2929AccountCheck(address, gasFees[c.fork][GasExtCode])
let codeBytes = c.getCode(address) let codeBytes = c.getCode(address)
c.memory.writePaddedResult(codeBytes, memPos, codePos, len) c.memory.writePaddedResult(codeBytes, memPos, codePos, len)
@ -1030,9 +1031,9 @@ op sloadEIP2929, inline = true, slot:
c.vmState.mutateStateDB: c.vmState.mutateStateDB:
let gasCost = if not db.inAccessList(c.msg.contractAddress, slot): let gasCost = if not db.inAccessList(c.msg.contractAddress, slot):
db.accessList(c.msg.contractAddress, slot) db.accessList(c.msg.contractAddress, slot)
ColdSloadCost ColdSloadCost - gasFees[c.fork][GasSLoad]
else: else:
WarmStorageReadCost WarmStorageReadCost - gasFees[c.fork][GasSLoad]
c.gasMeter.consumeGas(gasCost, reason = "sloadEIP2929") c.gasMeter.consumeGas(gasCost, reason = "sloadEIP2929")
push: c.getStorage(slot) push: c.getStorage(slot)