aboutsummaryrefslogtreecommitdiffstats
path: root/docs/RPC-PUB-SUB.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/RPC-PUB-SUB.md')
-rw-r--r--docs/RPC-PUB-SUB.md142
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