Some version of the findContent JSON-RPC proc (#918)
Also includes fixing instantiation of the history network json-rpc API handles.
This commit is contained in:
parent
796787e0e5
commit
f4ca598c03
|
@ -48,6 +48,10 @@ curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1
|
||||||
# Extra parameter is an array of requested logarithmic distances
|
# Extra parameter is an array of requested logarithmic distances
|
||||||
curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"portal_state_findNodes","params":["enr:<base64 encoding of ENR>", [254, 255, 256]]}' http://localhost:8545 | jq
|
curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"portal_state_findNodes","params":["enr:<base64 encoding of ENR>", [254, 255, 256]]}' http://localhost:8545 | jq
|
||||||
|
|
||||||
|
# FindContent / Content
|
||||||
|
# A request with an invalid content key will not receive a response
|
||||||
|
curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"portal_state_findContent","params":["enr:<base64 encoding of ENR>", "02829bd824b016326a401d083b33d092293333a830d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"]}' http://localhost:8545 | jq
|
||||||
|
|
||||||
# Read out the Portal state network routing table contents
|
# Read out the Portal state network routing table contents
|
||||||
curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"portal_state_routingTableInfo","params":[]}' http://localhost:8545 | jq
|
curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"1","method":"portal_state_routingTableInfo","params":[]}' http://localhost:8545 | jq
|
||||||
```
|
```
|
||||||
|
|
|
@ -99,7 +99,7 @@ proc run(config: PortalConf) {.raises: [CatchableError, Defect].} =
|
||||||
rpcHttpServerWithProxy.installEthApiHandlers()
|
rpcHttpServerWithProxy.installEthApiHandlers()
|
||||||
rpcHttpServerWithProxy.installDiscoveryApiHandlers(d)
|
rpcHttpServerWithProxy.installDiscoveryApiHandlers(d)
|
||||||
rpcHttpServerWithProxy.installPortalApiHandlers(stateNetwork.portalProtocol, "state")
|
rpcHttpServerWithProxy.installPortalApiHandlers(stateNetwork.portalProtocol, "state")
|
||||||
rpcHttpServerWithProxy.installPortalApiHandlers(stateNetwork.portalProtocol, "history")
|
rpcHttpServerWithProxy.installPortalApiHandlers(historyNetwork.portalProtocol, "history")
|
||||||
# TODO for now we can only proxy to local node (or remote one without ssl) to make it possible
|
# 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/
|
# 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()
|
waitFor rpcHttpServerWithProxy.start()
|
||||||
|
|
|
@ -24,7 +24,7 @@ logScope:
|
||||||
|
|
||||||
const
|
const
|
||||||
alpha = 3 ## Kademlia concurrency factor
|
alpha = 3 ## Kademlia concurrency factor
|
||||||
enrsResultLimit = 32 ## Maximum amount of ENRs in the total Nodes messages
|
enrsResultLimit* = 32 ## Maximum amount of ENRs in the total Nodes messages
|
||||||
## that will be processed
|
## that will be processed
|
||||||
refreshInterval = 5.minutes ## Interval of launching a random query to
|
refreshInterval = 5.minutes ## Interval of launching a random query to
|
||||||
## refresh the routing table.
|
## refresh the routing table.
|
||||||
|
@ -308,7 +308,7 @@ proc offer*(p: PortalProtocol, dst: Node, contentKeys: ContentKeysList):
|
||||||
# id, and initiate an uTP stream with given uTP connection id to get the data
|
# id, and initiate an uTP stream with given uTP connection id to get the data
|
||||||
# out.
|
# out.
|
||||||
|
|
||||||
proc recordsFromBytes(rawRecords: List[ByteList, 32]): PortalResult[seq[Record]] =
|
proc recordsFromBytes*(rawRecords: List[ByteList, 32]): PortalResult[seq[Record]] =
|
||||||
var records: seq[Record]
|
var records: seq[Record]
|
||||||
for r in rawRecords.asSeq():
|
for r in rawRecords.asSeq():
|
||||||
var record: Record
|
var record: Record
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
import
|
import
|
||||||
std/sequtils,
|
std/sequtils,
|
||||||
json_rpc/[rpcproxy, rpcserver], stew/byteutils,
|
json_rpc/[rpcproxy, rpcserver], stew/byteutils,
|
||||||
|
eth/p2p/discoveryv5/nodes_verification,
|
||||||
../network/wire/portal_protocol,
|
../network/wire/portal_protocol,
|
||||||
./rpc_types
|
./rpc_types
|
||||||
|
|
||||||
|
@ -63,6 +64,49 @@ proc installPortalApiHandlers*(
|
||||||
else:
|
else:
|
||||||
return nodes.get().map(proc(n: Node): Record = n.record)
|
return nodes.get().map(proc(n: Node): Record = n.record)
|
||||||
|
|
||||||
|
# TODO: This returns null values for the `none`s. Not sure what it should be
|
||||||
|
# according to spec, no k:v pair at all?
|
||||||
|
# Note: Would it not be nice to have a call that resturns either content or
|
||||||
|
# ENRs, and that the connection id is used in the background instead of this
|
||||||
|
# "raw" `findContent` call.
|
||||||
|
rpcServer.rpc("portal_" & network & "_findContent") do(
|
||||||
|
enr: Record, contentKey: string) -> tuple[
|
||||||
|
connectionId: Option[string],
|
||||||
|
content: Option[string],
|
||||||
|
enrs: Option[seq[Record]]]:
|
||||||
|
let
|
||||||
|
node = toNodeWithAddress(enr)
|
||||||
|
content = await p.findContent(
|
||||||
|
node, ByteList.init(hexToSeqByte(contentKey)))
|
||||||
|
|
||||||
|
if content.isErr():
|
||||||
|
raise newException(ValueError, $content.error)
|
||||||
|
else:
|
||||||
|
let contentMessage = content.get()
|
||||||
|
case contentMessage.contentMessageType:
|
||||||
|
of connectionIdType:
|
||||||
|
return (
|
||||||
|
some("0x" & contentMessage.connectionId.toHex()),
|
||||||
|
none(string),
|
||||||
|
none(seq[Record]))
|
||||||
|
of contentType:
|
||||||
|
return (
|
||||||
|
none(string),
|
||||||
|
some("0x" & contentMessage.content.asSeq().toHex()),
|
||||||
|
none(seq[Record]))
|
||||||
|
of enrsType:
|
||||||
|
let records = recordsFromBytes(contentMessage.enrs)
|
||||||
|
if records.isErr():
|
||||||
|
raise newException(ValueError, $records.error)
|
||||||
|
else:
|
||||||
|
return (
|
||||||
|
none(string),
|
||||||
|
none(string),
|
||||||
|
# Note: Could also pass not verified nodes
|
||||||
|
some(verifyNodesRecords(
|
||||||
|
records.get(), node, enrsResultLimit).map(
|
||||||
|
proc(n: Node): Record = n.record)))
|
||||||
|
|
||||||
rpcServer.rpc("portal_" & network & "_recursiveFindNodes") do() -> seq[Record]:
|
rpcServer.rpc("portal_" & network & "_recursiveFindNodes") do() -> seq[Record]:
|
||||||
let discovered = await p.queryRandom()
|
let discovered = await p.queryRandom()
|
||||||
return discovered.map(proc(n: Node): Record = n.record)
|
return discovered.map(proc(n: Node): Record = n.record)
|
||||||
|
|
Loading…
Reference in New Issue