nimbus-eth2/research/fakeee.nim

77 lines
2.7 KiB
Nim

## Fake execution engine API implementation useful for testing beacon node without a running execution node
# Nimbus
# Copyright (c) 2022-2023 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/typetraits,
json_rpc/[rpcserver, errors],
web3/[conversions, engine_api_types],
chronicles
proc setupEngineAPI*(server: RpcServer) =
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#engine_newpayloadv1
# cannot use `params` as param name. see https:#github.com/status-im/nim-json-rpc/issues/128
server.rpc("engine_newPayloadV1") do(payload: ExecutionPayloadV1) -> PayloadStatusV1:
info "engine_newPayloadV1",
number = $(distinctBase payload.blockNumber), hash = payload.blockHash
return PayloadStatusV1(
status: PayloadExecutionStatus.syncing,
)
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#engine_getpayloadv1
server.rpc("engine_getPayloadV1") do(payloadId: PayloadID) -> ExecutionPayloadV1:
info "engine_getPayloadV1",
id = payloadId.toHex
raise (ref InvalidRequest)(
code: engineApiUnknownPayload,
msg: "Unkown payload"
)
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#engine_exchangetransitionconfigurationv1
server.rpc("engine_exchangeTransitionConfigurationV1") do(conf: TransitionConfigurationV1) -> TransitionConfigurationV1:
info "engine_exchangeTransitionConfigurationV1",
ttd = conf.terminalTotalDifficulty,
number = uint64(conf.terminalBlockNumber),
blockHash = conf.terminalBlockHash
return conf
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#engine_forkchoiceupdatedv1
server.rpc("engine_forkchoiceUpdatedV1") do(
update: ForkchoiceStateV1,
payloadAttributes: Option[PayloadAttributesV1]) -> ForkchoiceUpdatedResponse:
info "engine_forkchoiceUpdatedV1",
update,
payloadAttributes
return ForkchoiceUpdatedResponse(
payloadStatus: PayloadStatusV1(
status: PayloadExecutionStatus.syncing))
when isMainModule:
let server = newRpcHttpServer(
# authHooks = @[httpJwtAuthHook, httpCorsHook],
)
server.addHttpServer(
initTAddress("127.0.0.1", 8551),
maxRequestBodySize = 16 * 1024 * 1024)
server.setupEngineAPI()
server.start()
when compiles(waitFor waitSignal(SIGINT)):
waitFor waitSignal(SIGINT)
waitFor server.stop()
else:
runForever()