add fake execution engine server (#4250)

Useful for testing beacon node without running an execution client
(results in an
optimistically synced node)
This commit is contained in:
Jacek Sieka 2022-10-19 00:18:36 +02:00 committed by GitHub
parent fa7b37a58a
commit fa9c60089c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 0 deletions

View File

@ -61,6 +61,7 @@ TOOLS := \
ncli \
ncli_db \
ncli_split_keystore \
fakeee \
wss_sim \
stack_sizes \
nimbus_light_client \

73
research/fakeee.nim Normal file
View File

@ -0,0 +1,73 @@
## Fake execution engine API implementation useful for testing beacon node without a running execution node
# Nimbus
# Copyright (c) 2018 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/main/src/engine/specification.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/main/src/engine/specification.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/main/src/engine/specification.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/main/src/engine/specification.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(
[initTAddress("127.0.0.1", 8551)],
# authHooks = @[httpJwtAuthHook, httpCorsHook]
)
server.setupEngineAPI()
server.start()
when compiles(waitFor waitSignal(SIGINT)):
waitFor waitSignal(SIGINT)
waitFor server.stop()
else:
runForever()