fixes EIP2929 CALL opCode

This commit is contained in:
jangko 2021-01-13 18:17:38 +07:00 committed by andri lim
parent dbb336fa07
commit f6c44ffcc0
12 changed files with 5805 additions and 45 deletions

View File

@ -53,8 +53,6 @@ OK: 3/3 Fail: 0/3 Skip: 0/3
+ wrongDifficulty.json OK + wrongDifficulty.json OK
+ wrongGasLimit.json OK + wrongGasLimit.json OK
+ wrongGasUsed.json OK + wrongGasUsed.json OK
+ wrongMixHash.json OK
+ wrongNonce.json OK
+ wrongNumber.json OK + wrongNumber.json OK
+ wrongParentHash.json OK + wrongParentHash.json OK
+ wrongParentHash2.json OK + wrongParentHash2.json OK
@ -64,7 +62,7 @@ OK: 3/3 Fail: 0/3 Skip: 0/3
+ wrongTransactionsTrie.json OK + wrongTransactionsTrie.json OK
+ wrongUncleHash.json OK + wrongUncleHash.json OK
``` ```
OK: 23/23 Fail: 0/23 Skip: 0/23 OK: 21/21 Fail: 0/21 Skip: 0/21
## bcMultiChainTest ## bcMultiChainTest
```diff ```diff
+ CallContractFromNotBestBlock.json OK + CallContractFromNotBestBlock.json OK
@ -11169,4 +11167,4 @@ OK: 804/804 Fail: 0/804 Skip: 0/804
OK: 519/519 Fail: 0/519 Skip: 0/519 OK: 519/519 Fail: 0/519 Skip: 0/519
---TOTAL--- ---TOTAL---
OK: 10904/10907 Fail: 0/10907 Skip: 3/10907 OK: 10902/10905 Fail: 0/10905 Skip: 3/10905

View File

@ -2179,11 +2179,14 @@ OK: 56/66 Fail: 0/66 Skip: 10/66
## stTimeConsuming ## stTimeConsuming
```diff ```diff
+ sstore_combinations_initial0.json OK + sstore_combinations_initial0.json OK
+ sstore_combinations_initial0_2.json OK
+ sstore_combinations_initial1.json OK + sstore_combinations_initial1.json OK
+ sstore_combinations_initial1_2.json OK
+ sstore_combinations_initial2.json OK + sstore_combinations_initial2.json OK
+ sstore_combinations_initial2_1.json OK
static_Call50000_sha256.json Skip static_Call50000_sha256.json Skip
``` ```
OK: 3/4 Fail: 0/4 Skip: 1/4 OK: 6/7 Fail: 0/7 Skip: 1/7
## stTransactionTest ## stTransactionTest
```diff ```diff
+ ContractStoreClearsOOG.json OK + ContractStoreClearsOOG.json OK
@ -2593,4 +2596,4 @@ OK: 133/133 Fail: 0/133 Skip: 0/133
OK: 130/130 Fail: 0/130 Skip: 0/130 OK: 130/130 Fail: 0/130 Skip: 0/130
---TOTAL--- ---TOTAL---
OK: 2289/2391 Fail: 0/2391 Skip: 102/2391 OK: 2292/2394 Fail: 0/2394 Skip: 102/2394

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -715,11 +715,17 @@ func istanbulGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
result[GasBalance] = 700 result[GasBalance] = 700
result[GasTXDataNonZero]= 16 result[GasTXDataNonZero]= 16
func berlinGasFees(previousFees: GasFeeSchedule): GasFeeSchedule =
# https://eips.ethereum.org/EIPS/eip-2929
result = previousFees
result[GasCall] = WarmStorageReadCost
const const
HomesteadGasFees = BaseGasFees.homesteadGasFees HomesteadGasFees = BaseGasFees.homesteadGasFees
TangerineGasFees = HomesteadGasFees.tangerineGasFees TangerineGasFees = HomesteadGasFees.tangerineGasFees
SpuriousGasFees = TangerineGasFees.spuriousGasFees SpuriousGasFees = TangerineGasFees.spuriousGasFees
IstanbulGasFees = SpuriousGasFees.istanbulGasFees IstanbulGasFees = SpuriousGasFees.istanbulGasFees
BerlinGasFees = IstanbulGasFees.berlinGasFees
gasFees*: array[Fork, GasFeeSchedule] = [ gasFees*: array[Fork, GasFeeSchedule] = [
FkFrontier: BaseGasFees, FkFrontier: BaseGasFees,
@ -730,7 +736,7 @@ const
FkConstantinople: SpuriousGasFees, FkConstantinople: SpuriousGasFees,
FkPetersburg: SpuriousGasFees, FkPetersburg: SpuriousGasFees,
FkIstanbul: IstanbulGasFees, FkIstanbul: IstanbulGasFees,
FkBerlin: IstanbulGasFees FkBerlin: BerlinGasFees
] ]

View File

