Add rpc for local node info (#810)

* Add rpc for local node info

* Group let statement
This commit is contained in:
KonradStaniec 2021-08-27 18:04:55 +02:00 committed by GitHub
parent 521f29c0a0
commit f0637cfbfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 105 additions and 8 deletions

View File

@ -13,7 +13,7 @@ import
json_rpc/rpcproxy,
eth/keys, eth/net/nat,
eth/p2p/discoveryv5/protocol as discv5_protocol,
./conf, ./network/state/portal_protocol, ./rpc/eth_api, ./rpc/bridge_client
./conf, ./network/state/portal_protocol, ./rpc/[eth_api, bridge_client, discovery_api]
proc initializeBridgeClient(maybeUri: Option[string]): Option[BridgeClient] =
try:
@ -70,6 +70,7 @@ proc run(config: PortalConf) {.raises: [CatchableError, Defect].} =
let ta = initTAddress(config.rpcAddress, config.rpcPort)
var rpcHttpServerWithProxy = RpcProxy.new([ta], config.proxyUri)
rpcHttpServerWithProxy.installEthApiHandlers()
rpcHttpServerWithProxy.installDiscoveryApiHandlers(d)
# TODO for now we can only proxy to local node (or remote one without ssl) to make it possible
# to call infura https://github.com/status-im/nim-json-rpc/pull/101 needs to get merged for http client to support https/
waitFor rpcHttpServerWithProxy.start()

View File

@ -0,0 +1,27 @@
# Nimbus
# Copyright (c) 2021 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.push raises: [Defect].}
import
json_rpc/[rpcproxy, rpcserver], stint,
eth/p2p/discoveryv5/protocol as discv5_protocol, eth/p2p/discoveryv5/enr
type
NodeInfoResponse = object
node_id: string
enr: string
proc installDiscoveryApiHandlers*(rpcServerWithProxy: var RpcProxy, discovery: discv5_protocol.Protocol)
{.raises: [Defect, CatchableError].} =
# https://ddht.readthedocs.io/en/latest/jsonrpc.html#discv5-nodeinfo
rpcServerWithProxy.rpc("discv5_nodeInfo") do() -> NodeInfoResponse:
let localNodeId = "0x" & discovery.localNode.id.toHex()
let localNodeEnr = discovery.localNode.record.toURI()
return NodeInfoResponse(node_id: localNodeId, enr: localNodeEnr)

View File

@ -12,7 +12,8 @@ import ../../test_macro
import
./test_portal_encoding,
./test_portal,
./test_content_network
./test_content_network,
./test_discovery_rpc
cliBuilder:
import

View File

@ -9,6 +9,7 @@ import
std/os,
testutils/unittests,
eth/[keys, trie/db, trie/hexary, ssz/ssz_serialization],
eth/p2p/discoveryv5/protocol as discv5_protocol,
../../nimbus/[genesis, chain_config, db/db_chain],
../network/state/portal_protocol, ../network/state/content,
./test_helpers
@ -73,3 +74,5 @@ procSuite "Content Network":
let hash = hexary.keccak(foundContent.get().payload.asSeq())
check hash.data == key
await node1.closeWait()
await node2.closeWait()

View File

@ -0,0 +1,65 @@
# Nimbus - Portal Network
# Copyright (c) 2021 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.used.}
import
chronos, testutils/unittests, stew/shims/net,
json_rpc/[rpcproxy, rpcserver], json_rpc/clients/httpclient,
stint,eth/p2p/discoveryv5/enr, eth/keys,
eth/p2p/discoveryv5/protocol as discv5_protocol,
../rpc/discovery_api, ./test_helpers
type TestCase = ref object
localDiscovery: discv5_protocol.Protocol
server: RpcProxy
client: RpcHttpClient
proc setupTest(rng: ref BrHmacDrbgContext): Future[TestCase] {.async.} =
let
localSrvAddress = "127.0.0.1"
localSrvPort = 8545
ta = initTAddress(localSrvAddress, localSrvPort)
localDiscoveryNode = initDiscoveryNode(
rng, PrivateKey.random(rng[]), localAddress(20302))
fakeProxyConfig = getHttpClientConfig("http://127.0.0.1:8546")
client = newRpcHttpClient()
var rpcHttpServerWithProxy = RpcProxy.new([ta], fakeProxyConfig)
rpcHttpServerWithProxy.installDiscoveryApiHandlers(localDiscoveryNode)
await rpcHttpServerWithProxy.start()
await client.connect(localSrvAddress, Port(localSrvPort))
return TestCase(localDiscovery: localDiscoveryNode, server: rpcHttpServerWithProxy, client: client)
proc stop(t: TestCase) {.async.} =
await t.server.stop()
await t.server.closeWait()
await t.localDiscovery.closeWait()
procSuite "Discovery Rpc":
let rng = newRng()
asyncTest "Get local node info":
let tc = await setupTest(rng)
let resp = await tc.client.call("discv5_nodeInfo", %[])
check:
resp.contains("node_id")
resp["node_id"].kind == JString
resp.contains("enr")
resp["enr"].kind == JString
let nodeId = resp["node_id"].getStr()
let nodeEnr = resp["enr"].getStr()
check:
nodeEnr == tc.localDiscovery.localNode.record.toURI()
nodeId == "0x" & tc.localDiscovery.localNode.id.toHex()
waitFor tc.stop()

View File

@ -34,3 +34,9 @@ proc initDiscoveryNode*(rng: ref BrHmacDrbgContext,
rng = rng)
result.open()
proc random*(T: type UInt256, rng: var BrHmacDrbgContext): T =
var key: UInt256
brHmacDrbgGenerate(addr rng, addr key, csize_t(sizeof(key)))
key

View File

@ -14,12 +14,6 @@ import
../network/state/portal_protocol,
./test_helpers
proc random(T: type UInt256, rng: var BrHmacDrbgContext): T =
var key: UInt256
brHmacDrbgGenerate(addr rng, addr key, csize_t(sizeof(key)))
key
type Default2NodeTest = ref object
node1: discv5_protocol.Protocol
node2: discv5_protocol.Protocol