From 70dfaa895de986f2466e1d0b699294725e69bcf8 Mon Sep 17 00:00:00 2001 From: Neil Booth <kyuupichan@gmail.com> Date: Thu, 8 Mar 2018 12:52:16 +0800 Subject: [PATCH] More sphinx work --- docs/protocol-basics.rst | 91 ++++++++++++-------- docs/protocol-methods.rst | 173 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+), 37 deletions(-) diff --git a/docs/protocol-basics.rst b/docs/protocol-basics.rst index d729746..763668e 100644 --- a/docs/protocol-basics.rst +++ b/docs/protocol-basics.rst @@ -11,10 +11,19 @@ Two standards `JSON RPC 1.0 <http://www.jsonrpc.org/specification_v1>`_ and `JSON RPC 2.0 <http://www.jsonrpc.org/specification>`_ are specified; use of version 2.0 is encouraged but not required. Server support of batch requests -is encouraged for version 1.0 but not required. Clients making batch -requests should limit their size depending on the nature of their -query, because servers will limit response size as an anti-DoS -mechanism. +is encouraged for version 1.0 but not required. + +.. note:: A client or server should only indicate JSON RPC 2.0 by + setting the `jsonrpc + <http://www.jsonrpc.org/specification#request_object>`_ member of + its messages to ``"2.0"`` if it supports the version 2.0 protocol in + its entirety. ElectrumX does and will expect clients advertizing so + to function correctly. Those that do not will be disconnected and + possibly blacklisted. + +Clients making batch requests should limit their size depending on the +nature of their query, because servers will limit response size as an +anti-DoS mechanism. Eeach RPC call, and each response, is separated by a single newline in their respective streams. The JSON specification does not permit @@ -23,7 +32,8 @@ However it does permit newlines as extraneous whitespace between elements; client and server MUST NOT use newlines in such a way. If using JSON RPC 2.0's feature of parameter passing by name, the -names shown in the description of the method in question MUST be used. +names shown in the description of the method or notification in +question MUST be used. A server advertising support for a particular protocol version MUST support each method documented for that protocol version, unless the @@ -36,7 +46,7 @@ the protocol. Notifications ------------- -Some RPC calls are subscriptions, which, after the initial response, +Some RPC calls are subscriptions which, after the initial response, will send a JSON RPC :dfn:`notification` each time the thing subscribed to changes. The `method` of the notification is the same as the method of the subscription, and the `params` of the @@ -49,13 +59,11 @@ Version Negotiation It is desirable to have a way to enhance and improve the protocol without forcing servers and clients to upgrade at the same time. -Protocol negotiation is not implemented in any client or server at -present to the best of my knowledge, so care is needed to ensure -current clients and servers continue to operate as expected. -Protocol versions are denoted by dotted "a.b" strings, where *m* is -the major version number and *n* the minor version number. For -example: "1.5". +Protocol versions are denoted by dotted number strings with at least +one dot. Examples: "1.5", "1.4.1", "2.0". In "a.b.c" *a* is the +major version number, *b* the minor version number, and *c* the +revision number. A party to a connection will speak all protocol versions in a range, say from `protocol_min` to `protocol_max`, which may be the same. @@ -65,16 +73,17 @@ assume the protocol to use is their own `protocol_min`. The client should send a :func:`server.version` RPC call as early as possible in order to negotiate the precise protocol version; see its description for more detail. All responses received in the stream -from and including the server's response to this call will use the +from and including the server's response to this call will use its negotiated protocol version. + .. _deserialized header: Deserialized Headers -------------------- -A deserialized header is a dictionary that is coin-specific, and may -even vary in its members for the same coin at different heights. +A :dfn:`deserialized header` is a dictionary describing a block at a +given height. A typical example would be similar to this template:: @@ -88,13 +97,17 @@ A typical example would be similar to this template:: "nonce": <integer> } -The precise meaning of a block header varies across coins, and also by -coin depending on height, so deserialized headers are deprecated and -will be removed from the protocol in some future version. Instead, -raw headers (as hexadecimal strings) along with their height will be -returned by RPC calls, and it will be up to the client to interpret -them. Detailed knowledge of the meaning of a block header is neither -necessary nor appropriate in the server. +.. note:: The precise format of a deserialized block header varies by + coin, and also potentially by height for the same coin. Detailed + knowledge of the meaning of a block header is neither necessary nor + appropriate in the server. + + Consequently deserialized headers are deprecated and will be removed + from the protocol in a future version. Instead, raw headers (as + hexadecimal strings) along with their height will be returned by new + RPC calls, and it will be up to the client to interpret the meaning + of the raw header. + .. _script hashes: @@ -104,10 +117,10 @@ Script Hashes A :dfn:`script hash` is the hash of the binary bytes of the locking script (ScriptPubKey), expressed as a hexadecimal string. The hash function to use is given by the "hash_function" member of -:func:`server.features` (currently "sha256" only). Like for block and -transaction hashes, when converting the big-endian binary hash to a -hexadecimal string the least-significant byte appears first, and the -most-significant byte last. +:func:`server.features` (currently :func:`sha256` only). Like for +block and transaction hashes, when converting the big-endian binary +hash to a hexadecimal string the least-significant byte appears first, +and the most-significant byte last. For example, the legacy Bitcoin address from the genesis block:: @@ -127,7 +140,8 @@ which is sent to the server reversed as:: By subscribing to this hash you can find P2PKH payments to that address. -One public key for that address (the genesis block public key) is:: +One public key, the genesis block public key, among the trillions for +that address is:: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb 649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f @@ -145,12 +159,13 @@ which is sent to the server reversed as:: 740485f380ff6379d11ef6fe7d7cdd68aea7f8bd0d953d9fdf3531fb7d531833 -By subscribing to this hash you can find P2PK payments to that public -key. +By subscribing to this hash you can find P2PK payments to the genesis +block public key. + +.. note:: The Genesis block coinbase is uniquely unspendable and + therefore not indexed. It will not show with the above P2PK script + hash subscription. -.. note:: The Genesis block coinbase is unspendable and therefore not - indexed. It will not show with the above P2PK script hash - subscription. .. _status: @@ -160,8 +175,9 @@ Status To calculate the `status` of a :ref:`script hash <script hashes>` (or address): -1. order confirmed transactions to the script hash by height (and -position in the block if there are more than one in a block) +1. order confirmed transactions to the script hash by increasing +height (and position in the block if there are more than one in a +block) 2. form a string that is the concatenation of strings ``"tx_hash:height:"`` for each transaction in order, where: @@ -170,9 +186,10 @@ position in the block if there are more than one in a block) * ``height`` is the height of the block it is in. -3. Next, with mempool transactions in any order, append a string that -is the same, but where **height** is ``-1`` if the transaction has at -least one unconfirmed input, and ``0`` if all inputs are confirmed. +3. Next, with mempool transactions in any order, append a similar +string for those transactions, but where **height** is ``-1`` if the +transaction has at least one unconfirmed input, and ``0`` if all +inputs are confirmed. 4. The :dfn:`status` of the script hash is the :func:`sha256` hash of the full string expressed as a hexadecimal string. diff --git a/docs/protocol-methods.rst b/docs/protocol-methods.rst index 7c28fe0..6168afc 100644 --- a/docs/protocol-methods.rst +++ b/docs/protocol-methods.rst @@ -406,6 +406,179 @@ be accepted to the daemon's memory pool. 0.0 +blockchain.transaction.broadcast +-------------------------------- + +Broadcast a transaction to the network. + +**Signature** + + .. function:: blockchain.transaction.broadcast(raw_tx) + + *raw_tx* + + The raw transaction as a hexadecimal string. + +**Result** + + The transaction hash as a hexadecimal string. + + .. note:: protocol version 1.0 (only) does not respond according to + the JSON RPC specification if an error occurs. If the daemon + rejects the transaction, the result is the error message string + from the daemon, as if the call were successful. The client + needs to determine if an error occurred by comparing the result + to the expected transaction hash. Protocol version 1.1 and later + return a JSON RPC error as would be expected. + +**Result Examples** + +:: + + "a76242fce5753b4212f903ff33ac6fe66f2780f34bdb4b33b175a7815a11a98e" + +Protocol version 1.0 returning an error as the result: + +:: + + "258: txn-mempool-conflict" + +blockchain.transaction.get +-------------------------- + +Return a raw transaction. + +**Signature** + + .. function:: blockchain.transaction.get(tx_hash, verbose=False) + + *tx_hash* + + The transaction hash as a hexadecimal string. + + *verbose* + + .. versionadded:: 1.2 + + .. note:: Protocol version 1.0 also had a 2nd argument but ignored + it. This was removed in protocol 1.1 which took a single argument + only. + +**Result** + + If *verbose* is :const:`False`, the raw transaction as a + hexadecimal string. If :const:`True`, the result is coin-specific + and whatever the coin daemon returns when asked for a verbose form + of the raw transaction. + +**Example Results** + +When *verbose* is :const:`False`:: + + "01000000015bb9142c960a838329694d3fe9ba08c2a6421c5158d8f7044cb7c48006c1b48" + "4000000006a4730440220229ea5359a63c2b83a713fcc20d8c41b20d48fe639a639d2a824" + "6a137f29d0fc02201de12de9c056912a4e581a62d12fb5f43ee6c08ed0238c32a1ee76921" + "3ca8b8b412103bcf9a004f1f7a9a8d8acce7b51c983233d107329ff7c4fb53e44c855dbe1" + "f6a4feffffff02c6b68200000000001976a9141041fb024bd7a1338ef1959026bbba86006" + "4fe5f88ac50a8cf00000000001976a91445dac110239a7a3814535c15858b939211f85298" + "88ac61ee0700" + +When *verbose* is :const:`True`:: + + { + "blockhash": "0000000000000000015a4f37ece911e5e3549f988e855548ce7494a0a08b2ad6", + "blocktime": 1520074861, + "confirmations": 679, + "hash": "36a3692a41a8ac60b73f7f41ee23f5c917413e5b2fad9e44b34865bd0d601a3d", + "hex": "01000000015bb9142c960a838329694d3fe9ba08c2a6421c5158d8f7044cb7c48006c1b484000000006a4730440220229ea5359a63c2b83a713fcc20d8c41b20d48fe639a639d2a8246a137f29d0fc02201de12de9c056912a4e581a62d12fb5f43ee6c08ed0238c32a1ee769213ca8b8b412103bcf9a004f1f7a9a8d8acce7b51c983233d107329ff7c4fb53e44c855dbe1f6a4feffffff02c6b68200000000001976a9141041fb024bd7a1338ef1959026bbba860064fe5f88ac50a8cf00000000001976a91445dac110239a7a3814535c15858b939211f8529888ac61ee0700", + "locktime": 519777, + "size": 225, + "time": 1520074861, + "txid": "36a3692a41a8ac60b73f7f41ee23f5c917413e5b2fad9e44b34865bd0d601a3d", + "version": 1, + "vin": [ { + "scriptSig": { + "asm": "30440220229ea5359a63c2b83a713fcc20d8c41b20d48fe639a639d2a8246a137f29d0fc02201de12de9c056912a4e581a62d12fb5f43ee6c08ed0238c32a1ee769213ca8b8b[ALL|FORKID] 03bcf9a004f1f7a9a8d8acce7b51c983233d107329ff7c4fb53e44c855dbe1f6a4", + "hex": "4730440220229ea5359a63c2b83a713fcc20d8c41b20d48fe639a639d2a8246a137f29d0fc02201de12de9c056912a4e581a62d12fb5f43ee6c08ed0238c32a1ee769213ca8b8b412103bcf9a004f1f7a9a8d8acce7b51c983233d107329ff7c4fb53e44c855dbe1f6a4" + }, + "sequence": 4294967294, + "txid": "84b4c10680c4b74c04f7d858511c42a6c208bae93f4d692983830a962c14b95b", + "vout": 0}], + "vout": [ { "n": 0, + "scriptPubKey": { "addresses": [ "12UxrUZ6tyTLoR1rT1N4nuCgS9DDURTJgP"], + "asm": "OP_DUP OP_HASH160 1041fb024bd7a1338ef1959026bbba860064fe5f OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9141041fb024bd7a1338ef1959026bbba860064fe5f88ac", + "reqSigs": 1, + "type": "pubkeyhash"}, + "value": 0.0856647}, + { "n": 1, + "scriptPubKey": { "addresses": [ "17NMgYPrguizvpJmB1Sz62ZHeeFydBYbZJ"], + "asm": "OP_DUP OP_HASH160 45dac110239a7a3814535c15858b939211f85298 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91445dac110239a7a3814535c15858b939211f8529888ac", + "reqSigs": 1, + "type": "pubkeyhash"}, + "value": 0.1360904}]} + +blockchain.transaction.get_merkle +--------------------------------- + +Return the markle branch to a confirmed transaction given its hash +and height. + +**Signature** + + .. function:: blockchain.transaction.get_merkle(tx_hash, height) + + *tx_hash* + + The transaction hash as a hexadecimal string. + + *height* + + The height at which it was confirmed, an integer. + +**Result** + + A dictionary with the following keys: + + * *block_height* + + The height of the block the transaction was confirmed in. + + * *merkle* + + A list of transaction hashes the current hash is paired with, + recursively, in order to trace up to obtain merkle root of the + block, deepest pairing first. + + * *pos* + + The 0-based index of the position of the transaction in the + ordered list of transactions in the block. + +**Result Example** + +:: + + { + "merkle": + [ + "713d6c7e6ce7bbea708d61162231eaa8ecb31c4c5dd84f81c20409a90069cb24", + "03dbaec78d4a52fbaf3c7aa5d3fccd9d8654f323940716ddf5ee2e4bda458fde", + "e670224b23f156c27993ac3071940c0ff865b812e21e0a162fe7a005d6e57851", + "369a1619a67c3108a8850118602e3669455c70cdcdb89248b64cc6325575b885", + "4756688678644dcb27d62931f04013254a62aeee5dec139d1aac9f7b1f318112", + "7b97e73abc043836fd890555bfce54757d387943a6860e5450525e8e9ab46be5", + "61505055e8b639b7c64fd58bce6fc5c2378b92e025a02583303f69930091b1c3", + "27a654ff1895385ac14a574a0415d3bbba9ec23a8774f22ec20d53dd0b5386ff", + "5312ed87933075e60a9511857d23d460a085f3b6e9e5e565ad2443d223cfccdc", + "94f60b14a9f106440a197054936e6fb92abbd69d6059b38fdf79b33fc864fca0", + "2d64851151550e8c4d337f335ee28874401d55b358a66f1bafab2c3e9f48773d" + ], + "block_height": 450538, + "pos": 710 + } + mempool.get_fee_histogram -------------------------