diff options
Diffstat (limited to 'docs/RPC-PUB-SUB.md')
-rw-r--r-- | docs/RPC-PUB-SUB.md | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/docs/RPC-PUB-SUB.md b/docs/RPC-PUB-SUB.md new file mode 100644 index 0000000..2e3fda4 --- /dev/null +++ b/docs/RPC-PUB-SUB.md @@ -0,0 +1,142 @@ +# RPC PUB-SUB + +Tangerine fullnode supports pub/sub using subscriptions as defined in the JSON-RPC 2.0 specification. This allows clients to wait for events instead of polling for them. + +It works by subscribing to particular events. The node will return a subscription id. For each event that matches the subscription a notification with relevant data is send together with the subscription id. + +Example: + + // create subscription + >> {"id": 1, "method": "eth_subscribe", "params": ["newHeads", {}]} + << {"jsonrpc":"2.0","id":1,"result":"0xcd0c3e8af590364c09d0fa6a1210faf5"} + + // incoming notifications + << {"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0xcd0c3e8af590364c09d0fa6a1210faf5","result":{"difficulty":"0xd9263f42a87",<...>, "uncles":[]}}} + << {"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0xcd0c3e8af590364c09d0fa6a1210faf5","result":{"difficulty":"0xd90b1a7ad02", <...>, "uncles":["0x80aacd1ea4c9da32efd8c2cc9ab38f8f70578fcd46a1a4ed73f82f3e0957f936"]}}} + + // cancel subscription + >> {"id": 1, "method": "eth_unsubscribe", "params": ["0xcd0c3e8af590364c09d0fa6a1210faf5"]} + << {"jsonrpc":"2.0","id":1,"result":true} + +# Considerations +1. notifications are send for current events and not for past events. If your use case requires you not to miss any notifications than subscriptions are probably not the best option. +2. subscriptions require a full duplex connection. Geth offers such connections in the form of websockets (enable with --ws) and ipc (enabled by default). +3. subscriptions are coupled to a connection. If the connection is closed all subscriptions that are created over this connection are removed. +4. notifications are stored in an internal buffer and sent from this buffer to the client. If the client is unable to keep up and the number of buffered notifications reaches a limit (currently 10k) the connection is closed. Keep in mind that subscribing to some events can cause a flood of notifications, e.g. listening for all logs/blocks when the node starts to synchronize. + +## Create subscription +Subscriptions are creates with a regular RPC call with `eth_subscribe` as method and the subscription name as first parameter. If successful it returns the subscription id. + +### Parameters +1. subscription name +2. optional arguments + +### Example + + >> {"id": 1, "method": "eth_subscribe", "params": ["newHeads", {"includeTransactions": true}]} + << {"id": 1, "jsonrpc": "2.0", "result": "0x9cef478923ff08bf67fde6c64013158d"} + +## Cancel subscription +Subscriptions are cancelled with a regular RPC call with `eth_unsubscribe` as method and the subscription id as first parameter. It returns a bool indicating if the subscription was cancelled successful. + +### Parameters +1. subscription id + +### Example + + >> {"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]} + << {"jsonrpc":"2.0","id":1,"result":true} + +# Supported subscriptions + +## newHeads +Fires a notification each time a new header is appended to the chain, including chain reorganizations. Users can use the bloom filter to determine if the block contains logs that are interested to them. + +In case of a chain reorganization the subscription will emit all new headers for the new chain. Therefore the subscription can emit multiple headers on the same height. + +### Example +``` + >> {"id": 1, "method": "eth_subscribe", "params": ["newHeads"]} + << {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"} + + << { + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "result": { + "difficulty": "0x15d9223a23aa", + "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773", + "gasLimit": "0x47e7c4", + "gasUsed": "0x38658", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "miner": "0xf8b483dba2c3b7176a3da549ad41a48bb3121069", + "nonce": "0x084149998194cc5f", + "number": "0x1348c9", + "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701", + "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378", + "timestamp": "0x56ffeff8", + "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f" + }, + "subscription": "0x9ce59a13059e417087c02d3236a0b1cc" + } +} +``` + +## logs +Returns logs that are included in new imported blocks and match the given filter criteria. + +In case of a chain reorganization previous sent logs that are on the old chain will be resend with the `removed` property set to true. Logs from transactions that ended up in the new chain are emitted. Therefore a subscription can emit logs for the same transaction multiple times. + +### Parameters +1. `object` with the following (optional) fields + - **address**, either an address or an array of addresses. Only logs that are created from these addresses are returned (optional) + - **topics**, only logs which match the specified topics (optional) + + +### Example + >> {"id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]} + << {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"} + + << {"jsonrpc":"2.0","method":"eth_subscription","params": {"subscription":"0x4a8a4c0517381924f9838102c5a4dcb7","result":{"address":"0x8320fe7702b96808f7bbc0d4a888ed1468216cfd","blockHash":"0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04","blockNumber":"0x29e87","data":"0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003","logIndex":"0x0","topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],"transactionHash":"0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4","transactionIndex":"0x0"}}} + +## newPendingTransactions +Returns the hash for all transactions that are added to the pending state and are signed with a key that is available in the node. + +When a transaction that was previously part of the canonical chain isn't part of the new canonical chain after a reogranization its again emitted. + +### Parameters +none + +### Example + >> {"id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]} + << {"jsonrpc":"2.0","id":2,"result":"0xc3b33aa549fb9a60e95d21862596617c"} + + << { + "jsonrpc":"2.0", + "method":"eth_subscription", + "params":{ + "subscription":"0xc3b33aa549fb9a60e95d21862596617c", + "result":"0xd6fdc5cc41a9959e922f30cb772a9aef46f4daea279307bc5f7024edc4ccd7fa" + } + } + +## syncing +Indicates when the node starts or stops synchronizing. The result can either be a boolean indicating that the synchronization has started (true), finished (false) or an object with various progress indicators. + +### Parameters +none + +### Example + >> {"id": 1, "method": "eth_subscribe", "params": ["syncing"]} + << {"jsonrpc":"2.0","id":2,"result":"0xe2ffeb2703bcf602d42922385829ce96"} + + << {"subscription":"0xe2ffeb2703bcf602d42922385829ce96","result":{"syncing":true,"status":{"startingBlock":674427,"currentBlock":67400,"highestBlock":674432,"pulledStates":0,"knownStates":0}}}} + + +## Possible future subscription: +- balance changes +- account changes +- nonce changes +- storage changes in contracts |