[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
This commit is contained in:
thephez 2018-04-24 10:53:32 -04:00 committed by GitHub
parent 7b8e5ed5ea
commit 2304a52d4f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 391 additions and 102 deletions

View file

@ -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

View file

@ -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 %}

View file

@ -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 ()"

View file

@ -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"
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Before After
Before After

View file

@ -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&#45;&gt;verack --> <!-- version&#45;&gt;verack -->
<g id="edge1" class="edge"><title>version&#45;&gt;verack</title> <g id="edge1" class="edge"><title>version&#45;&gt;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&#45;&gt;pong --> <!-- ping&#45;&gt;pong -->
<g id="edge2" class="edge"><title>ping&#45;&gt;pong</title> <g id="edge2" class="edge"><title>ping&#45;&gt;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&#45;&gt;addr --> <!-- getaddr&#45;&gt;addr -->
<g id="edge3" class="edge"><title>getaddr&#45;&gt;addr</title> <g id="edge3" class="edge"><title>getaddr&#45;&gt;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&#45;&gt;filteradd --> <!-- filterload&#45;&gt;filteradd -->
<g id="edge4" class="edge"><title>filterload&#45;&gt;filteradd</title> <g id="edge4" class="edge"><title>filterload&#45;&gt;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&#45;&gt;filterclear --> <!-- filterload&#45;&gt;filterclear -->
<g id="edge5" class="edge"><title>filterload&#45;&gt;filterclear</title> <g id="edge5" class="edge"><title>filterload&#45;&gt;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&#45;&gt;reject --> <!-- ERROR&#45;&gt;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

Before After
Before After

View file

@ -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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

View file

@ -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&#45;&gt;blocktxn -->
<g id="edge1" class="edge"><title>getblocktxn&#45;&gt;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&#45;&gt;inv --> <!-- getblocks&#45;&gt;inv -->
<g id="edge2" class="edge"><title>getblocks&#45;&gt;inv</title> <g id="edge2" class="edge"><title>getblocks&#45;&gt;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&#45;&gt;getdata --> <!-- inv&#45;&gt;getdata -->
<g id="edge6" class="edge"><title>inv&#45;&gt;getdata</title> <g id="edge4" class="edge"><title>inv&#45;&gt;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&#45;&gt;inv --> <!-- mempool&#45;&gt;inv -->
<g id="edge4" class="edge"><title>mempool&#45;&gt;inv</title> <g id="edge3" class="edge"><title>mempool&#45;&gt;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&#45;&gt;tx --> <!-- getdata&#45;&gt;tx -->
<g id="edge8" class="edge"><title>getdata&#45;&gt;tx</title> <g id="edge5" class="edge"><title>getdata&#45;&gt;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&#45;&gt;block --> <!-- getdata&#45;&gt;block -->
<g id="edge10" class="edge"><title>getdata&#45;&gt;block</title> <g id="edge6" class="edge"><title>getdata&#45;&gt;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&#45;&gt;merkleblock --> <!-- getdata&#45;&gt;merkleblock -->
<g id="edge12" class="edge"><title>getdata&#45;&gt;merkleblock</title> <g id="edge7" class="edge"><title>getdata&#45;&gt;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&#45;&gt;notfound --> <!-- getdata&#45;&gt;notfound -->
<g id="edge14" class="edge"><title>getdata&#45;&gt;notfound</title> <g id="edge8" class="edge"><title>getdata&#45;&gt;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&#45;&gt;headers --> <!-- getheaders&#45;&gt;headers -->
<g id="edge16" class="edge"><title>getheaders&#45;&gt;headers</title> <g id="edge9" class="edge"><title>getheaders&#45;&gt;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&#45;&gt;label2 --> <!-- label1&#45;&gt;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&#45;&gt;label3 --> <!-- label2&#45;&gt;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&#45;&gt;label4 --> <!-- label3&#45;&gt;label4 -->
</g> </g>

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Before After
Before After