[Content] - P2P - Compact block addition (#64)
* content - Add compact block inventory * content - p2p - Compact Block messages - Start adding `blocktxn`, `cmpctblock`, `getblocktxn`, and `sendcmpct` messages - blocktxn and getblocktxn description and format added - Placeholders for cmpctblock and sendcmpct * content - p2p - Sendcmpct message - Add details of `sendcmpct` including hex dump * content - p2p - CmpctBlock message - Add hexdump - Update description * content - Minor formatting updates * content - p2p - Update control and data message drawings - Add compact block related commands * content - p2p - Update compact block messages - Add info about protocol version when implemented - Add info to cmpctblock * content - p2p - Update compact block messages - Add some info from bitcoin-dot-org/bitcoin.org#2092 - Add detail to cmpctblock, sendcmpct, getblocktxn, blocktxn messages - Add reference terms * content - p2p - Comment out blocktxn and getblocktxn hexdump for now Closes #59
|
@ -20,7 +20,11 @@ bitcoin QR codes: URI QR code
|
||||||
bitcoinj:
|
bitcoinj:
|
||||||
'`block` message': block message
|
'`block` message': block message
|
||||||
'`block` messages': block message
|
'`block` messages': block message
|
||||||
|
'`blocktxn` message': blocktxn message
|
||||||
|
'`blocktxn` messages': blocktxn message
|
||||||
certificate chain:
|
certificate chain:
|
||||||
|
'`cmpctblock` message': cmpctblock message
|
||||||
|
'`cmpctblock` messages': cmpctblock message
|
||||||
DER:
|
DER:
|
||||||
DER format: der
|
DER format: der
|
||||||
DER-formatted: der
|
DER-formatted: der
|
||||||
|
@ -57,6 +61,8 @@ fiat:
|
||||||
'`filterload` messages': filterload message
|
'`filterload` messages': filterload message
|
||||||
'`getblocks` message': getblocks message
|
'`getblocks` message': getblocks message
|
||||||
'`getblocks` messages': getblocks message
|
'`getblocks` messages': getblocks message
|
||||||
|
'`getblocktxn` message': getblocktxn message
|
||||||
|
'`getblocktxn` messages': getblocktxn message
|
||||||
'`getdata` message': getdata message
|
'`getdata` message': getdata message
|
||||||
'`getdata` messages': getdata message
|
'`getdata` messages': getdata message
|
||||||
'`getheaders` message': getheaders message
|
'`getheaders` message': getheaders message
|
||||||
|
@ -172,6 +178,8 @@ RPC:
|
||||||
RPCs: rpc
|
RPCs: rpc
|
||||||
'`script`': DO NOT AUTOCROSSREF
|
'`script`': DO NOT AUTOCROSSREF
|
||||||
secp256k1:
|
secp256k1:
|
||||||
|
'`sendcmpct` message': sendcmpct message
|
||||||
|
'`sendcmpct` messages': sendcmpct message
|
||||||
'`spork` message': spork message
|
'`spork` message': spork message
|
||||||
'`spork` messages': spork message
|
'`spork` messages': spork message
|
||||||
'`ssc` message': ssc message
|
'`ssc` message': ssc message
|
||||||
|
|
|
@ -172,8 +172,9 @@ The currently-available type identifiers are:
|
||||||
| 17 | [`MSG_GOVERNANCE_OBJECT`][msg_governance_object]{:#term-msg_governance_object}{:.term} | The hash is a Governance Object.
|
| 17 | [`MSG_GOVERNANCE_OBJECT`][msg_governance_object]{:#term-msg_governance_object}{:.term} | The hash is a Governance Object.
|
||||||
| 18 | [`MSG_GOVERNANCE_OBJECT_VOTE`][msg_governance_object_vote]{:#term-msg_governance_object_vote}{:.term} | The hash is a Governance Object Vote.
|
| 18 | [`MSG_GOVERNANCE_OBJECT_VOTE`][msg_governance_object_vote]{:#term-msg_governance_object_vote}{:.term} | The hash is a Governance Object Vote.
|
||||||
| 19 | [`MSG_MASTERNODE_VERIFY`][msg_masternode_verify]{:#term-msg_masternode_verify}{:.term} | The hash is a Masternode Verify.
|
| 19 | [`MSG_MASTERNODE_VERIFY`][msg_masternode_verify]{:#term-msg_masternode_verify}{:.term} | The hash is a Masternode Verify.
|
||||||
|
| 20 | [`MSG_CMPCT_BLOCK`][msg_cmpct_block]{:#term-msg_cmpct_block}{:.term} | The hash is of a block header; identical to `MSG_BLOCK`. When used in a `getdata` message, this indicates the response should be a `cmpctblock` message. **Only for use in `getdata` messages.**
|
||||||
|
|
||||||
Type identifier zero and type identifiers greater than nineteen are reserved
|
Type identifier zero and type identifiers greater than twenty are reserved
|
||||||
for future implementations. Dash Core ignores all inventories with
|
for future implementations. Dash Core ignores all inventories with
|
||||||
one of these unknown types.
|
one of these unknown types.
|
||||||
|
|
||||||
|
@ -202,6 +203,166 @@ different reasons:
|
||||||
|
|
||||||
{% endautocrossref %}
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### Blocktxn
|
||||||
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
*Added in protocol version 70209 of Dash Core as described by BIP152*
|
||||||
|
|
||||||
|
The `blocktxn` message sends requested block transactions to a node which
|
||||||
|
previously requested them with a `getblocktxn` message. It is defined as a message
|
||||||
|
containing a serialized `BlockTransactions` message.
|
||||||
|
|
||||||
|
Upon receipt of a properly-formatted requested `blocktxn` message, nodes should:
|
||||||
|
|
||||||
|
1. Attempt to reconstruct the full block by taking the prefilledtxn transactions from the original `cmpctblock` message and placing them in the marked positions
|
||||||
|
2. For each short transaction ID from the original `cmpctblock` message, in order, find the corresponding transaction (from either the `blocktxn` message or from other sources)
|
||||||
|
3. Place each short transaction ID in the first available position in the block
|
||||||
|
4. Once the block has been reconstructed, it shall be processed as normal.
|
||||||
|
|
||||||
|
**Short transaction IDs are expected to occasionally collide. Nodes must
|
||||||
|
not be penalized for such collisions.**
|
||||||
|
|
||||||
|
The structure of `BlockTransactions` is defined below.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Encoding | Description|
|
||||||
|
|----------|----------------------|----------------------|----------|------------|
|
||||||
|
| 32 | blockhash | Binary blob | The output from a double-SHA256 of the block header, as used elsewhere | The blockhash of the block which the transactions being provided are in
|
||||||
|
| 1 or 3 | transactions<br>_length | CompactSize | As used to encode array lengths elsewhere | The number of transactions provided
|
||||||
|
| *Varies* | transactions | List of transactions | As encoded in `tx` messages in response to `getdata MSG_TX` | The transactions provided
|
||||||
|
|
||||||
|
<!-- HEXDUMP NEEDED
|
||||||
|
The following annotated hexdump shows a `blocktxn` message. (The
|
||||||
|
message header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
**ADD HEXDUMP HERE**
|
||||||
|
{% endhighlight %}
|
||||||
|
-->
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### CmpctBlock
|
||||||
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
*Added in protocol version 70209 of Dash Core as described by BIP152*
|
||||||
|
|
||||||
|
The `cmpctblock` message is a reply to a `getdata` message which
|
||||||
|
requested a block using the inventory type `MSG_CMPCT_BLOCK`. If the
|
||||||
|
requested block was recently announced and is close to the tip of the
|
||||||
|
best chain of the receiver and after having sent the requesting peer
|
||||||
|
a `sendcmpct` message, nodes respond with a `cmpctblock` message containing
|
||||||
|
data for the block.
|
||||||
|
|
||||||
|
**If the requested block is too old, the node responds with a *full non-compact block***
|
||||||
|
|
||||||
|
Upon receipt of a `cmpctblock` message, after sending a `sendcmpct` message,
|
||||||
|
nodes should calculate the short transaction ID for each unconfirmed
|
||||||
|
transaction they have available (i.e. in their mempool) and compare each
|
||||||
|
to each short transaction ID in the `cmpctblock` message. After finding
|
||||||
|
already-available transactions, nodes which do not have all transactions
|
||||||
|
available to reconstruct the full block should request the missing transactions
|
||||||
|
using a `getblocktxn` message.
|
||||||
|
|
||||||
|
A node must not send a `cmpctblock` message unless they are able to respond to
|
||||||
|
a `getblocktxn` message which requests every transaction in the block. A node
|
||||||
|
must not send a `cmpctblock` message without having validated that the header properly
|
||||||
|
commits to each transaction in the block, and properly builds on top of the existing,
|
||||||
|
fully-validated chain with a valid proof-of-work either as a part of the current most-work
|
||||||
|
valid chain, or building directly on top of it. A node may send a `cmpctblock` message before
|
||||||
|
validating that each transaction in the block validly spends existing UTXO set entries.
|
||||||
|
|
||||||
|
The `cmpctblock` message contains a vector of `PrefilledTransaction` whose
|
||||||
|
structure is defined below. A `PrefilledTransaction` is used in `HeaderAndShortIDs`
|
||||||
|
to provide a list of a few transactions explicitly.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Encoding | Description|
|
||||||
|
|----------|----------------------|----------------------|----------|------------|
|
||||||
|
| 1 or 3 | index | CompactSize | Compact Size, differentially encoded since the last PrefilledTransaction in a list | The index into the block at which this transaction is
|
||||||
|
| *Varies* | tx | Transaction | As encoded in `tx` messages sent in response to `getdata MSG_TX` | Transaction which is in the block at index `index`
|
||||||
|
|
||||||
|
The `cmpctblock` message is compromised of a serialized `HeaderAndShortIDs`
|
||||||
|
structure which is defined below. A `HeaderAndShortIDs` structure is used to
|
||||||
|
relay a block header, the short transactions IDs used for matching
|
||||||
|
already-available transactions, and a select few transactions which
|
||||||
|
we expect a peer may be missing.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Encoding | Description|
|
||||||
|
|----------|----------------------|----------------------|----------|------------|
|
||||||
|
| 80 | header | Block header | First 80 bytes of the block as defined by the encoding used by `block` messages | The header of the block being provided
|
||||||
|
| 8 | nonce | uint64_t | Little Endian | A nonce for use in short transaction ID calculations
|
||||||
|
| 1 or 3 | shortids_<br>length | CompactSize | As used to encode array lengths elsewhere | The number of short transaction IDs in `shortids` (i.e. block tx count - `prefilledtxn`<br>`_length`)
|
||||||
|
| *Varies* | shortids | List of 6-byte integers | Little Endian | The short transaction IDs calculated from the transactions which were not provided explicitly in `prefilledtxn`
|
||||||
|
| 1 or 3 | prefilledtxn<br>_length | CompactSize | As used to encode array lengths elsewhere | The number of prefilled transactions in `prefilledtxn` (i.e. block tx count - `shortids`<br>`_length`)
|
||||||
|
| *Varies* | prefilledtxn | List of Prefilled<br>Transactions | As defined by `Prefilled`<br>`Transaction` definition below | Used to provide the coinbase transaction and a select few which we expect a peer may be missing
|
||||||
|
|
||||||
|
**Short Transaction ID calculation**
|
||||||
|
|
||||||
|
Short transaction IDs are used to represent a transaction without sending a full 256-bit hash. They are calculated as follows,
|
||||||
|
|
||||||
|
* A single-SHA256 hashing the block header with the nonce appended (in little-endian)
|
||||||
|
* Running SipHash-2-4 with the input being the transaction ID and the keys (k0/k1) set to the first two little-endian 64-bit integers from the above hash, respectively.
|
||||||
|
* Dropping the 2 most significant bytes from the SipHash output to make it 6 bytes.
|
||||||
|
<!-- * Two null-bytes appended so it can be read as an 8-byte integer. -->
|
||||||
|
|
||||||
|
The following annotated hexdump shows a `cmpctblock` message. (The
|
||||||
|
message header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
00000020981178a4342cec6316296b2ad84c9b7cdf9f
|
||||||
|
2688e5d0fe1a0003cd0000000000f64870f52a3d0125
|
||||||
|
1336c9464961216732b25fbf288a51f25a0e81bffb20
|
||||||
|
e9600194d85a64a50d1cc02b0181 ................ Block Header
|
||||||
|
|
||||||
|
3151b67e5b418b9d ............................ Nonce
|
||||||
|
|
||||||
|
00 .......................................... Short IDs Length: 0
|
||||||
|
............................................. Short IDs: None
|
||||||
|
|
||||||
|
01 .......................................... Prefilled Transaction Length: 1
|
||||||
|
|
||||||
|
Prefilled Transactions
|
||||||
|
| 00 ........................................ Index: 0
|
||||||
|
|
|
||||||
|
| Transaction 1 (Coinbase)
|
||||||
|
| | 01000000 ................................ Transaction Version: 1
|
||||||
|
| | 01 ...................................... Input count: 1
|
||||||
|
| |
|
||||||
|
| | Transaction input #1
|
||||||
|
| | |
|
||||||
|
| | | 00000000000000000000000000000000
|
||||||
|
| | | 00000000000000000000000000000000 ..... Outpoint TXID
|
||||||
|
| | | ffffffff ............................. Outpoint index number: UINT32_MAX
|
||||||
|
| | |
|
||||||
|
| | | 13 ................................... Bytes in sig. script: 19
|
||||||
|
| | | 03daaf010e2f5032506f6f6c2d74444153482f Secp256k1 signature
|
||||||
|
| | |
|
||||||
|
| | | ffffffff ............................. Sequence number: UINT32_MAX
|
||||||
|
| |
|
||||||
|
| | 04 ..................................... Number of outputs: 04
|
||||||
|
| |
|
||||||
|
| | Transaction output #1
|
||||||
|
| | | ffe5654200000000 ..................... Duffs (11.13974271 Dash)
|
||||||
|
| | |
|
||||||
|
| | | 19 ................................... Bytes in pubkey script: 25
|
||||||
|
| | | | 76 ................................. OP_DUP
|
||||||
|
| | | | a9 ................................. OP_HASH160
|
||||||
|
| | | | 14 ................................. Push 20 bytes as data
|
||||||
|
| | | | | b885cb21ad12e593c1a46d814df47ccb
|
||||||
|
| | | | | 450a7d84 ......................... PubKey hash
|
||||||
|
| | | | 88 ................................. OP_EQUALVERIFY
|
||||||
|
| | | | ac ................................. OP_CHECKSIG
|
||||||
|
| |
|
||||||
|
| | [...] .................................. 3 more tx outputs omitted
|
||||||
|
| |
|
||||||
|
| | 00000000 ............................... locktime: 0 (a block height)
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
#### GetBlocks
|
#### GetBlocks
|
||||||
{% include helpers/subhead-links.md %}
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
@ -254,6 +415,44 @@ d39f608a7775b537729884d4e6633bb2
|
||||||
|
|
||||||
{% endautocrossref %}
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### GetBlockTxn
|
||||||
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
*Added in protocol version 70209 of Dash Core as described by BIP152*
|
||||||
|
|
||||||
|
The `getblocktxn` message requests a `blocktxn` message for any transactions
|
||||||
|
that it has not seen after a compact block is received. It is defined as a
|
||||||
|
message containing a serialized `BlockTransactionsRequest` message. Upon receipt
|
||||||
|
of a properly-formatted `getblocktxn` message, nodes which recently provided the
|
||||||
|
sender of such a message with a `cmpctblock` message for the block hash
|
||||||
|
identified in this message must respond with either an appropriate
|
||||||
|
`blocktxn` message, or a full block message.
|
||||||
|
|
||||||
|
A `blocktxn` message response must contain exactly and only each transaction
|
||||||
|
which is present in the appropriate block at the index specified in the
|
||||||
|
`getblocktxn` message indexes list, in the order requested.
|
||||||
|
|
||||||
|
The structure of `BlockTransactionsRequest` is defined below.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Encoding | Description|
|
||||||
|
|----------|-----------------|----------------------|----------|------|
|
||||||
|
| 32 | blockhash | Binary blob | The output from a double-SHA256 of the block header, as used elsewhere | The blockhash of the block which the transactions being requested are in
|
||||||
|
| *Varies* | indexes_length | CompactSize uint | As used to encode array lengths elsewhere | The number of transactions requested
|
||||||
|
| *Varies* | indexes | CompactSize uint[] | Differentially encoded | Vector of compactSize containing the indexes of the transactions being requested in the block.
|
||||||
|
|
||||||
|
<!-- HEXDUMP NEEDED
|
||||||
|
The following annotated hexdump shows a `getblocktxn` message. (The
|
||||||
|
message header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
**ADD HEXDUMP HERE**
|
||||||
|
{% endhighlight %}
|
||||||
|
-->
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
#### GetData
|
#### GetData
|
||||||
{% include helpers/subhead-links.md %}
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
@ -266,7 +465,7 @@ node typically previously received by way of an `inv` message.
|
||||||
The response to a `getdata` message can be a `tx` message, `block`
|
The response to a `getdata` message can be a `tx` message, `block`
|
||||||
message, `merkleblock` message, `ix` message, `txlvote` message,
|
message, `merkleblock` message, `ix` message, `txlvote` message,
|
||||||
`mnw` message, `mnb` message, `mnp` message, `dstx` message, `govobj` message,
|
`mnw` message, `mnb` message, `mnp` message, `dstx` message, `govobj` message,
|
||||||
`govobjvote` message, `mnv` message, or `notfound` message. <!-- What about spork? Only handled by getspork?-->
|
`govobjvote` message, `mnv` message, `notfound` message, or `cmpctblock` message. <!-- What about spork? Only handled by getspork?-->
|
||||||
|
|
||||||
This message cannot be used to request arbitrary data, such as historic
|
This message cannot be used to request arbitrary data, such as historic
|
||||||
transactions no longer in the memory pool or relay set. Full nodes may
|
transactions no longer in the memory pool or relay set. Full nodes may
|
||||||
|
@ -1289,6 +1488,57 @@ header has been omitted.)
|
||||||
|
|
||||||
{% endautocrossref %}
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### SendCmpct
|
||||||
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
*Added in protocol version 70209 of Dash Core as described by BIP152*
|
||||||
|
|
||||||
|
The `sendcmpct` message tells the receiving peer whether or not to announce new
|
||||||
|
blocks using a `cmpctblock` message. It also sends the compact block protocol
|
||||||
|
version it supports. The `sendcmpct` message is defined as a message containing
|
||||||
|
a 1-byte integer followed by a 8-byte integer. The first integer is interpreted
|
||||||
|
as a boolean and should have a value of either 1 or 0. The second integer
|
||||||
|
is be interpreted as a little-endian version number.
|
||||||
|
|
||||||
|
Upon receipt of a `sendcmpct` message with the first and second integers
|
||||||
|
set to 1, the node should announce new blocks by sending a `cmpctblock` message.
|
||||||
|
|
||||||
|
Upon receipt of a `sendcmpct` message with the first integer set to 0, the node
|
||||||
|
shouldn't announce new blocks by sending a `cmpctblock` message, but instead announce
|
||||||
|
new blocks by sending invs or headers, as defined by [BIP130][].
|
||||||
|
|
||||||
|
Upon receipt of a `sendcmpct` message with the second integer set to something
|
||||||
|
other than 1, nodes should treat the peer as if they had not received the message
|
||||||
|
(as it indicates the peer will provide an unexpected encoding in `cmpctblock` messages,
|
||||||
|
and/or other, messages). This allows future versions to send duplicate
|
||||||
|
`sendcmpct` messages with different versions as a part of a version handshake.
|
||||||
|
|
||||||
|
Nodes should check for a protocol version of >= 70209 before sending `sendcmpct`
|
||||||
|
messages. Nodes shouldn't send a request for a `MSG_CMPCT_BLOCK` object to a peer
|
||||||
|
before having received a `sendcmpct` message from that peer. Nodes shouldn't
|
||||||
|
request a `MSG_CMPCT_BLOCK` object before having sent all `sendcmpct` messages
|
||||||
|
to that peer which they intend to send, as the peer cannot know what protocol
|
||||||
|
version to use in the response.
|
||||||
|
|
||||||
|
The structure of a `sendcmpct` message is defined below.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|----------|---------------|------------------|--------------
|
||||||
|
| 1 | announce | bool | 0 - Announce blocks via `headers` message or `inv` message<br>1 - Announce blocks via `cmpctblock` message
|
||||||
|
| 8 | version | uint64_t | The compact block protocol version number
|
||||||
|
|
||||||
|
The annotated hexdump below shows a `sendcmpct` message. (The message
|
||||||
|
header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
01 ................................. Block announce type: Compact Blocks
|
||||||
|
0100000000000000 ................... Compact block version: 1
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
#### SendHeaders
|
#### SendHeaders
|
||||||
{% include helpers/subhead-links.md %}
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
@ -1302,7 +1552,6 @@ section][section message header] for an example of a message without a payload.
|
||||||
|
|
||||||
{% endautocrossref %}
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
|
||||||
#### Spork
|
#### Spork
|
||||||
{% include helpers/subhead-links.md %}
|
{% include helpers/subhead-links.md %}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,11 @@ http://opensource.org/licenses/MIT.
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
|
|
||||||
{% comment %}<!-- Terms; must have tooltip description in "quotes"; alphabetical order -->{% endcomment %}
|
{% comment %}<!-- Terms; must have tooltip description in "quotes"; alphabetical order -->{% endcomment %}
|
||||||
|
[blocktransactions]: /en/developer-reference#blocktxn "A P2P Networking data structure used to provide some of the transactions in a block as requested"
|
||||||
|
[blocktransactionsrequest]: /en/developer-reference#getblocktxn "A P2P Networking data structure used to list transaction indexes in a block being requested by a peer"
|
||||||
[coinbase block height]: /en/developer-reference#term-coinbase-block-height "The current block's height encoded into the first bytes of the coinbase field"
|
[coinbase block height]: /en/developer-reference#term-coinbase-block-height "The current block's height encoded into the first bytes of the coinbase field"
|
||||||
[data-pushing opcode]: https://en.bitcoin.it/wiki/Script#Constants "Any opcode from 0x01 to 0x4e which pushes data on to the script evaluation stack"
|
[data-pushing opcode]: https://en.bitcoin.it/wiki/Script#Constants "Any opcode from 0x01 to 0x4e which pushes data on to the script evaluation stack"
|
||||||
|
[headerandshortids]: /en/developer-reference#cmpctblock "A P2P Networking data structure used to relay a block header, the short transactions IDs used for matching already-available transactions, and a select few transactions which a peer may be missing"
|
||||||
[key index]: /en/developer-guide#term-key-index "An index number used in the HD wallet formula to generate child keys from a parent key"
|
[key index]: /en/developer-guide#term-key-index "An index number used in the HD wallet formula to generate child keys from a parent key"
|
||||||
[key pair]: /en/developer-guide#term-key-pair "A private key and its derived public key"
|
[key pair]: /en/developer-guide#term-key-pair "A private key and its derived public key"
|
||||||
<!-- Inventory Messages -->
|
<!-- Inventory Messages -->
|
||||||
|
@ -29,6 +32,7 @@ http://opensource.org/licenses/MIT.
|
||||||
[msg_governance_object]: /en/developer-reference#term-msg_governance_object "Governance object data type identifier of an inventory on the P2P network"
|
[msg_governance_object]: /en/developer-reference#term-msg_governance_object "Governance object data type identifier of an inventory on the P2P network"
|
||||||
[msg_governance_object_vote]: /en/developer-reference#term-msg_governance_object_vote "Governance object vote data type identifier of an inventory on the P2P network"
|
[msg_governance_object_vote]: /en/developer-reference#term-msg_governance_object_vote "Governance object vote data type identifier of an inventory on the P2P network"
|
||||||
[msg_masternode_verify]: /en/developer-reference#term-msg_masternode_verify "Masternode Verify data type identifier of an inventory on the P2P network"
|
[msg_masternode_verify]: /en/developer-reference#term-msg_masternode_verify "Masternode Verify data type identifier of an inventory on the P2P network"
|
||||||
|
[msg_cmpct_block]: /en/developer-reference#term-msg_cmpct_block "An alternative to the block header hash data type identifier of an inventory on the P2P network used to request a compact block"
|
||||||
|
|
||||||
[network]: /en/developer-guide#term-network "The Dash P2P network which broadcasts transactions and blocks"
|
[network]: /en/developer-guide#term-network "The Dash P2P network which broadcasts transactions and blocks"
|
||||||
[op_checkmultisig]: /en/developer-reference#term-op-checkmultisig "Opcode which returns true if one or more provided signatures (m) sign the correct parts of a transaction and match one or more provided public keys (n)"
|
[op_checkmultisig]: /en/developer-reference#term-op-checkmultisig "Opcode which returns true if one or more provided signatures (m) sign the correct parts of a transaction and match one or more provided public keys (n)"
|
||||||
|
@ -41,6 +45,7 @@ http://opensource.org/licenses/MIT.
|
||||||
[op_verify]: /en/developer-reference#term-op-verify "Operation which terminates the script if the entry below it on the stack is non-true (zero)"
|
[op_verify]: /en/developer-reference#term-op-verify "Operation which terminates the script if the entry below it on the stack is non-true (zero)"
|
||||||
[output index]: /en/developer-guide#term-output-index "The sequentially-numbered index of outputs in a single transaction starting from 0"
|
[output index]: /en/developer-guide#term-output-index "The sequentially-numbered index of outputs in a single transaction starting from 0"
|
||||||
[point function]: /en/developer-guide#term-point-function "The ECDSA function used to create a public key from a private key"
|
[point function]: /en/developer-guide#term-point-function "The ECDSA function used to create a public key from a private key"
|
||||||
|
[prefilledtransaction]: /en/developer-reference#cmpctblock "A P2P Networking data structure used to represent a vector of a few transactions"
|
||||||
[previous block header hash]: /en/developer-reference#term-previous-block-header-hash "A field in the block header which contains the SHA256(SHA256()) hash of the previous block's header"
|
[previous block header hash]: /en/developer-reference#term-previous-block-header-hash "A field in the block header which contains the SHA256(SHA256()) hash of the previous block's header"
|
||||||
[proper money handling]: /en/developer-reference#term-proper-money-handling "Bitcoin amounts need to be correctly processed without introducing rounding errors that could cause monetary loss"
|
[proper money handling]: /en/developer-reference#term-proper-money-handling "Bitcoin amounts need to be correctly processed without introducing rounding errors that could cause monetary loss"
|
||||||
[standard block relay]: /en/developer-guide#term-standard-block-relay "The regular block relay method: announcing a block with an inv message and waiting for a response"
|
[standard block relay]: /en/developer-guide#term-standard-block-relay "The regular block relay method: announcing a block with an inv message and waiting for a response"
|
||||||
|
@ -205,6 +210,8 @@ http://opensource.org/licenses/MIT.
|
||||||
[addr message]: /en/developer-reference#addr "The P2P network message which relays IP addresses and port numbers of active nodes to other nodes and clients, allowing decentralized peer discovery."
|
[addr message]: /en/developer-reference#addr "The P2P network message which relays IP addresses and port numbers of active nodes to other nodes and clients, allowing decentralized peer discovery."
|
||||||
[alert message]: /en/developer-reference#alert "The P2P network message which sends alerts in case of major software problems."
|
[alert message]: /en/developer-reference#alert "The P2P network message which sends alerts in case of major software problems."
|
||||||
[block message]: /en/developer-reference#block "The P2P network message which sends a serialized block"
|
[block message]: /en/developer-reference#block "The P2P network message which sends a serialized block"
|
||||||
|
[blocktxn message]: /en/developer-reference#blocktxn "The P2P network message which sends a list of requested transactions from a compact block"
|
||||||
|
[cmpctblock message]: /en/developer-reference#cmpctblock "The P2P network message which sends a serialized compact block"
|
||||||
[dsa message]: /en/developer-reference#dsa "A P2P network message used to join a mixing pool"
|
[dsa message]: /en/developer-reference#dsa "A P2P network message used to join a mixing pool"
|
||||||
[dsc message]: /en/developer-reference#dsc "A P2P network message used to indicates a PrivateSend mixing session is complete"
|
[dsc message]: /en/developer-reference#dsc "A P2P network message used to indicates a PrivateSend mixing session is complete"
|
||||||
[dsf message]: /en/developer-reference#dsf "A P2P network message sent as the final mixing transaction in a session asking users to sign the final mixing TX messages"
|
[dsf message]: /en/developer-reference#dsf "A P2P network message sent as the final mixing transaction in a session asking users to sign the final mixing TX messages"
|
||||||
|
@ -220,6 +227,7 @@ http://opensource.org/licenses/MIT.
|
||||||
[filterload message]: /en/developer-reference#filterclear "A P2P protocol message used to send a filter to a remote peer, requesting that they only send transactions which match the filter."
|
[filterload message]: /en/developer-reference#filterclear "A P2P protocol message used to send a filter to a remote peer, requesting that they only send transactions which match the filter."
|
||||||
[getaddr message]: /en/developer-reference#getaddr "A P2P protool message used to request an addr message containing connection information for other nodes"
|
[getaddr message]: /en/developer-reference#getaddr "A P2P protool message used to request an addr message containing connection information for other nodes"
|
||||||
[getblocks message]: /en/developer-reference#getblocks "A P2P protocol message used to request an inv message containing a range of block header hashes"
|
[getblocks message]: /en/developer-reference#getblocks "A P2P protocol message used to request an inv message containing a range of block header hashes"
|
||||||
|
[getblocktxn message]: /en/developer-reference#getblocktxn "A P2P protocol message used to request transactions from a compact block"
|
||||||
[getdata message]: /en/developer-reference#getdata "A P2P protocol message used to request one or more transactions, blocks, or merkle blocks"
|
[getdata message]: /en/developer-reference#getdata "A P2P protocol message used to request one or more transactions, blocks, or merkle blocks"
|
||||||
[getheaders message]: /en/developer-reference#getheaders "A P2P protocol message used to request a range of block headers"
|
[getheaders message]: /en/developer-reference#getheaders "A P2P protocol message used to request a range of block headers"
|
||||||
[getsporks message]: /en/developer-reference#getsporks "A P2P network message used to request the status of sporks"
|
[getsporks message]: /en/developer-reference#getsporks "A P2P network message used to request the status of sporks"
|
||||||
|
@ -240,6 +248,7 @@ http://opensource.org/licenses/MIT.
|
||||||
[ping message]: /en/developer-reference#ping "A P2P network message used to see if the remote host is still connected"
|
[ping message]: /en/developer-reference#ping "A P2P network message used to see if the remote host is still connected"
|
||||||
[pong message]: /en/developer-reference#pong "A P2P network message used to reply to a P2P network ping message"
|
[pong message]: /en/developer-reference#pong "A P2P network message used to reply to a P2P network ping message"
|
||||||
[reject message]: /en/developer-reference#reject "A P2P network message used to indicate a previously-received message was rejected for some reason"
|
[reject message]: /en/developer-reference#reject "A P2P network message used to indicate a previously-received message was rejected for some reason"
|
||||||
|
[sendcmpct message]: /en/developer-reference#sendcmpct "A P2P network message used to request new blocks be announced as compact blocks"
|
||||||
[sendheaders message]: /en/developer-reference#sendheaders "A P2P network message used to request new blocks be announced through headers messages rather than inv messages"
|
[sendheaders message]: /en/developer-reference#sendheaders "A P2P network message used to request new blocks be announced through headers messages rather than inv messages"
|
||||||
[spork message]: /en/developer-reference#spork "A P2P network message used to send the activation status of a spork"
|
[spork message]: /en/developer-reference#spork "A P2P network message used to send the activation status of a spork"
|
||||||
[ssc message]: /en/developer-reference#ssc "A P2P network message used to track the sync status of masternode objects ()"
|
[ssc message]: /en/developer-reference#ssc "A P2P network message used to track the sync status of masternode objects ()"
|
||||||
|
|
|
@ -22,6 +22,8 @@ sendheaders;
|
||||||
ERROR [ style = "invis" ];
|
ERROR [ style = "invis" ];
|
||||||
ERROR -> reject [ style = "invis" ];
|
ERROR -> reject [ style = "invis" ];
|
||||||
|
|
||||||
|
sendcmpct;
|
||||||
|
|
||||||
label = " \nOverview Of P2P Protocol Control And Advisory Messages"
|
label = " \nOverview Of P2P Protocol Control And Advisory Messages"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 8.3 KiB |
|
@ -4,94 +4,99 @@
|
||||||
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
|
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
|
||||||
-->
|
-->
|
||||||
<!-- Title: %3 Pages: 1 -->
|
<!-- Title: %3 Pages: 1 -->
|
||||||
<svg width="450pt" height="97pt"
|
<svg width="450pt" height="86pt"
|
||||||
viewBox="0.00 0.00 450.00 96.70" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
viewBox="0.00 0.00 450.00 86.07" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<g id="graph0" class="graph" transform="scale(0.690714 0.690714) rotate(0) translate(4 136)">
|
<g id="graph0" class="graph" transform="scale(0.614754 0.614754) rotate(0) translate(4 136)">
|
||||||
<title>%3</title>
|
<title>%3</title>
|
||||||
<polygon fill="white" stroke="none" points="-4,4 -4,-136 647.5,-136 647.5,4 -4,4"/>
|
<polygon fill="white" stroke="none" points="-4,4 -4,-136 728,-136 728,4 -4,4"/>
|
||||||
<text text-anchor="middle" x="321.75" y="-22.8" font-family="Sans" font-size="14.00"> </text>
|
<text text-anchor="middle" x="362" y="-22.8" font-family="Sans" font-size="14.00"> </text>
|
||||||
<text text-anchor="middle" x="321.75" y="-7.8" font-family="Sans" font-size="14.00">Overview Of P2P Protocol Control And Advisory Messages</text>
|
<text text-anchor="middle" x="362" y="-7.8" font-family="Sans" font-size="14.00">Overview Of P2P Protocol Control And Advisory Messages</text>
|
||||||
<!-- version -->
|
<!-- version -->
|
||||||
<g id="node1" class="node"><title>version</title>
|
<g id="node1" class="node"><title>version</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="71,-132 0,-132 0,-96 71,-96 71,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="67,-132 0,-132 0,-96 67,-96 67,-132"/>
|
||||||
<text text-anchor="middle" x="35.5" y="-110.3" font-family="Sans" font-size="14.00">version</text>
|
<text text-anchor="middle" x="33.5" y="-110.3" font-family="Sans" font-size="14.00">version</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- verack -->
|
<!-- verack -->
|
||||||
<g id="node2" class="node"><title>verack</title>
|
<g id="node2" class="node"><title>verack</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="68,-74 3,-74 3,-38 68,-38 68,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="64.5,-74 2.5,-74 2.5,-38 64.5,-38 64.5,-74"/>
|
||||||
<text text-anchor="middle" x="35.5" y="-52.3" font-family="Sans" font-size="14.00">verack</text>
|
<text text-anchor="middle" x="33.5" y="-52.3" font-family="Sans" font-size="14.00">verack</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- version->verack -->
|
<!-- version->verack -->
|
||||||
<g id="edge1" class="edge"><title>version->verack</title>
|
<g id="edge1" class="edge"><title>version->verack</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M35.5,-95.8939C35.5,-88.9462 35.5,-80.9383 35.5,-74.0014"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M33.5,-95.8939C33.5,-88.9462 33.5,-80.9383 33.5,-74.0014"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- ping -->
|
<!-- ping -->
|
||||||
<g id="node3" class="node"><title>ping</title>
|
<g id="node3" class="node"><title>ping</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="139.5,-132 85.5,-132 85.5,-96 139.5,-96 139.5,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="135.5,-132 81.5,-132 81.5,-96 135.5,-96 135.5,-132"/>
|
||||||
<text text-anchor="middle" x="112.5" y="-110.3" font-family="Sans" font-size="14.00">ping</text>
|
<text text-anchor="middle" x="108.5" y="-110.3" font-family="Sans" font-size="14.00">ping</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- pong -->
|
<!-- pong -->
|
||||||
<g id="node4" class="node"><title>pong</title>
|
<g id="node4" class="node"><title>pong</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="139.5,-74 85.5,-74 85.5,-38 139.5,-38 139.5,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="135.5,-74 81.5,-74 81.5,-38 135.5,-38 135.5,-74"/>
|
||||||
<text text-anchor="middle" x="112.5" y="-52.3" font-family="Sans" font-size="14.00">pong</text>
|
<text text-anchor="middle" x="108.5" y="-52.3" font-family="Sans" font-size="14.00">pong</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- ping->pong -->
|
<!-- ping->pong -->
|
||||||
<g id="edge2" class="edge"><title>ping->pong</title>
|
<g id="edge2" class="edge"><title>ping->pong</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M112.5,-95.8939C112.5,-88.9462 112.5,-80.9383 112.5,-74.0014"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M108.5,-95.8939C108.5,-88.9462 108.5,-80.9383 108.5,-74.0014"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- getaddr -->
|
<!-- getaddr -->
|
||||||
<g id="node5" class="node"><title>getaddr</title>
|
<g id="node5" class="node"><title>getaddr</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="227.5,-132 153.5,-132 153.5,-96 227.5,-96 227.5,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="219.5,-132 149.5,-132 149.5,-96 219.5,-96 219.5,-132"/>
|
||||||
<text text-anchor="middle" x="190.5" y="-110.3" font-family="Sans" font-size="14.00">getaddr</text>
|
<text text-anchor="middle" x="184.5" y="-110.3" font-family="Sans" font-size="14.00">getaddr</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- addr -->
|
<!-- addr -->
|
||||||
<g id="node6" class="node"><title>addr</title>
|
<g id="node6" class="node"><title>addr</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="217.5,-74 163.5,-74 163.5,-38 217.5,-38 217.5,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="211.5,-74 157.5,-74 157.5,-38 211.5,-38 211.5,-74"/>
|
||||||
<text text-anchor="middle" x="190.5" y="-52.3" font-family="Sans" font-size="14.00">addr</text>
|
<text text-anchor="middle" x="184.5" y="-52.3" font-family="Sans" font-size="14.00">addr</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getaddr->addr -->
|
<!-- getaddr->addr -->
|
||||||
<g id="edge3" class="edge"><title>getaddr->addr</title>
|
<g id="edge3" class="edge"><title>getaddr->addr</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M190.5,-95.8939C190.5,-88.9462 190.5,-80.9383 190.5,-74.0014"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M184.5,-95.8939C184.5,-88.9462 184.5,-80.9383 184.5,-74.0014"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- filterload -->
|
<!-- filterload -->
|
||||||
<g id="node7" class="node"><title>filterload</title>
|
<g id="node7" class="node"><title>filterload</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="371,-132 288,-132 288,-96 371,-96 371,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="354,-132 277,-132 277,-96 354,-96 354,-132"/>
|
||||||
<text text-anchor="middle" x="329.5" y="-110.3" font-family="Sans" font-size="14.00">filterload</text>
|
<text text-anchor="middle" x="315.5" y="-110.3" font-family="Sans" font-size="14.00">filterload</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- filteradd -->
|
<!-- filteradd -->
|
||||||
<g id="node8" class="node"><title>filteradd</title>
|
<g id="node8" class="node"><title>filteradd</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="317,-74 238,-74 238,-38 317,-38 317,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="304.5,-74 230.5,-74 230.5,-38 304.5,-38 304.5,-74"/>
|
||||||
<text text-anchor="middle" x="277.5" y="-52.3" font-family="Sans" font-size="14.00">filteradd</text>
|
<text text-anchor="middle" x="267.5" y="-52.3" font-family="Sans" font-size="14.00">filteradd</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- filterload->filteradd -->
|
<!-- filterload->filteradd -->
|
||||||
<g id="edge4" class="edge"><title>filterload->filteradd</title>
|
<g id="edge4" class="edge"><title>filterload->filteradd</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M313.616,-95.8939C307.164,-88.9462 299.728,-80.9383 293.287,-74.0014"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M300.838,-95.8939C294.882,-88.9462 288.019,-80.9383 282.073,-74.0014"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- filterclear -->
|
<!-- filterclear -->
|
||||||
<g id="node9" class="node"><title>filterclear</title>
|
<g id="node9" class="node"><title>filterclear</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="420,-74 331,-74 331,-38 420,-38 420,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="400.5,-74 318.5,-74 318.5,-38 400.5,-38 400.5,-74"/>
|
||||||
<text text-anchor="middle" x="375.5" y="-52.3" font-family="Sans" font-size="14.00">filterclear</text>
|
<text text-anchor="middle" x="359.5" y="-52.3" font-family="Sans" font-size="14.00">filterclear</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- filterload->filterclear -->
|
<!-- filterload->filterclear -->
|
||||||
<g id="edge5" class="edge"><title>filterload->filterclear</title>
|
<g id="edge5" class="edge"><title>filterload->filterclear</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M343.551,-95.8939C349.258,-88.9462 355.836,-80.9383 361.535,-74.0014"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M328.941,-95.8939C334.399,-88.9462 340.691,-80.9383 346.142,-74.0014"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- alert -->
|
<!-- alert -->
|
||||||
<g id="node10" class="node"><title>alert</title>
|
<g id="node10" class="node"><title>alert</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="439.5,-132 385.5,-132 385.5,-96 439.5,-96 439.5,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="422.5,-132 368.5,-132 368.5,-96 422.5,-96 422.5,-132"/>
|
||||||
<text text-anchor="middle" x="412.5" y="-110.3" font-family="Sans" font-size="14.00">alert</text>
|
<text text-anchor="middle" x="395.5" y="-110.3" font-family="Sans" font-size="14.00">alert</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- sendheaders -->
|
<!-- sendheaders -->
|
||||||
<g id="node11" class="node"><title>sendheaders</title>
|
<g id="node11" class="node"><title>sendheaders</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="563.5,-132 453.5,-132 453.5,-96 563.5,-96 563.5,-132"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="540.5,-132 436.5,-132 436.5,-96 540.5,-96 540.5,-132"/>
|
||||||
<text text-anchor="middle" x="508.5" y="-110.3" font-family="Sans" font-size="14.00">sendheaders</text>
|
<text text-anchor="middle" x="488.5" y="-110.3" font-family="Sans" font-size="14.00">sendheaders</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- ERROR -->
|
<!-- ERROR -->
|
||||||
<!-- reject -->
|
<!-- reject -->
|
||||||
<g id="node13" class="node"><title>reject</title>
|
<g id="node13" class="node"><title>reject</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="640,-74 581,-74 581,-38 640,-38 640,-74"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="615.5,-74 559.5,-74 559.5,-38 615.5,-38 615.5,-74"/>
|
||||||
<text text-anchor="middle" x="610.5" y="-52.3" font-family="Sans" font-size="14.00">reject</text>
|
<text text-anchor="middle" x="587.5" y="-52.3" font-family="Sans" font-size="14.00">reject</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- ERROR->reject -->
|
<!-- ERROR->reject -->
|
||||||
|
<!-- sendcmpct -->
|
||||||
|
<g id="node14" class="node"><title>sendcmpct</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="724,-132 635,-132 635,-96 724,-96 724,-132"/>
|
||||||
|
<text text-anchor="middle" x="679.5" y="-110.3" font-family="Sans" font-size="14.00">sendcmpct</text>
|
||||||
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.6 KiB |
|
@ -10,6 +10,8 @@ edge [ penwidth = 1.75, fontname="Sans", dir="none" ]
|
||||||
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
graph [ penwidth = 1.75, fontname="Sans" ]
|
graph [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
|
||||||
|
getblocktxn -> blocktxn [ minlen = 3 ];
|
||||||
|
|
||||||
getblocks -> inv;
|
getblocks -> inv;
|
||||||
mempool -> inv;
|
mempool -> inv;
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 24 KiB |
|
@ -1,117 +1,131 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
|
||||||
-->
|
-->
|
||||||
<!-- Title: _anonymous_0 Pages: 1 -->
|
<!-- Title: %3 Pages: 1 -->
|
||||||
<svg width="450pt" height="208pt"
|
<svg width="450pt" height="234pt"
|
||||||
viewBox="0.00 0.00 450.00 207.63" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
viewBox="0.00 0.00 450.00 234.49" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<g id="graph1" class="graph" transform="scale(0.755034 0.755034) rotate(0) translate(4 271)">
|
<g id="graph0" class="graph" transform="scale(0.758853 0.758853) rotate(0) translate(4 305)">
|
||||||
<title>_anonymous_0</title>
|
<title>%3</title>
|
||||||
<polygon fill="white" stroke="white" points="-4,5 -4,-271 593,-271 593,5 -4,5"/>
|
<polygon fill="white" stroke="none" points="-4,4 -4,-305 589,-305 589,4 -4,4"/>
|
||||||
<text text-anchor="middle" x="294" y="-8.4" font-family="Sans" font-size="14.00">Overview Of P2P Protocol Data Request And Reply Messages</text>
|
<text text-anchor="middle" x="292.5" y="-7.8" font-family="Sans" font-size="14.00">Overview Of P2P Protocol Data Request And Reply Messages</text>
|
||||||
|
<!-- getblocktxn -->
|
||||||
|
<g id="node1" class="node"><title>getblocktxn</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="124,-59 26,-59 26,-23 124,-23 124,-59"/>
|
||||||
|
<text text-anchor="middle" x="75" y="-37.3" font-family="Sans" font-size="14.00">getblocktxn</text>
|
||||||
|
</g>
|
||||||
|
<!-- blocktxn -->
|
||||||
|
<g id="node2" class="node"><title>blocktxn</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="559,-59 484,-59 484,-23 559,-23 559,-59"/>
|
||||||
|
<text text-anchor="middle" x="521.5" y="-37.3" font-family="Sans" font-size="14.00">blocktxn</text>
|
||||||
|
</g>
|
||||||
|
<!-- getblocktxn->blocktxn -->
|
||||||
|
<g id="edge1" class="edge"><title>getblocktxn->blocktxn</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M124.061,-41C213.997,-41 403.414,-41 483.967,-41"/>
|
||||||
|
</g>
|
||||||
<!-- getblocks -->
|
<!-- getblocks -->
|
||||||
<g id="node1" class="node"><title>getblocks</title>
|
<g id="node3" class="node"><title>getblocks</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="116,-141 36,-141 36,-105 116,-105 116,-141"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="115.5,-179 34.5,-179 34.5,-143 115.5,-143 115.5,-179"/>
|
||||||
<text text-anchor="middle" x="76" y="-118.9" font-family="Sans" font-size="14.00">getblocks</text>
|
<text text-anchor="middle" x="75" y="-157.3" font-family="Sans" font-size="14.00">getblocks</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- inv -->
|
<!-- inv -->
|
||||||
<g id="node3" class="node"><title>inv</title>
|
<g id="node4" class="node"><title>inv</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="233,-121 179,-121 179,-85 233,-85 233,-121"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="231,-159 177,-159 177,-123 231,-123 231,-159"/>
|
||||||
<text text-anchor="middle" x="206" y="-98.9" font-family="Sans" font-size="14.00">inv</text>
|
<text text-anchor="middle" x="204" y="-137.3" font-family="Sans" font-size="14.00">inv</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getblocks->inv -->
|
<!-- getblocks->inv -->
|
||||||
<g id="edge2" class="edge"><title>getblocks->inv</title>
|
<g id="edge2" class="edge"><title>getblocks->inv</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M116.776,-116.727C137.03,-113.611 160.945,-109.931 178.916,-107.167"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M115.835,-154.727C135.767,-151.588 159.329,-147.877 176.927,-145.106"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- getdata -->
|
<!-- getdata -->
|
||||||
<g id="node7" class="node"><title>getdata</title>
|
<g id="node6" class="node"><title>getdata</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="391,-121 321,-121 321,-85 391,-85 391,-121"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="389,-159 319,-159 319,-123 389,-123 389,-159"/>
|
||||||
<text text-anchor="middle" x="356" y="-98.9" font-family="Sans" font-size="14.00">getdata</text>
|
<text text-anchor="middle" x="354" y="-137.3" font-family="Sans" font-size="14.00">getdata</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- inv->getdata -->
|
<!-- inv->getdata -->
|
||||||
<g id="edge6" class="edge"><title>inv->getdata</title>
|
<g id="edge4" class="edge"><title>inv->getdata</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M233.164,-103C257.732,-103 294.053,-103 320.831,-103"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M231.119,-141C255.516,-141 292.082,-141 318.797,-141"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- mempool -->
|
<!-- mempool -->
|
||||||
<g id="node4" class="node"><title>mempool</title>
|
<g id="node5" class="node"><title>mempool</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="115,-101 37,-101 37,-65 115,-65 115,-101"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="114.5,-139 35.5,-139 35.5,-103 114.5,-103 114.5,-139"/>
|
||||||
<text text-anchor="middle" x="76" y="-78.9" font-family="Sans" font-size="14.00">mempool</text>
|
<text text-anchor="middle" x="75" y="-117.3" font-family="Sans" font-size="14.00">mempool</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- mempool->inv -->
|
<!-- mempool->inv -->
|
||||||
<g id="edge4" class="edge"><title>mempool->inv</title>
|
<g id="edge3" class="edge"><title>mempool->inv</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M115.711,-89.1093C136.17,-92.2569 160.59,-96.0138 178.871,-98.8264"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M114.794,-127.109C134.927,-130.28 158.986,-134.069 176.888,-136.888"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- tx -->
|
<!-- tx -->
|
||||||
<g id="node9" class="node"><title>tx</title>
|
<g id="node7" class="node"><title>tx</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="551,-181 497,-181 497,-145 551,-145 551,-181"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="548.5,-219 494.5,-219 494.5,-183 548.5,-183 548.5,-219"/>
|
||||||
<text text-anchor="middle" x="524" y="-158.9" font-family="Sans" font-size="14.00">tx</text>
|
<text text-anchor="middle" x="521.5" y="-197.3" font-family="Sans" font-size="14.00">tx</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getdata->tx -->
|
<!-- getdata->tx -->
|
||||||
<g id="edge8" class="edge"><title>getdata->tx</title>
|
<g id="edge5" class="edge"><title>getdata->tx</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-115.578C422.681,-126.815 468.117,-143.042 496.844,-153.301"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M389.292,-153.432C420.536,-164.759 466.011,-181.246 494.393,-191.535"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- block -->
|
<!-- block -->
|
||||||
<g id="node11" class="node"><title>block</title>
|
<g id="node8" class="node"><title>block</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="551,-141 497,-141 497,-105 551,-105 551,-141"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="548.5,-179 494.5,-179 494.5,-143 548.5,-143 548.5,-179"/>
|
||||||
<text text-anchor="middle" x="524" y="-118.9" font-family="Sans" font-size="14.00">block</text>
|
<text text-anchor="middle" x="521.5" y="-157.3" font-family="Sans" font-size="14.00">block</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getdata->block -->
|
<!-- getdata->block -->
|
||||||
<g id="edge10" class="edge"><title>getdata->block</title>
|
<g id="edge6" class="edge"><title>getdata->block</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-107.193C422.681,-110.938 468.117,-116.347 496.844,-119.767"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M389.292,-145.144C420.536,-148.92 466.011,-154.415 494.393,-157.845"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- merkleblock -->
|
<!-- merkleblock -->
|
||||||
<g id="node13" class="node"><title>merkleblock</title>
|
<g id="node9" class="node"><title>merkleblock</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="573,-101 475,-101 475,-65 573,-65 573,-101"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="571,-139 472,-139 472,-103 571,-103 571,-139"/>
|
||||||
<text text-anchor="middle" x="524" y="-78.9" font-family="Sans" font-size="14.00">merkleblock</text>
|
<text text-anchor="middle" x="521.5" y="-117.3" font-family="Sans" font-size="14.00">merkleblock</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getdata->merkleblock -->
|
<!-- getdata->merkleblock -->
|
||||||
<g id="edge12" class="edge"><title>getdata->merkleblock</title>
|
<g id="edge7" class="edge"><title>getdata->merkleblock</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-98.8073C415.369,-95.9323 447.752,-92.0772 474.492,-88.8939"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M389.292,-136.856C413.151,-133.973 445.309,-130.087 471.816,-126.883"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- notfound -->
|
<!-- notfound -->
|
||||||
<g id="node15" class="node"><title>notfound</title>
|
<g id="node10" class="node"><title>notfound</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="563,-61 485,-61 485,-25 563,-25 563,-61"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="561,-99 482,-99 482,-63 561,-63 561,-99"/>
|
||||||
<text text-anchor="middle" x="524" y="-38.9" font-family="Sans" font-size="14.00">notfound</text>
|
<text text-anchor="middle" x="521.5" y="-77.3" font-family="Sans" font-size="14.00">notfound</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getdata->notfound -->
|
<!-- getdata->notfound -->
|
||||||
<g id="edge14" class="edge"><title>getdata->notfound</title>
|
<g id="edge8" class="edge"><title>getdata->notfound</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-90.422C418.448,-80.6973 456.143,-67.2348 484.415,-57.1376"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M389.292,-128.568C416.275,-118.785 453.873,-105.155 481.908,-94.991"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- getheaders -->
|
<!-- getheaders -->
|
||||||
<g id="node16" class="node"><title>getheaders</title>
|
<g id="node11" class="node"><title>getheaders</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="123,-221 29,-221 29,-185 123,-185 123,-221"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="122,-259 28,-259 28,-223 122,-223 122,-259"/>
|
||||||
<text text-anchor="middle" x="76" y="-198.9" font-family="Sans" font-size="14.00">getheaders</text>
|
<text text-anchor="middle" x="75" y="-237.3" font-family="Sans" font-size="14.00">getheaders</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- headers -->
|
<!-- headers -->
|
||||||
<g id="node18" class="node"><title>headers</title>
|
<g id="node12" class="node"><title>headers</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="559,-221 489,-221 489,-185 559,-185 559,-221"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="557,-259 486,-259 486,-223 557,-223 557,-259"/>
|
||||||
<text text-anchor="middle" x="524" y="-198.9" font-family="Sans" font-size="14.00">headers</text>
|
<text text-anchor="middle" x="521.5" y="-237.3" font-family="Sans" font-size="14.00">headers</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- getheaders->headers -->
|
<!-- getheaders->headers -->
|
||||||
<g id="edge16" class="edge"><title>getheaders->headers</title>
|
<g id="edge9" class="edge"><title>getheaders->headers</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M123.097,-203C213.183,-203 408.074,-203 488.344,-203"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M122.361,-241C212.248,-241 405.736,-241 485.746,-241"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- label1 -->
|
<!-- label1 -->
|
||||||
<g id="node20" class="node"><title>label1</title>
|
<g id="node13" class="node"><title>label1</title>
|
||||||
<text text-anchor="middle" x="76" y="-250.4" font-family="Sans" font-size="14.00">Request For Help</text>
|
<text text-anchor="middle" x="75" y="-285.8" font-family="Sans" font-size="14.00">Request For Help</text>
|
||||||
<text text-anchor="middle" x="76" y="-233.4" font-family="Sans" font-size="14.00">Getting Up To Date</text>
|
<text text-anchor="middle" x="75" y="-270.8" font-family="Sans" font-size="14.00">Getting Up To Date</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- label2 -->
|
<!-- label2 -->
|
||||||
<g id="node21" class="node"><title>label2</title>
|
<g id="node14" class="node"><title>label2</title>
|
||||||
<text text-anchor="middle" x="206" y="-250.4" font-family="Sans" font-size="14.00">Reply With</text>
|
<text text-anchor="middle" x="204" y="-285.8" font-family="Sans" font-size="14.00">Reply With</text>
|
||||||
<text text-anchor="middle" x="206" y="-233.4" font-family="Sans" font-size="14.00">Inventory</text>
|
<text text-anchor="middle" x="204" y="-270.8" font-family="Sans" font-size="14.00">Inventory</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- label1->label2 -->
|
<!-- label1->label2 -->
|
||||||
<!-- label3 -->
|
<!-- label3 -->
|
||||||
<g id="node22" class="node"><title>label3</title>
|
<g id="node15" class="node"><title>label3</title>
|
||||||
<text text-anchor="middle" x="356" y="-241.9" font-family="Sans" font-size="14.00">Request For Specific Data</text>
|
<text text-anchor="middle" x="354" y="-278.3" font-family="Sans" font-size="14.00">Request For Specific Data</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- label2->label3 -->
|
<!-- label2->label3 -->
|
||||||
<!-- label4 -->
|
<!-- label4 -->
|
||||||
<g id="node23" class="node"><title>label4</title>
|
<g id="node16" class="node"><title>label4</title>
|
||||||
<text text-anchor="middle" x="524" y="-250.4" font-family="Sans" font-size="14.00">Reply With</text>
|
<text text-anchor="middle" x="521.5" y="-285.8" font-family="Sans" font-size="14.00">Reply With</text>
|
||||||
<text text-anchor="middle" x="524" y="-233.4" font-family="Sans" font-size="14.00">Requested Data</text>
|
<text text-anchor="middle" x="521.5" y="-270.8" font-family="Sans" font-size="14.00">Requested Data</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- label3->label4 -->
|
<!-- label3->label4 -->
|
||||||
</g>
|
</g>
|
||||||
|
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 7.1 KiB |