nimbus-eth1/tests/test_merge.nim

165 lines
4.8 KiB
Nim
Raw Normal View History

# Nimbus
# Copyright (c) 2018-2024 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import
std/[json, os, typetraits],
2022-12-02 04:39:12 +00:00
unittest2,
json_rpc/[rpcserver, rpcclient],
web3/[engine_api_types, conversions],
../nimbus/sync/protocol,
2022-12-02 04:39:12 +00:00
../nimbus/rpc,
../nimbus/common,
../nimbus/config,
../nimbus/core/[sealer, tx_pool, chain],
../nimbus/beacon/[beacon_engine, payload_queue],
./test_helpers
const
baseDir = "tests" / "merge"
paramsFile = baseDir / "params.json"
stepsFile = baseDir / "steps.json"
type
StepObj = object
name: string
`method`: string
params: JSonNode
expect: JsonString
error : JsonString
Step = ref StepObj
Steps = seq[Step]
StepObj.useDefaultSerializationIn JrpcConv
proc forkChoiceUpdate(step: Step, client: RpcClient, testStatusIMPL: var TestStatus) =
let jsonBytes = waitFor client.call(step.`method`, step.params)
let resA = JrpcConv.decode(jsonBytes.string, ForkchoiceUpdatedResponse)
let resB = JrpcConv.decode(step.expect.string, ForkchoiceUpdatedResponse)
check resA == resB
proc getPayload(step: Step, client: RpcClient, testStatusIMPL: var TestStatus) =
try:
let jsonBytes = waitFor client.call(step.`method`, step.params)
let resA = JrpcConv.decode(jsonBytes.string, ExecutionPayloadV1)
let resB = JrpcConv.decode(step.expect.string, ExecutionPayloadV1)
check resA == resB
except CatchableError:
check step.error.string.len > 0
proc newPayload(step: Step, client: RpcClient, testStatusIMPL: var TestStatus) =
let jsonBytes = waitFor client.call(step.`method`, step.params)
let resA = JrpcConv.decode(jsonBytes.string, PayloadStatusV1)
let resB = JrpcConv.decode(step.expect.string, PayloadStatusV1)
check resA == resB
proc runTest(steps: Steps) =
let
conf = makeConfig(@["--custom-network:" & paramsFile])
ctx = newEthContext()
ethNode = setupEthNode(conf, ctx, eth)
2022-12-02 04:39:12 +00:00
com = CommonRef.new(
Unified database frontend integration (#1670) * Nimbus folder environment update details: * Integrated `CoreDbRef` for the sources in the `nimbus` sub-folder. * The `nimbus` program does not compile yet as it needs the updates in the parallel `stateless` sub-folder. * Stateless environment update details: * Integrated `CoreDbRef` for the sources in the `stateless` sub-folder. * The `nimbus` program compiles now. * Premix environment update details: * Integrated `CoreDbRef` for the sources in the `premix` sub-folder. * Fluffy environment update details: * Integrated `CoreDbRef` for the sources in the `fluffy` sub-folder. * Tools environment update details: * Integrated `CoreDbRef` for the sources in the `tools` sub-folder. * Nodocker environment update details: * Integrated `CoreDbRef` for the sources in the `hive_integration/nodocker` sub-folder. * Tests environment update details: * Integrated `CoreDbRef` for the sources in the `tests` sub-folder. * The unit tests compile and run cleanly now. * Generalise `CoreDbRef` to any `select_backend` supported database why: Generalisation was just missed due to overcoming some compiler oddity which was tied to rocksdb for testing. * Suppress compiler warning for `newChainDB()` why: Warning was added to this function which must be wrapped so that any `CatchableError` is re-raised as `Defect`. * Split off persistent `CoreDbRef` constructor into separate file why: This allows to compile a memory only database version without linking the backend library. * Use memory `CoreDbRef` database by default detail: Persistent DB constructor needs to import `db/core_db/persistent why: Most tests use memory DB anyway. This avoids linking `-lrocksdb` or any other backend by default. * fix `toLegacyBackend()` availability check why: got garbled after memory/persistent split. * Clarify raw access to MPT for snap sync handler why: Logically, `kvt` is not the raw access for the hexary trie (although this holds for the legacy database)
2023-08-04 11:10:09 +00:00
newCoreDbRef LegacyDbMemory,
conf.chainDbMode == ChainDbMode.Prune,
conf.networkId,
conf.networkParams
)
2022-12-02 04:39:12 +00:00
chainRef = newChain(com)
2022-12-02 04:39:12 +00:00
com.initializeEmptyDb()
var
rpcServer = newRpcSocketServer(["127.0.0.1:0"])
client = newRpcSocketClient()
2022-12-02 04:39:12 +00:00
txPool = TxPoolRef.new(com, conf.engineSigner)
sealingEngine = SealingEngineRef.new(
chainRef, ctx, conf.engineSigner,
txPool, EnginePostMerge
)
beaconEngine = BeaconEngineRef.new(txPool, chainRef)
oracle = Oracle.new(com)
setupEthRpc(ethNode, ctx, com, txPool, oracle, rpcServer)
setupEngineAPI(beaconEngine, rpcServer)
sealingEngine.start()
rpcServer.start()
waitFor client.connect(rpcServer.localAddress()[0])
suite "Engine API tests":
for i, step in steps:
test $i & " " & step.name:
case step.`method`
of "engine_forkchoiceUpdatedV1":
forkChoiceUpdate(step, client, testStatusIMPL)
of "engine_getPayloadV1":
getPayload(step, client, testStatusIMPL)
of "engine_newPayloadV1":
newPayload(step, client, testStatusIMPL)
else:
doAssert(false, "unknown method: " & step.`method`)
waitFor sealingEngine.stop()
rpcServer.stop()
waitFor rpcServer.closeWait()
proc testEngineAPI() =
let steps = JrpcConv.loadFile(stepsFile, Steps)
runTest(steps)
proc toId(x: int): PayloadId =
var id: distinctBase PayloadId
id[^1] = x.byte
PayloadId(id)
proc `==`(a, b: Quantity): bool =
uint64(a) == uint64(b)
2022-03-11 09:25:23 +00:00
proc testEngineApiSupport() =
var api = PayloadQueue()
let
id1 = toId(1)
id2 = toId(2)
ep1 = ExecutionPayloadV1(gasLimit: Quantity 100)
ep2 = ExecutionPayloadV1(gasLimit: Quantity 101)
hdr1 = common.BlockHeader(gasLimit: 100)
hdr2 = common.BlockHeader(gasLimit: 101)
hash1 = hdr1.blockHash
hash2 = hdr2.blockHash
suite "Test engine api support":
test "test payload queue":
2023-08-18 07:49:11 +00:00
api.put(id1, 123.u256, ep1)
api.put(id2, 456.u256, ep2)
var eep1, eep2: ExecutionPayloadV1
2023-08-18 07:49:11 +00:00
var bv1, bv2: UInt256
check api.get(id1, bv1, eep1)
check api.get(id2, bv2, eep2)
check eep1.gasLimit == ep1.gasLimit
check eep2.gasLimit == ep2.gasLimit
2023-08-18 07:49:11 +00:00
check bv1 == 123.u256
check bv2 == 456.u256
test "test header queue":
api.put(hash1, hdr1)
api.put(hash2, hdr2)
var eh1, eh2: common.BlockHeader
check api.get(hash1, eh1)
check api.get(hash2, eh2)
check eh1.gasLimit == hdr1.gasLimit
check eh2.gasLimit == hdr2.gasLimit
proc mergeMain*() =
2022-03-11 09:25:23 +00:00
# temporary disable it until engine API more stable
2022-03-17 05:54:04 +00:00
testEngineAPI()
2022-03-11 09:25:23 +00:00
testEngineApiSupport()
when isMainModule:
mergeMain()