nimbus-eth1/tests/test_precompiles.nim
Jordan Hrycaj c47f021596
Core db and aristo updates for destructor and tx logic (#1894)
* Disable `TransactionID` related functions from `state_db.nim`

why:
  Functions `getCommittedStorage()` and `updateOriginalRoot()` from
  the `state_db` module are nowhere used. The emulation of a legacy
  `TransactionID` type functionality is administratively expensive to
  provide by `Aristo` (the legacy DB version is only partially
  implemented, anyway).

  As there is no other place where `TransactionID`s are used, they will
  not be provided by the `Aristo` variant of the `CoreDb`. For the
  legacy DB API, nothing will change.

* Fix copyright headers in source code

* Get rid of compiler warning

* Update Aristo code, remove unused `merge()` variant, export `hashify()`

why:
  Adapt to upcoming `CoreDb` wrapper

* Remove synced tx feature from `Aristo`

why:
+ This feature allowed to synchronise transaction methods like begin,
  commit, and rollback for a group of descriptors.
+ The feature is over engineered and not needed for `CoreDb`, neither
  is it complete (some convergence features missing.)

* Add debugging helpers to `Kvt`

also:
  Update database iterator, add count variable yield argument similar
  to `Aristo`.

* Provide optional destructors for `CoreDb` API

why;
  For the upcoming Aristo wrapper, this allows to control when certain
  smart destruction and update can take place. The auto destructor works
  fine in general when the storage/cache strategy is known and acceptable
  when creating descriptors.

* Add update option for `CoreDb` API function `hash()`

why;
  The hash function is typically used to get the state root of the MPT.
  Due to lazy hashing, this might be not available on the `Aristo` DB.
  So the `update` function asks for re-hashing the gurrent state changes
  if needed.

* Update API tracking log mode: `info` => `debug

* Use shared `Kvt` descriptor in new Ledger API

why:
  No need to create a new descriptor all the time
2023-11-16 19:35:03 +00:00

109 lines
4.0 KiB
Nim

# Nimbus
# Copyright (c) 2018-2023 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or distributed except according to those terms.
import
std/[strformat, strutils, json, os, tables, macros],
unittest2, stew/byteutils,
eth/keys,
../nimbus/common/common,
../nimbus/[vm_computation,
vm_state,
vm_types,
constants,
vm_precompiles,
transaction,
transaction/call_evm
],
./test_helpers, ./test_allowed_to_fail
proc initAddress(i: byte): EthAddress = result[19] = i
template doTest(fixture: JsonNode; vmState: BaseVMState; fork: EVMFork, address: PrecompileAddresses): untyped =
for test in fixture:
let
expectedErr = test.hasKey("ExpectedError")
expected = if test.hasKey("Expected"): hexToSeqByte(test["Expected"].getStr) else: @[]
dataStr = test["Input"].getStr
gasExpected = if test.hasKey("Gas"): test["Gas"].getInt else: -1
let unsignedTx = Transaction(
txType: TxLegacy,
nonce: 0,
gasPrice: 1.GasInt,
gasLimit: 1_000_000_000.GasInt,
to: initAddress(address.byte).some,
value: 0.u256,
payload: if dataStr.len > 0: dataStr.hexToSeqByte else: @[]
)
let tx = signTransaction(unsignedTx, privateKey, ChainId(1), false)
let fixtureResult = testCallEvm(tx, tx.getSender, vmState, fork)
if expectedErr:
check fixtureResult.isError
else:
check not fixtureResult.isError
let c = fixtureResult.output == expected
if not c: echo "Output : " & fixtureResult.output.toHex & "\nExpected: " & expected.toHex
check c
if gasExpected >= 0:
if fixtureResult.gasUsed != gasExpected:
debugEcho "GAS: ", fixtureResult.gasUsed, " ", gasExpected
check fixtureResult.gasUsed == gasExpected
proc parseFork(x: string): EVMFork =
let x = x.toLowerAscii
for name, fork in nameToFork:
if name.toLowerAscii == x:
return fork
doAssert(false, "unsupported fork name " & x)
proc testFixture(fixtures: JsonNode, testStatusIMPL: var TestStatus) =
let
label = fixtures["func"].getStr
fork = parseFork(fixtures["fork"].getStr)
data = fixtures["data"]
privateKey = PrivateKey.fromHex("7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d")[]
vmState = BaseVMState.new(
BlockHeader(blockNumber: 1.u256),
BlockHeader(),
CommonRef.new(newCoreDbRef LegacyDbMemory, config = ChainConfig())
)
case toLowerAscii(label)
of "ecrecover": data.doTest(vmState, fork, paEcRecover)
of "sha256" : data.doTest(vmState, fork, paSha256)
of "ripemd" : data.doTest(vmState, fork, paRipeMd160)
of "identity" : data.doTest(vmState, fork, paIdentity)
of "modexp" : data.doTest(vmState, fork, paModExp)
of "bn256add" : data.doTest(vmState, fork, paEcAdd)
of "bn256mul" : data.doTest(vmState, fork, paEcMul)
of "ecpairing": data.doTest(vmState, fork, paPairing)
of "blake2f" : data.doTest(vmState, fork, paBlake2bf)
# EIP 2537: disabled
# reason: not included in berlin
#of "blsg1add" : data.doTest(vmState, fork, paBlsG1Add)
#of "blsg1mul" : data.doTest(vmState, fork, paBlsG1Mul)
#of "blsg1multiexp" : data.doTest(vmState, fork, paBlsG1MultiExp)
#of "blsg2add" : data.doTest(vmState, fork, paBlsG2Add)
#of "blsg2mul" : data.doTest(vmState, fork, paBlsG2Mul)
#of "blsg2multiexp": data.doTest(vmState, fork, paBlsG2MultiExp)
#of "blspairing": data.doTest(vmState, fork, paBlsPairing)
#of "blsmapg1": data.doTest(vmState, fork, paBlsMapG1)
#of "blsmapg2": data.doTest(vmState, fork, paBlsMapG2)
else:
echo "Unknown test vector '" & $label & "'"
testStatusIMPL = SKIPPED
proc precompilesMain*() =
suite "Precompiles":
jsonTest("PrecompileTests", testFixture, skipPrecompilesTests)
when isMainModule:
precompilesMain()