@ -30,6 +30,7 @@ proc gasEip2929AccountCheck(c: Computation, address: EthAddress, prevCost = 0.Ga
ColdAccountAccessCost ColdAccountAccessCost
else: else:
WarmStorageReadCost WarmStorageReadCost
c.gasMeter.consumeGas(gasCost - prevCost, reason = "gasEIP2929AccountCheck") c.gasMeter.consumeGas(gasCost - prevCost, reason = "gasEIP2929AccountCheck")
template push(x: typed) {.dirty.} = template push(x: typed) {.dirty.} =
@ -771,6 +772,17 @@ template genCall(callName: untyped, opCode: Op): untyped =
else: else:
(memOutPos, memOutLen) (memOutPos, memOutLen)
# EIP2929
# This came before old gas calculator
# because it will affect `c.gasMeter.gasRemaining`
# and further `childGasLimit`
if c.fork >= FkBerlin:
c.vmState.mutateStateDB:
if not db.inAccessList(destination):
db.accessList(destination)
# The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost
c.gasMeter.consumeGas(ColdAccountAccessCost - WarmStorageReadCost, reason = "gasEIP2929Call")
let contractAddress = when opCode in {Call, StaticCall}: destination else: c.msg.contractAddress let contractAddress = when opCode in {Call, StaticCall}: destination else: c.msg.contractAddress
var (gasCost, childGasLimit) = c.gasCosts[opCode].c_handler( var (gasCost, childGasLimit) = c.gasCosts[opCode].c_handler(
value, value,
@ -790,10 +802,6 @@ template genCall(callName: untyped, opCode: Op): untyped =
# if c.fork >= FkBerlin and destination.toInt <= MaxPrecompilesAddr: # if c.fork >= FkBerlin and destination.toInt <= MaxPrecompilesAddr:
# gasCost = gasCost - 660.GasInt # gasCost = gasCost - 660.GasInt
# EIP2929
if c.fork >= FkBerlin:
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)

@ -1 +1 @@
Subproject commit 16fa567686a8cea578a500b0095c4d7f9f3bbe63 Subproject commit dd23a3e4edd4619d99933fc135cc88b31ca3cafb

View File

@ -96,6 +96,10 @@ func skipGSTTests*(folder: string, name: string): bool =
return true return true
func skipNewGSTTests*(folder: string, name: string): bool = func skipNewGSTTests*(folder: string, name: string): bool =
if folder == "stEIP2537":
# a bug in ethereum test that later fixed, skip for now
return true
# share the same slow and failing tests # share the same slow and failing tests
if skipGSTTests(folder, name): if skipGSTTests(folder, name):
return true return true
@ -119,7 +123,7 @@ func skipBCTests*(folder: string, name: string): bool =
] ]
func skipNewBCTests*(folder: string, name: string): bool = func skipNewBCTests*(folder: string, name: string): bool =
if folder == "vmPerformance" or folder == "stStaticCall": if folder in ["vmPerformance", "stStaticCall"]:
return true return true
# the new BC tests also contains these slow tests # the new BC tests also contains these slow tests

View File

@ -364,7 +364,8 @@ proc processBlock(chainDB: BaseChainDB, vmState: BaseVMState, minedBlock: PlainB
vmState.receipts[txIndex] = makeReceipt(vmState, fork) vmState.receipts[txIndex] = makeReceipt(vmState, fork)
if vmState.cumulativeGasUsed != minedBlock.header.gasUsed: if vmState.cumulativeGasUsed != minedBlock.header.gasUsed:
raise newException(ValidationError, &"wrong gas used in header expected={minedBlock.header.gasUsed}, actual={vmState.cumulativeGasUsed}") let diff = vmState.cumulativeGasUsed - minedBlock.header.gasUsed
raise newException(ValidationError, &"wrong gas used in header expected={minedBlock.header.gasUsed}, actual={vmState.cumulativeGasUsed}, diff={diff}")
assignBlockRewards(minedBlock, vmState, fork, vmState.chainDB) assignBlockRewards(minedBlock, vmState, fork, vmState.chainDB)

View File

@ -176,7 +176,7 @@ proc verifyStateDB*(wantedState: JsonNode, stateDB: ReadOnlyStateDB) =
actualNonce = stateDB.getNonce(account) actualNonce = stateDB.getNonce(account)
if wantedCode != actualCode: if wantedCode != actualCode:
raise newException(ValidationError, &"{ac} codeDiff {wantedCode} != {actualCode}") raise newException(ValidationError, &"{ac} codeDiff {wantedCode.toHex} != {actualCode.toHex}")
if wantedBalance != actualBalance: if wantedBalance != actualBalance:
raise newException(ValidationError, &"{ac} balanceDiff {wantedBalance.toHex} != {actualBalance.toHex}") raise newException(ValidationError, &"{ac} balanceDiff {wantedBalance.toHex} != {actualBalance.toHex}")
if wantedNonce != actualNonce: if wantedNonce != actualNonce:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff