Nimbus light client integration with status-go
This commit is contained in:
parent
2a3c67b4be
commit
108a82fe98
|
@ -65,7 +65,7 @@
|
||||||
branch = master
|
branch = master
|
||||||
[submodule "vendor/nim-confutils"]
|
[submodule "vendor/nim-confutils"]
|
||||||
path = vendor/nim-confutils
|
path = vendor/nim-confutils
|
||||||
url = https://github.com/status-im/nim-confutils.git
|
url = https://github.com/siphiuel/nim-confutils.git
|
||||||
ignore = dirty
|
ignore = dirty
|
||||||
branch = master
|
branch = master
|
||||||
[submodule "vendor/nim-blscurve"]
|
[submodule "vendor/nim-blscurve"]
|
||||||
|
|
63
Makefile
63
Makefile
|
@ -70,6 +70,7 @@ TOOLS_CSV := $(subst $(SPACE),$(COMMA),$(TOOLS))
|
||||||
nimbus \
|
nimbus \
|
||||||
fluffy \
|
fluffy \
|
||||||
nimbus_verified_proxy \
|
nimbus_verified_proxy \
|
||||||
|
libverifproxy \
|
||||||
test \
|
test \
|
||||||
test-reproducibility \
|
test-reproducibility \
|
||||||
clean \
|
clean \
|
||||||
|
@ -272,9 +273,69 @@ evmstate_test: | build deps evmstate
|
||||||
txparse: | build deps
|
txparse: | build deps
|
||||||
$(ENV_SCRIPT) nim c $(NIM_PARAMS) "tools/txparse/$@.nim"
|
$(ENV_SCRIPT) nim c $(NIM_PARAMS) "tools/txparse/$@.nim"
|
||||||
|
|
||||||
|
# Shared library for verified proxy
|
||||||
|
OS = $(shell $(CC) -dumpmachine)
|
||||||
|
ifneq (, $(findstring darwin, $(OS)))
|
||||||
|
SHAREDLIBEXT = a
|
||||||
|
else
|
||||||
|
ifneq (, $(findstring mingw, $(OS))$(findstring cygwin, $(OS))$(findstring msys, $(OS)))
|
||||||
|
SHAREDLIBEXT = lib
|
||||||
|
else
|
||||||
|
SHAREDLIBEXT = a
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
VERIF_PROXY_OUT_PATH ?= build/libverifproxy/
|
||||||
|
VERIFPROXY_OBJS = $(shell find nimcache/libverifproxy -name "*.o")
|
||||||
|
LIBNATPMP_OBJS = $(shell find vendor/nim-nat-traversal/vendor/libnatpmp-upstream -name "*.o")
|
||||||
|
LIBMINIUPNPC_OBJS = $(shell find vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc -name "*.o")
|
||||||
|
LIBBACKTRACE_OBJS = $(shell find vendor/nim-libbacktrace/vendor/libbacktrace-upstream -name "*.o")
|
||||||
|
LIBBACKTRACE_WRAPPER_OBJS = vendor/nim-libbacktrace/libbacktrace_wrapper.o
|
||||||
|
ALL_OBJS = $(VERIFPROXY_OBJS) $(LIBNATPMP_OBJS) $(LIBMINIUPNPC_OBJS) $(LIBBACKTRACE_WRAPPER_OBJS) $(LIBBACKTRACE_OBJS)
|
||||||
|
|
||||||
|
libverifproxy-objs: | build deps
|
||||||
|
+ echo -e $(BUILD_MSG) "build/$@" && \
|
||||||
|
$(ENV_SCRIPT) nim c --noLinking:on --gc:boehm -d:"libp2p_pki_schemes=secp256k1" --header:verifproxy.h --noMain:on --nimcache:nimcache/libverifproxy -o:build/$@ $(NIM_PARAMS) nimbus_verified_proxy/nimbus_verified_proxy.nim && \
|
||||||
|
mkdir -p build/libverifproxy && \
|
||||||
|
find nimcache/libverifproxy -name "*.o" | xargs -I {} cp {} $(VERIF_PROXY_OUT_PATH) && \
|
||||||
|
find vendor/nim-nat-traversal/vendor/libnatpmp-upstream -name "*.o" | xargs -I {} cp {} $(VERIF_PROXY_OUT_PATH) && \
|
||||||
|
find vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc -name "*.o" | xargs -I {} cp {} $(VERIF_PROXY_OUT_PATH) && \
|
||||||
|
find vendor/nim-libbacktrace/vendor/libbacktrace-upstream -name "*.o" | xargs -I {} cp {} $(VERIF_PROXY_OUT_PATH) && \
|
||||||
|
cp vendor/nim-libbacktrace/libbacktrace_wrapper.o $(VERIF_PROXY_OUT_PATH) && \
|
||||||
|
cp nimcache/libverifproxy/verifproxy.h $(VERIF_PROXY_OUT_PATH)
|
||||||
|
# echo ${ALL_OBJS} | tr ' ' '\n' > build/libverifproxy-objs/objs.lst
|
||||||
|
echo -e $(BUILD_END_MSG) "build/$@"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# gc:markAndSweep: exception "URL hostname is missing"
|
||||||
|
# vendor/nim-json-rpc/json_rpc/rpcproxy.nim(99) start
|
||||||
|
# vendor/nim-chronos/chronos/asyncfutures2.nim(369) futureContinue
|
||||||
|
|
||||||
|
# gc:refc: SIGSEGV
|
||||||
|
|
||||||
|
# gc:boehm: ok
|
||||||
|
|
||||||
|
# gc:go: Error: system module needs: unsureAsgnRef during compilation
|
||||||
|
libverifproxy: | build deps
|
||||||
|
+ echo -e $(BUILD_MSG) "build/$@" && \
|
||||||
|
$(ENV_SCRIPT) nim --version && \
|
||||||
|
$(ENV_SCRIPT) nim c --app:staticLib -d:"libp2p_pki_schemes=secp256k1" --opt:size --gc:boehm --header:verifproxy.h --noMain:on --nimcache:nimcache/libverifproxy -o:$(VERIF_PROXY_OUT_PATH)/$@.$(SHAREDLIBEXT) $(NIM_PARAMS) nimbus_verified_proxy/nimbus_verified_proxy.nim
|
||||||
|
cp nimcache/libverifproxy/verifproxy.h $(VERIF_PROXY_OUT_PATH)/
|
||||||
|
cp vendor/nimbus-build-system/vendor/Nim-csources-v1/c_code/nimbase.h $(VERIF_PROXY_OUT_PATH)/
|
||||||
|
echo -e $(BUILD_END_MSG) "build/$@"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
libverifproxy-source: | build deps
|
||||||
|
+ echo -e $(BUILD_MSG) "build/$@" && \
|
||||||
|
$(ENV_SCRIPT) nim c -c --genScript:on --noLinking:on -d:"libp2p_pki_schemes=secp256k1" --header:verifproxy.h --noMain:on --nimcache:nimcache/libverifproxy -o:build/$@ $(NIM_PARAMS) nimbus_verified_proxy/nimbus_verified_proxy.nim
|
||||||
|
echo -e $(BUILD_END_MSG) "build/$@"
|
||||||
|
|
||||||
# usual cleaning
|
# usual cleaning
|
||||||
clean: | clean-common
|
clean: | clean-common
|
||||||
rm -rf build/{nimbus,fluffy,nimbus_verified_proxy,$(TOOLS_CSV),all_tests,test_kvstore_rocksdb,test_rpc,all_fluffy_tests,all_fluffy_portal_spec_tests,test_portal_testnet,portalcli,blockwalk,eth_data_exporter,utp_test_app,utp_test,*.dSYM}
|
rm -rf build/{nimbus,fluffy,libverifproxy,nimbus_verified_proxy,$(TOOLS_CSV),all_tests,test_kvstore_rocksdb,test_rpc,all_fluffy_tests,all_fluffy_portal_spec_tests,test_portal_testnet,portalcli,blockwalk,eth_data_exporter,utp_test_app,utp_test,*.dSYM}
|
||||||
rm -rf tools/t8n/{t8n,t8n_test}
|
rm -rf tools/t8n/{t8n,t8n_test}
|
||||||
rm -rf tools/evmstate/{evmstate,evmstate_test}
|
rm -rf tools/evmstate/{evmstate,evmstate_test}
|
||||||
ifneq ($(USE_LIBBACKTRACE), 0)
|
ifneq ($(USE_LIBBACKTRACE), 0)
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
{.push raises: [].}
|
{.push raises: [].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/[os, strutils],
|
std/[json, os, strutils],
|
||||||
chronicles, chronicles/chronos_tools, chronos, confutils,
|
chronicles, chronicles/chronos_tools, chronos, confutils,
|
||||||
eth/keys,
|
eth/keys,
|
||||||
json_rpc/rpcproxy,
|
json_rpc/rpcproxy,
|
||||||
|
@ -40,14 +40,29 @@ func getConfiguredChainId(networkMetadata: Eth2NetworkMetadata): Quantity =
|
||||||
else:
|
else:
|
||||||
return networkMetadata.cfg.DEPOSIT_CHAIN_ID.Quantity
|
return networkMetadata.cfg.DEPOSIT_CHAIN_ID.Quantity
|
||||||
|
|
||||||
proc run(config: VerifiedProxyConf) {.raises: [CatchableError].} =
|
type OnHeaderCallback* = proc (s: cstring) {.cdecl.}
|
||||||
|
|
||||||
|
var optimisticHeaderCallback : OnHeaderCallback = nil
|
||||||
|
var finalizedHeaderCallback : OnHeaderCallback = nil
|
||||||
|
proc setOptimisticHeaderCallback*(cb: OnHeaderCallback) {.exportc.} =
|
||||||
|
optimisticHeaderCallback = cb
|
||||||
|
echo "optimistic header callback set"
|
||||||
|
|
||||||
|
proc setFinalizedHeaderCallback*(cb: OnHeaderCallback) {.exportc.} =
|
||||||
|
finalizedHeaderCallback = cb
|
||||||
|
echo "finalized header callback set"
|
||||||
|
|
||||||
|
|
||||||
|
proc run(config: VerifiedProxyConf) {.raises: [CatchableError, Exception].} =
|
||||||
|
# echo "startLightClient inside nimbus-light-client"
|
||||||
|
|
||||||
# Required as both Eth2Node and LightClient requires correct config type
|
# Required as both Eth2Node and LightClient requires correct config type
|
||||||
var lcConfig = config.asLightClientConf()
|
var lcConfig = config.asLightClientConf()
|
||||||
|
|
||||||
setupLogging(config.logLevel, config.logStdout, none(OutFile))
|
setupLogging(config.logLevel, config.logStdout, none(OutFile))
|
||||||
|
|
||||||
notice "Launching Nimbus verified proxy",
|
notice "Launching Nimbus verified proxy",
|
||||||
version = fullVersionStr, cmdParams = commandLineParams(), config
|
version = fullVersionStr, cmdParams = getCLIParams(), config
|
||||||
|
|
||||||
let
|
let
|
||||||
metadata = loadEth2Network(config.eth2Network)
|
metadata = loadEth2Network(config.eth2Network)
|
||||||
|
@ -153,6 +168,14 @@ proc run(config: VerifiedProxyConf) {.raises: [CatchableError].} =
|
||||||
when lcDataFork > LightClientDataFork.None:
|
when lcDataFork > LightClientDataFork.None:
|
||||||
info "New LC finalized header",
|
info "New LC finalized header",
|
||||||
finalized_header = shortLog(forkyHeader)
|
finalized_header = shortLog(forkyHeader)
|
||||||
|
if finalizedHeaderCallback != nil:
|
||||||
|
notice "### Invoking finalizedHeaderCallback"
|
||||||
|
{.gcsafe.}:
|
||||||
|
try:
|
||||||
|
finalizedHeaderCallback(Json.encode(finalizedHeader))
|
||||||
|
except Exception as e:
|
||||||
|
notice "finalizedHeaderCallback exception"
|
||||||
|
|
||||||
|
|
||||||
proc onOptimisticHeader(
|
proc onOptimisticHeader(
|
||||||
lightClient: LightClient, optimisticHeader: ForkedLightClientHeader) =
|
lightClient: LightClient, optimisticHeader: ForkedLightClientHeader) =
|
||||||
|
@ -161,6 +184,14 @@ proc run(config: VerifiedProxyConf) {.raises: [CatchableError].} =
|
||||||
info "New LC optimistic header",
|
info "New LC optimistic header",
|
||||||
optimistic_header = shortLog(forkyHeader)
|
optimistic_header = shortLog(forkyHeader)
|
||||||
optimisticProcessor.setOptimisticHeader(forkyHeader.beacon)
|
optimisticProcessor.setOptimisticHeader(forkyHeader.beacon)
|
||||||
|
if optimisticHeaderCallback != nil:
|
||||||
|
notice "### Invoking optimisticHeaderCallback"
|
||||||
|
{.gcsafe.}:
|
||||||
|
try:
|
||||||
|
optimisticHeaderCallback(Json.encode(optimisticHeader))
|
||||||
|
except Exception:
|
||||||
|
notice "optimisticHeaderCallback exception"
|
||||||
|
|
||||||
|
|
||||||
lightClient.onFinalizedHeader = onFinalizedHeader
|
lightClient.onFinalizedHeader = onFinalizedHeader
|
||||||
lightClient.onOptimisticHeader = onOptimisticHeader
|
lightClient.onOptimisticHeader = onOptimisticHeader
|
||||||
|
@ -239,10 +270,88 @@ proc run(config: VerifiedProxyConf) {.raises: [CatchableError].} =
|
||||||
while true:
|
while true:
|
||||||
poll()
|
poll()
|
||||||
|
|
||||||
when isMainModule:
|
proc testEcho*() {.exportc.} =
|
||||||
{.pop.}
|
echo "in testEcho"
|
||||||
var config = makeBannerAndConfig(
|
|
||||||
"Nimbus verified proxy " & fullVersionStr, VerifiedProxyConf)
|
proc quit*() {.exportc.} =
|
||||||
{.push raises: [].}
|
echo "Quitting"
|
||||||
|
|
||||||
|
# template createConfig(clientId: string, ConfType: type, configFilePath: string): untyped =
|
||||||
|
# echo "### inside createConfig"
|
||||||
|
# let
|
||||||
|
# version = clientId & "\p" & copyrights & "\p\p" &
|
||||||
|
# "eth2 specification v" & SPEC_VERSION & "\p\p" &
|
||||||
|
# nimBanner
|
||||||
|
|
||||||
|
# # TODO for some reason, copyrights are printed when doing `--help`
|
||||||
|
# {.push warning[ProveInit]: off.}
|
||||||
|
# let config = try:
|
||||||
|
# echo "### inside createConfig before load"
|
||||||
|
# ConfType.load(
|
||||||
|
# version = version, # but a short version string makes more sense...
|
||||||
|
# copyrightBanner = clientId,
|
||||||
|
# secondarySources = proc (config: ConfType, sources: auto) =
|
||||||
|
# sources.addConfigFile(Toml, InputFile(configFilePath))
|
||||||
|
# )
|
||||||
|
# except CatchableError as err:
|
||||||
|
# # We need to log to stderr here, because logging hasn't been configured yet
|
||||||
|
# stderr.write "Failure while loading the configuration:\n"
|
||||||
|
# stderr.write err.msg
|
||||||
|
# stderr.write "\n"
|
||||||
|
|
||||||
|
# if err[] of ConfigurationError and
|
||||||
|
# err.parent != nil and
|
||||||
|
# err.parent[] of TomlFieldReadingError:
|
||||||
|
# let fieldName = ((ref TomlFieldReadingError)(err.parent)).field
|
||||||
|
# if fieldName in ["web3-url", "bootstrap-node",
|
||||||
|
# "direct-peer", "validator-monitor-pubkey"]:
|
||||||
|
# stderr.write "Since the '" & fieldName & "' option is allowed to " &
|
||||||
|
# "have more than one value, please make sure to supply " &
|
||||||
|
# "a properly formatted TOML array\n"
|
||||||
|
# quit 1
|
||||||
|
# {.pop.}
|
||||||
|
# config
|
||||||
|
|
||||||
|
proc NimMain() {.importc.}
|
||||||
|
proc startProxyViaJson*(configJson: cstring) {.exportc.} =
|
||||||
|
echo "startLcViaJson"
|
||||||
|
NimMain()
|
||||||
|
echo "startLcViaJson 1"
|
||||||
|
let str = $configJson
|
||||||
|
echo "startLcViaJson 2"
|
||||||
|
echo "startLcViaJson 3 ", str
|
||||||
|
try:
|
||||||
|
let jsonNode = parseJson(str)
|
||||||
|
|
||||||
|
let rpcAddr = jsonNode["RpcAddress"].getStr()
|
||||||
|
let config = VerifiedProxyConf(
|
||||||
|
rpcAddress: ValidIpAddress.init(rpcAddr),
|
||||||
|
listenAddress: defaultListenAddress,
|
||||||
|
eth2Network: some(jsonNode["Eth2Network"].getStr()),
|
||||||
|
trustedBlockRoot: Eth2Digest.fromHex(jsonNode["TrustedBlockRoot"].getStr()),
|
||||||
|
web3Url: parseCmdArg(ValidatedWeb3Url, jsonNode["Web3Url"].getStr()),
|
||||||
|
rpcPort: Port(jsonNode["RpcPort"].getInt()),
|
||||||
|
logLevel: jsonNode["LogLevel"].getStr(),
|
||||||
|
maxPeers: 160,
|
||||||
|
nat: NatConfig(hasExtIp: false, nat: NatAny),
|
||||||
|
logStdout: StdoutLogKind.Auto,
|
||||||
|
dataDir: OutDir(defaultVerifiedProxyDataDir()),
|
||||||
|
tcpPort: Port(defaultEth2TcpPort),
|
||||||
|
udpPort: Port(defaultEth2TcpPort),
|
||||||
|
agentString: "nimbus",
|
||||||
|
discv5Enabled: true,
|
||||||
|
)
|
||||||
|
|
||||||
run(config)
|
run(config)
|
||||||
|
except Exception as err:
|
||||||
|
echo "Exception when running ", getCurrentExceptionMsg(), err.getStackTrace()
|
||||||
|
|
||||||
|
# when isMainModule:
|
||||||
|
# let configFileStr = "config.toml"
|
||||||
|
# {.pop.}
|
||||||
|
# var config = createConfig("Nimbus verified proxy " & fullVersionStr, VerifiedProxyConf, configFileStr)
|
||||||
|
|
||||||
|
# {.push raises: [Defect].}
|
||||||
|
|
||||||
|
# echo "inside nimbus-light-client before run"
|
||||||
|
# run(config)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 38dfeaaabdc6792d0f4d701621cbe34001978456
|
Subproject commit 1cd27f83f42063eabb5515ae1358ea8858176546
|
Loading…
Reference in New Issue