mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-03-01 04:10:45 +00:00
The current getCanonicalHead of core db should not be confused with ForkedChain.latestHeader. Therefore we need to use getCanonicalHead to restricted case only, e.g. initializing ForkedChain.
81 lines
2.2 KiB
Nim
81 lines
2.2 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2023-2024 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/[json],
|
|
stew/[byteutils],
|
|
json_rpc/[rpcserver, rpcclient],
|
|
../../../nimbus/[
|
|
constants,
|
|
transaction,
|
|
db/ledger,
|
|
core/chain,
|
|
core/tx_pool,
|
|
rpc,
|
|
beacon/beacon_engine,
|
|
common
|
|
],
|
|
../../../tools/evmstate/helpers
|
|
|
|
type
|
|
TestEnv* = ref object
|
|
chain : ForkedChainRef
|
|
rpcServer : RpcHttpServer
|
|
rpcClient*: RpcHttpClient
|
|
|
|
proc genesisHeader(node: JsonNode): Header =
|
|
let genesisRLP = hexToSeqByte(node["genesisRLP"].getStr)
|
|
rlp.decode(genesisRLP, Block).header
|
|
|
|
proc initializeDb(memDB: CoreDbRef, node: JsonNode): Hash32 =
|
|
let
|
|
genesisHeader = node.genesisHeader
|
|
stateDB = LedgerRef.init(memDB)
|
|
|
|
memDB.persistHeaderAndSetHead(genesisHeader).expect("persistHeader no error")
|
|
setupStateDB(node["pre"], stateDB)
|
|
stateDB.persist()
|
|
doAssert stateDB.getStateRoot == genesisHeader.stateRoot
|
|
|
|
genesisHeader.blockHash
|
|
|
|
proc setupELClient*(conf: ChainConfig, taskPool: Taskpool, node: JsonNode): TestEnv =
|
|
let
|
|
memDB = newCoreDbRef DefaultDbMemory
|
|
genesisHash = initializeDb(memDB, node)
|
|
com = CommonRef.new(memDB, taskPool, conf)
|
|
chain = ForkedChainRef.init(com)
|
|
|
|
let headHash = chain.latestHash
|
|
doAssert(headHash == genesisHash)
|
|
|
|
let
|
|
txPool = TxPoolRef.new(chain)
|
|
beaconEngine = BeaconEngineRef.new(txPool, chain)
|
|
serverApi = newServerAPI(chain, txPool)
|
|
rpcServer = newRpcHttpServer(["127.0.0.1:0"])
|
|
rpcClient = newRpcHttpClient()
|
|
|
|
setupServerAPI(serverApi, rpcServer, newEthContext())
|
|
setupEngineAPI(beaconEngine, rpcServer)
|
|
|
|
rpcServer.start()
|
|
waitFor rpcClient.connect("127.0.0.1", rpcServer.localAddress[0].port, false)
|
|
|
|
TestEnv(
|
|
chain: chain,
|
|
rpcServer: rpcServer,
|
|
rpcClient: rpcClient,
|
|
)
|
|
|
|
proc stopELClient*(env: TestEnv) =
|
|
waitFor env.rpcClient.close()
|
|
waitFor env.rpcServer.closeWait()
|