A vipnode-client who wants to participate in usage-metered pools will need to implement an additional protocol for reporting which nodes the client is connected to.
This is a rough draft of what this protocol would look like.
Requirements
vipnode_client: Request for a set of vipnodes that are ready for nodeID to connect.
vipnode_update: Periodic updates with details about connected peers to the vipnode pool.
- (Optional)
vipnode_register: Automatic registration flow to update nodeID <- address mapping.
Question: Does it make sense to use a vipnode_ RPC method prefix for these, or should it be something more general?
Considerations
Can be implemented as a push to, or a pull from, the vipnode pool. It can be implemented as a streaming API (e.g. websocket) or separate request/response (e.g. HTTPS).
Question: Assuming that the target audience for the protocol is mobile clients, it's probably a better idea to do client-initiated polling request/response for the sake of battery life?
For the sake of consistency with the rest Ethereum's RPC, the calls will be JSON-RPC 2.0.
Payloads must be signed and verified with the node key to avoid pools from being able to fake paid activity.
Request/Response Examples:
Warning: These are out of date. See discussion.
vipnode_client:
TODO
vipnode_update:
(From the client)
Request POST https://pool.vipnode.org/api with body:
{
"jsonrpc": "2.0",
"method": "vipnode_peers",
"params": {
"nodeID": "19b5013d2424...0738ac974f6",
"timestamp": "1527609234005",
"signature": "<Signature of subset of payload by private node key>",
"peers": [
{
"nodeID": "1234abcd...dcba4321"
},
{
"nodeID": "1234abcd...dcba4321"
}
]
},
"id": 1
}
Response 200 from server with body:
{
"jsonrpc": "2.0",
"result": {
"balance": "xxx"
},
"id": 1
}
Questions
- What other metadata do we need from the peers?
- Which subset of the payload should the
signature sign? Should it include everything except the signature field, using a key-sorted deterministic JSON encoding?
- Should
signature be a top-level field? This would allow us to only sign params without injecting a new key, but would it violate JSON-RPC 2.0 and make the implementation more difficult for some JSONRPC libraries?
- Do we need anything else from the vipnode-pool in the response?
vipnode_register:
TODO, some related notes here: #7
A vipnode-client who wants to participate in usage-metered pools will need to implement an additional protocol for reporting which nodes the client is connected to.
This is a rough draft of what this protocol would look like.
Requirements
vipnode_client: Request for a set of vipnodes that are ready for nodeID to connect.vipnode_update: Periodic updates with details about connected peers to the vipnode pool.vipnode_register: Automatic registration flow to update nodeID <- address mapping.Question: Does it make sense to use a
vipnode_RPC method prefix for these, or should it be something more general?Considerations
Can be implemented as a push to, or a pull from, the vipnode pool. It can be implemented as a streaming API (e.g. websocket) or separate request/response (e.g. HTTPS).
Question: Assuming that the target audience for the protocol is mobile clients, it's probably a better idea to do client-initiated polling request/response for the sake of battery life?
For the sake of consistency with the rest Ethereum's RPC, the calls will be JSON-RPC 2.0.
Payloads must be signed and verified with the node key to avoid pools from being able to fake paid activity.
Request/Response Examples:
Warning: These are out of date. See discussion.
vipnode_client:TODO
vipnode_update:(From the client)
Request
POST https://pool.vipnode.org/apiwith body:{ "jsonrpc": "2.0", "method": "vipnode_peers", "params": { "nodeID": "19b5013d2424...0738ac974f6", "timestamp": "1527609234005", "signature": "<Signature of subset of payload by private node key>", "peers": [ { "nodeID": "1234abcd...dcba4321" }, { "nodeID": "1234abcd...dcba4321" } ] }, "id": 1 }Response
200from server with body:{ "jsonrpc": "2.0", "result": { "balance": "xxx" }, "id": 1 }Questions
signaturesign? Should it include everything except the signature field, using a key-sorted deterministic JSON encoding?signaturebe a top-level field? This would allow us to only signparamswithout injecting a new key, but would it violate JSON-RPC 2.0 and make the implementation more difficult for some JSONRPC libraries?vipnode_register:TODO, some related notes here: #7