Merge branch 'data-messages' (pull #642)
|
@ -25,6 +25,7 @@ block chain:
|
||||||
block-chain: block chain
|
block-chain: block chain
|
||||||
block header:
|
block header:
|
||||||
block height:
|
block height:
|
||||||
|
'`block` message': block message
|
||||||
block reward:
|
block reward:
|
||||||
block time:
|
block time:
|
||||||
block version:
|
block version:
|
||||||
|
@ -80,11 +81,15 @@ extended public key:
|
||||||
fiat:
|
fiat:
|
||||||
fork:
|
fork:
|
||||||
forks: fork
|
forks: fork
|
||||||
|
'`getblocks` message': getblocks message
|
||||||
|
'`getdata` message': getdata message
|
||||||
|
'`getheaders` message': getheaders message
|
||||||
genesis block:
|
genesis block:
|
||||||
hard fork:
|
hard fork:
|
||||||
hard forks: hard fork
|
hard forks: hard fork
|
||||||
hardened extended private key:
|
hardened extended private key:
|
||||||
HD protocol:
|
HD protocol:
|
||||||
|
'`headers` message': headers message
|
||||||
high-priority transaction: high-priority transactions
|
high-priority transaction: high-priority transactions
|
||||||
high-priority transactions:
|
high-priority transactions:
|
||||||
inputs: input
|
inputs: input
|
||||||
|
@ -92,8 +97,11 @@ input:
|
||||||
intermediate certificate:
|
intermediate certificate:
|
||||||
intermediate certificates: intermediate certificate
|
intermediate certificates: intermediate certificate
|
||||||
internal byte order:
|
internal byte order:
|
||||||
|
'`inv` message': inv message
|
||||||
IP address: DO NOT AUTOCROSSREF
|
IP address: DO NOT AUTOCROSSREF
|
||||||
IP addresses: DO NOT AUTOCROSSREF
|
IP addresses: DO NOT AUTOCROSSREF
|
||||||
|
inventories: inventory
|
||||||
|
inventory:
|
||||||
key index:
|
key index:
|
||||||
key pair:
|
key pair:
|
||||||
'`label`': label
|
'`label`': label
|
||||||
|
@ -106,8 +114,13 @@ man-in-the-middle:
|
||||||
master chain code:
|
master chain code:
|
||||||
master private key:
|
master private key:
|
||||||
'`memo`': pp memo
|
'`memo`': pp memo
|
||||||
|
'`mempool` message': mempool message
|
||||||
'`message`': message
|
'`message`': message
|
||||||
|
message header:
|
||||||
|
message payload:
|
||||||
'`merchant_data`': pp merchant data
|
'`merchant_data`': pp merchant data
|
||||||
|
merkleblock: merkleblock message
|
||||||
|
'`merkleblock` message': merkleblock message
|
||||||
merkle root:
|
merkle root:
|
||||||
merkle tree:
|
merkle tree:
|
||||||
merge:
|
merge:
|
||||||
|
@ -121,9 +134,13 @@ minimum fee:
|
||||||
mining: mine
|
mining: mine
|
||||||
millibitcoin: millibitcoins
|
millibitcoin: millibitcoins
|
||||||
millibitcoins:
|
millibitcoins:
|
||||||
|
'`MSG_BLOCK`': msg_block
|
||||||
|
'`MSG_FILTERED_BLOCK`': msg_filtered_block
|
||||||
|
'`MSG_TX`': msg_tx
|
||||||
multisig:
|
multisig:
|
||||||
nbits:
|
nbits:
|
||||||
network:
|
network:
|
||||||
|
'`notfound` message': notfound message
|
||||||
null data:
|
null data:
|
||||||
'`op_checkmultisig`': op_checkmultisig
|
'`op_checkmultisig`': op_checkmultisig
|
||||||
'`op_checksig`': op_checksig
|
'`op_checksig`': op_checksig
|
||||||
|
@ -153,6 +170,7 @@ PaymentRequest:
|
||||||
PaymentRequests: paymentrequest
|
PaymentRequests: paymentrequest
|
||||||
peer:
|
peer:
|
||||||
peers: peer
|
peers: peer
|
||||||
|
peer-to-peer: network
|
||||||
peer-to-peer network: network
|
peer-to-peer network: network
|
||||||
pki:
|
pki:
|
||||||
'`pki_type`': pp pki type
|
'`pki_type`': pp pki type
|
||||||
|
@ -163,6 +181,11 @@ proof of work:
|
||||||
proof-of-work: proof of work
|
proof-of-work: proof of work
|
||||||
protocol buffer: protobuf
|
protocol buffer: protobuf
|
||||||
protocol buffers: protobuf
|
protocol buffers: protobuf
|
||||||
|
protocol version 60000: section protocol versions
|
||||||
|
protocol version 60001: section protocol versions
|
||||||
|
protocol version 60002: section protocol versions
|
||||||
|
protocol version 70001: section protocol versions
|
||||||
|
protocol version 70002: section protocol versions
|
||||||
pubkey: public key
|
pubkey: public key
|
||||||
pubkey hash:
|
pubkey hash:
|
||||||
pubkey hashes: pubkey hash
|
pubkey hashes: pubkey hash
|
||||||
|
@ -219,6 +242,7 @@ standard script:
|
||||||
standard scripts: standard script
|
standard scripts: standard script
|
||||||
standard transaction: standard script
|
standard transaction: standard script
|
||||||
standard transactions: standard script
|
standard transactions: standard script
|
||||||
|
start string:
|
||||||
target:
|
target:
|
||||||
testnet:
|
testnet:
|
||||||
#transaction -- Recommend we don't autocrossref this; it occurs too often
|
#transaction -- Recommend we don't autocrossref this; it occurs too often
|
||||||
|
@ -228,6 +252,7 @@ transaction malleability:
|
||||||
transaction object format:
|
transaction object format:
|
||||||
transaction version number:
|
transaction version number:
|
||||||
'`transactions`': pp transactions
|
'`transactions`': pp transactions
|
||||||
|
'`tx` message': tx message
|
||||||
txid:
|
txid:
|
||||||
txids: txid
|
txids: txid
|
||||||
unconfirmed:
|
unconfirmed:
|
||||||
|
@ -338,5 +363,10 @@ CVE-2012-2459:
|
||||||
'`walletpassphrase`': rpc walletpassphrase
|
'`walletpassphrase`': rpc walletpassphrase
|
||||||
'`walletpassphrasechange`': rpc walletpassphrasechange
|
'`walletpassphrasechange`': rpc walletpassphrasechange
|
||||||
|
|
||||||
Bitcoin Core 0.9.3:
|
## Versions of Bitcoin Core (linked to Bitcoin.org release notes)
|
||||||
|
Bitcoin Core 0.6.0:
|
||||||
|
Bitcoin Core 0.6.1:
|
||||||
Bitcoin Core 0.7.0:
|
Bitcoin Core 0.7.0:
|
||||||
|
Bitcoin Core 0.8.0:
|
||||||
|
Bitcoin Core 0.9.0:
|
||||||
|
Bitcoin Core 0.9.3:
|
||||||
|
|
212
_includes/example_p2p_networking.md
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
## P2P Network
|
||||||
|
|
||||||
|
### Retrieving A MerkleBlock
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
For the `merkleblock` message documentation on the reference page, an
|
||||||
|
actual merkleblock was retrieved from the network and manually
|
||||||
|
processed. This section walks through each step of the process,
|
||||||
|
demonstrating basic network communication and merkleblock processing.
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
from hashlib import sha256
|
||||||
|
import struct
|
||||||
|
import sys
|
||||||
|
|
||||||
|
network_string = "f9beb4d9".decode("hex") # Mainnet
|
||||||
|
|
||||||
|
def send(msg,payload):
|
||||||
|
## Command is ASCII text, null padded to 12 bytes
|
||||||
|
command = msg + ( ( 12 - len(msg) ) * "\00" )
|
||||||
|
|
||||||
|
## Payload length is a uint32_t
|
||||||
|
payload_raw = payload.decode("hex")
|
||||||
|
payload_len = struct.pack("I", len(payload_raw))
|
||||||
|
|
||||||
|
## Checksum is first 4 bytes of SHA256(SHA256(<payload>))
|
||||||
|
checksum = sha256(sha256(payload_raw).digest()).digest()[:4]
|
||||||
|
|
||||||
|
sys.stdout.write(
|
||||||
|
network_string
|
||||||
|
+ command
|
||||||
|
+ payload_len
|
||||||
|
+ checksum
|
||||||
|
+ payload_raw
|
||||||
|
)
|
||||||
|
sys.stdout.flush()
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
To connect to the P2P network, the trivial Python function above was
|
||||||
|
developed to compute message headers and send payloads decoded from hex.
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
## Create a version message
|
||||||
|
send("version",
|
||||||
|
"71110100" # ........................ Protocol Version: 70001
|
||||||
|
+ "0000000000000000" # ................ Services: Headers Only (SPV)
|
||||||
|
+ "c6925e5400000000" # ................ Time: 1415484102
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "0000ffff7f000001208d" # ............ Receiver IP Address/Port
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "0000ffff7f000001208d" # ............ Sender IP Address/Port
|
||||||
|
+ "0000000000000000" # ................ Nonce (not used here)
|
||||||
|
+ "1b" # .............................. Bytes in version string
|
||||||
|
+ "2f426974636f696e2e6f726720457861"
|
||||||
|
+ "6d706c653a302e392e332f" # .......... Version string
|
||||||
|
+ "93050500" # ........................ Starting block height: 329107
|
||||||
|
+ "00" # .............................. Relay transactions: false
|
||||||
|
)
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
Peers on the network will not accept any requests until you send them a
|
||||||
|
`version` message. The receiving node will reply with their `version`
|
||||||
|
message and a `verack` message.
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
sleep(1)
|
||||||
|
send("verack", "")
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
We're not going to validate their `version` message with this simple
|
||||||
|
script, but we will sleep a short bit and send back our own `verack`
|
||||||
|
message as if we had accepted their `version` message.
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
send("filterload", "02b50f0b0000000000000000")
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
We set a bloom filter with the `filterload` message. This filter was
|
||||||
|
quickly created using [python-bitcoinlib][]'s bloom module. <!-- TODO:
|
||||||
|
consider expanding this section once filterload has been documented. -->
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
send("getdata",
|
||||||
|
"01" # ................................. Number of inventories: 1
|
||||||
|
+ "03000000" # ........................... Inventory type: filtered block
|
||||||
|
+ "a4deb66c0d726b0aefb03ed51be407fb"
|
||||||
|
+ "ad7331c6e8f9eef231b7000000000000" # ... Block header hash
|
||||||
|
)
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
We request a merkleblock for transactions matching our filter,
|
||||||
|
completing our script.
|
||||||
|
|
||||||
|
To run the script, we simply pipe it to the Unix [`netcat`
|
||||||
|
command][netcat] or one of its many clones, one of which is available
|
||||||
|
for practically any platform. For example, with the original netcat and
|
||||||
|
using hexdump (`hd`) to display the output:
|
||||||
|
|
||||||
|
{% highlight bash %}
|
||||||
|
## Connect to the Bitcoin Core peer running on localhost
|
||||||
|
python get-merkle.py | nc localhost 8333 | hd
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
Part of the response is shown in the section below.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
### Parsing A MerkleBlock
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
In the section above, we retrieved a merkleblock from the network; now
|
||||||
|
we will parse it. Most of the block header has been omitted. For
|
||||||
|
a more complete hexdump, see the example in the [`merkleblock` message
|
||||||
|
section][merkleblock message].
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
7f16c5962e8bd963659c793ce370d95f
|
||||||
|
093bc7e367117b3c30c1f8fdd0d97287 ... Merkle root
|
||||||
|
|
||||||
|
07000000 ........................... Transaction count: 7
|
||||||
|
04 ................................. Hash count: 4
|
||||||
|
|
||||||
|
3612262624047ee87660be1a707519a4
|
||||||
|
43b1c1ce3d248cbfc6c15870f6c5daa2 ... Hash #1
|
||||||
|
019f5b01d4195ecbc9398fbf3c3b1fa9
|
||||||
|
bb3183301d7a1fb3bd174fcfa40a2b65 ... Hash #2
|
||||||
|
41ed70551dd7e841883ab8f0b16bf041
|
||||||
|
76b7d1480e4f0af9f3d4c3595768d068 ... Hash #3
|
||||||
|
20d2a7bc994987302e5b1ac80fc425fe
|
||||||
|
25f8b63169ea78e68fbaaefa59379bbf ... Hash #4
|
||||||
|
|
||||||
|
01 ................................. Flag bytes: 1
|
||||||
|
1d ................................. Flags: 1 0 1 1 1 0 0 0
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
We parse the above `merkleblock` message using the following
|
||||||
|
instructions. Each illustration is described in the paragraph below it.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
We start by building the structure of a merkle tree based on the number
|
||||||
|
of transactions in the block.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The first flag is a 1 and the merkle root is (as always) a non-TXID
|
||||||
|
node, so we will need to compute the hash later based on this node's
|
||||||
|
children. Accordingly, we descend into the merkle root's left child and
|
||||||
|
look at the next flag for instructions.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The next flag in the example is a 0 and this is also a non-TXID node, so
|
||||||
|
we apply the first hash from the `merkleblock` message to this node. We
|
||||||
|
also don't process any child nodes---according to the peer which created
|
||||||
|
the `merkleblock` message, none of those nodes will lead to TXIDs of
|
||||||
|
transactions that match our filter, so we don't need them. We go back up
|
||||||
|
to the merkle root and then descend into its right child and look at the
|
||||||
|
next (third) flag for instructions.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The third flag in the example is another 1 on another non-TXID node, so
|
||||||
|
we descend into its left child.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The fourth flag is also a 1 on another non-TXID node, so we descend
|
||||||
|
again---we will always continue descending until we reach a TXID node or
|
||||||
|
a non-TXID node with a 0 flag (or we finish filling out the tree).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Finally, on the fifth flag in the example (a 1), we reach a TXID node.
|
||||||
|
The 1 flag indicates this TXID's transaction matches our filter and
|
||||||
|
that we should take the next (second) hash and use it as this node's
|
||||||
|
TXID.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The sixth flag also applies to a TXID, but it's a 0 flag, so this
|
||||||
|
TXID's transaction doesn't match our filter; still, we take the next
|
||||||
|
(third) hash and use it as this node's TXID.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
We now have enough information to compute the hash for the fourth node
|
||||||
|
we encountered---it's the hash of the concatenated hashes of the two
|
||||||
|
TXIDs we filled out.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Moving to the right child of the third node we encountered, we fill it
|
||||||
|
out using the seventh flag and final hash---and discover there are no
|
||||||
|
more child nodes to process.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
We hash as appropriate to fill out the tree. Note that the eighth flag is
|
||||||
|
not used---this is acceptable as it was required to pad out a flag byte.
|
||||||
|
|
||||||
|
The final steps would be to ensure the computed computed merkle root
|
||||||
|
is identical to the merkle root in the header and check the other steps
|
||||||
|
of the parsing checklist in the `merkleblock` message section.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
564
_includes/ref_p2p_networking.md
Normal file
|
@ -0,0 +1,564 @@
|
||||||
|
## P2P Network
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
This section describes the Bitcoin P2P network protocol (but it is not a
|
||||||
|
specification). It does not describe the discontinued direct [IP-to-IP
|
||||||
|
payment protocol][], the [BIP70 payment protocol][payment protocol], the
|
||||||
|
[GetBlockTemplate mining protocol][section getblocktemplate], or any
|
||||||
|
network protocol never implemented in an official version of Bitcoin Core.
|
||||||
|
|
||||||
|
All peer-to-peer communication occurs entirely over TCP.
|
||||||
|
|
||||||
|
**Note:** unless their description says otherwise, all multi-byte
|
||||||
|
integers mentioned in this section are transmitted in little-endian order.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
### Constants And Defaults
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The following constants and defaults are taken from Bitcoin Core's
|
||||||
|
[chainparams.cpp][core chainparams.cpp] source code file.
|
||||||
|
|
||||||
|
| Network | Default Port | [Start String][]{:#term-start-string}{:.term} | Max nBits
|
||||||
|
|---------|--------------|-----------------------------------------------|---------------
|
||||||
|
| Mainnet | 8333 | 0xf9beb4d9 | 0x1d00ffff
|
||||||
|
| Testnet | 18333 | 0x0b110907 | 0x1d00ffff
|
||||||
|
| Regtest | 18444 | 0xfabfb5da | 0x207fffff
|
||||||
|
|
||||||
|
Note: the testnet start string and nBits above are for testnet3; the
|
||||||
|
original testnet used a different string and higher (less difficult)
|
||||||
|
nBits.
|
||||||
|
|
||||||
|
Command line parameters can change what port a node listens on (see
|
||||||
|
`-help`). Start strings are hardcoded constants that appear at the start
|
||||||
|
of all messages sent on the Bitcoin network; they may also appear in
|
||||||
|
data files such as Bitcoin Core's block database. The nBits displayed
|
||||||
|
above are in big-endian order; they're sent over the network in
|
||||||
|
little-endian order.
|
||||||
|
|
||||||
|
Bitcoin Core's [chainparams.cpp][core chainparams.cpp] also includes
|
||||||
|
other constants useful to programs, such as the hash of the genesis
|
||||||
|
blocks for the different networks as well as the alert keys for mainnet
|
||||||
|
and testnet.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
### Protocol Versions
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The table below lists some notable versions of the P2P network protocol,
|
||||||
|
with the most recent versions listed first. (If you would like to help
|
||||||
|
document older protocol versions, please [open an issue][docs issue].)
|
||||||
|
|
||||||
|
| Version | Implementation | Major Changes
|
||||||
|
|---------|------------------------------------|--------------
|
||||||
|
| 70002 | Bitcoin Core 0.9.0 <br>(Mar 2014) | • Send multiple `inv` messages in response to a `mempool` message if necessary <br><br>[BIP61][]: <br>• Added `reject` message
|
||||||
|
| 70001 | Bitcoin Core 0.8.0 <br>(Feb 2013) | [BIP37][]: <br>• Added `filterload` message. <br>• Added `filteradd` message. <br>• Added `filterclear` message. <br>• Added `merkleblock` message. <br>• Added relay field to `version` message <br>• Added `MSG_FILTERED_BLOCK` inventory type to `getdata` message.
|
||||||
|
| 60002 | Bitcoin Core 0.7.0 <br>(Sep 2012) | [BIP35][]: <br>• Added `mempool` message. <br>• Extended `getdata` message to allow download of memory pool transactions
|
||||||
|
| 60001 | Bitcoin Core 0.6.1 <br>(May 2012) | [BIP31][]: <br>• Added `pong` message
|
||||||
|
| 60000 | Bitcoin Core 0.6.0 <br>(Mar 2012) | [BIP14][]: <br>• Separated protocol version from Bitcoin Core version
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
### Message Headers
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
All messages in the network protocol use the same container format,
|
||||||
|
which provides a required multi-field header and an optional payload.
|
||||||
|
The header format is:
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|-------|--------------|-----------|-------------
|
||||||
|
| 4 | start string | char[4] | Magic bytes indicating the originating network; used to seek to next message when stream state is unknown.
|
||||||
|
| 12 | command name | char[12] | ASCII string which identifies what message type is contained in the payload. Followed by nulls (0x00) to pad out byte count; for example: `version\0\0\0\0\0`.
|
||||||
|
| 4 | payload size | uint32_t | Number of bytes in payload. The current maximum number of bytes ([`MAX_SIZE`][max_size]) allowed in the payload by Bitcoin Core is 32 MiB---messages with a payload size larger than this will be dropped or rejected.
|
||||||
|
| 4 | checksum | char[4] | First 4 bytes of SHA256(SHA256(payload)) in internal byte order.<br /><br /> If payload is empty, as in `verack` and `getaddr` messages, the checksum is always 0x5df6e0e2 (SHA256(SHA256(\<empty string>))).<br /><br /> *The checksum field was introduced in protocol version 209; Bitcoin Core 0.2.9, May 2010.*
|
||||||
|
|
||||||
|
The following example is an annotated hex dump of a mainnet message
|
||||||
|
header from a `verack` message which has no payload.
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
f9beb4d9 ................... Start string: Mainnet
|
||||||
|
76657261636b000000000000 ... Command name: verack + null padding
|
||||||
|
00000000 ................... Byte count: 0
|
||||||
|
5df6e0e2 ................... Checksum: SHA256(SHA256(<empty>))
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
### Data Messages
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The following network messages all request or provide data related to
|
||||||
|
transactions and blocks.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Many of the data messages use
|
||||||
|
[inventories][inventory]{:#term-inventory}{:.term} as unique identifiers
|
||||||
|
for transactions and blocks. Inventories have a simple 36-byte
|
||||||
|
structure:
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|-------|-----------------|-----------|-------------
|
||||||
|
| 4 | type identifier | uint32_t | The type of object which was hashed. See list of type identifiers below.
|
||||||
|
| 32 | hash | char[32] | SHA256(SHA256()) hash of the object in internal byte order.
|
||||||
|
|
||||||
|
The currently-available type identifiers are:
|
||||||
|
|
||||||
|
| Type Identifier | Name | Description
|
||||||
|
|-----------------|-------------------------------------------------------------------------------|---------------
|
||||||
|
| 1 | [`MSG_TX`][msg_tx]{:#term-msg_tx}{:.term} | The hash is a TXID.
|
||||||
|
| 2 | [`MSG_BLOCK`][msg_block]{:#term-msg_block}{:.term} | The hash is of a block header.
|
||||||
|
| 3 | [`MSG_FILTERED_BLOCK`][msg_filtered_block]{:#term-msg_filtered_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 `merkleblock` message rather than a `block` message (but this only works if a bloom filter was previously configured). **Only for use in `getdata` messages.**
|
||||||
|
|
||||||
|
Type identifier zero and type identifiers greater than three are reserved
|
||||||
|
for future implementations. Bitcoin Core ignores all inventories with
|
||||||
|
one of these unknown types.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### Block
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `block` message transmits a single serialized block in the format
|
||||||
|
described in the [serialized blocks section][section serialized blocks].
|
||||||
|
See that section for an example hexdump.
|
||||||
|
|
||||||
|
It is sent in reply to a `getdata` message which had an inventory type of
|
||||||
|
`MSG_BLOCK` and the header hash of the particular block being requested.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### GetBlocks
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `getblocks` message requests an `inv` message that provides block
|
||||||
|
header hashes starting from a particular point in the block chain. It
|
||||||
|
allows a peer which has been disconnected or started for the first time
|
||||||
|
to get the data it needs to request the blocks it hasn't seen.
|
||||||
|
|
||||||
|
Peers which have been disconnected may have stale blocks in their
|
||||||
|
locally-stored block chain, so the `getblocks` message allows the
|
||||||
|
requesting peer to provide the receiving peer with multiple header
|
||||||
|
hashes at various heights on their local chain. This allows the
|
||||||
|
receiving peer to find, within that list, the last header hash they had
|
||||||
|
in common and reply with all subsequent header hashes.
|
||||||
|
|
||||||
|
Note: the receiving peer itself may respond with an `inv` message
|
||||||
|
containing header hashes of stale blocks. It is up to the requesting
|
||||||
|
peer to poll all of its peers to find the best block chain.
|
||||||
|
|
||||||
|
If the receiving peer does not find a common header hash within the
|
||||||
|
list, it will assume the last common block was the genesis block (block
|
||||||
|
zero), so it will reply with in `inv` message containing header hashes
|
||||||
|
starting with block one (the first block after the genesis block).
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|----------|----------------------|------------------|----------------
|
||||||
|
| 4 | version | uint32_t | The protocol version number; the same as sent in the `version` message.
|
||||||
|
| *Varies* | hash count | compactSize uint | The number of header hashes provided not including the stop hash. There is no limit except that the byte size of the entire message must be below the [`MAX_SIZE`][max_size] limit; typically from 1 to 200 hashes are sent.
|
||||||
|
| *Varies* | block header hashes | char[32] | One or more block header hashes (32 bytes each) in internal byte order. Hashes should be provided in reverse order of block height, so highest-height hashes are listed first and lowest-height hashes are listed last.
|
||||||
|
| 32 | stop hash | char[32] | The header hash of the last header hash being requested; set to all zeroes to request an `inv` message with all subsequent header hashes (a maximum of 500 will be sent as a reply to this message; if you need more than 500, you will need to send another `getblocks` message with a higher-height header hash as the first entry in block header hash field).
|
||||||
|
|
||||||
|
The following annotated hexdump shows a `getblocks` message. (The
|
||||||
|
message header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
71110100 ........................... Protocol version: 70001
|
||||||
|
02 ................................. Hash count: 2
|
||||||
|
|
||||||
|
d39f608a7775b537729884d4e6633bb2
|
||||||
|
105e55a16a14d31b0000000000000000 ... Hash #1
|
||||||
|
|
||||||
|
5c3e6403d40837110a2e8afb602b1c01
|
||||||
|
714bda7ce23bea0a0000000000000000 ... Hash #2
|
||||||
|
|
||||||
|
00000000000000000000000000000000
|
||||||
|
00000000000000000000000000000000 ... Stop hash
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### GetData
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `getdata` message requests one or more data objects from another
|
||||||
|
node. The objects are requested by an inventory, which the requesting
|
||||||
|
node typically previously received by way of an `inv` message.
|
||||||
|
|
||||||
|
The response to a `getdata` message can be a `tx` message, `block`
|
||||||
|
message, `merkleblock` message, or `notfound` message.
|
||||||
|
|
||||||
|
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
|
||||||
|
not even be able to provide older blocks if they've pruned old
|
||||||
|
transactions from their block database. For this reason, the `getdata`
|
||||||
|
message should usually only be used to request data from a node which
|
||||||
|
previously advertised it had that data by sending an `inv` message.
|
||||||
|
|
||||||
|
The format and maximum size limitations of the `getdata` message are
|
||||||
|
identical to the `inv` message; only the message header differs.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### GetHeaders
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `getheaders` message requests a `headers` message that provides block headers
|
||||||
|
starting from a particular point in the block chain. It allows a
|
||||||
|
peer which has been disconnected or started for the first time to get
|
||||||
|
the headers it hasn’t seen yet.
|
||||||
|
|
||||||
|
The `getheaders` message is nearly identical to the `getblocks` message,
|
||||||
|
with one minor difference: the `inv` reply to the `getblocks` message
|
||||||
|
will include no more than 500 block header hashes; the `headers` reply
|
||||||
|
to the `getheaders` message will include as many as 2,000 block headers.
|
||||||
|
|
||||||
|
#### Headers
|
||||||
|
|
||||||
|
The `headers` message sends one or more block headers to a node which
|
||||||
|
previously requested certain headers with a `getheaders` message.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|----------|---------|------------------|-----------------
|
||||||
|
| *Varies* | count | compactSize uint | Number of block headers up to a maximum of 2,000.
|
||||||
|
| *Varies* | headers | block_header | Block headers: each 80-byte block header is in the format described in the [block headers section][block header] with an additional 0x00 suffixed. This 0x00 is called the transaction count, but because the headers message doesn't include any transactions, the transaction count is always zero.
|
||||||
|
|
||||||
|
The following annotated hexdump shows a `headers` message. (The message
|
||||||
|
header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
01 ................................. Header count: 1
|
||||||
|
|
||||||
|
02000000 ........................... Block version: 2
|
||||||
|
b6ff0b1b1680a2862a30ca44d346d9e8
|
||||||
|
910d334beb48ca0c0000000000000000 ... Hash of previous block's header
|
||||||
|
9d10aa52ee949386ca9385695f04ede2
|
||||||
|
70dda20810decd12bc9b048aaab31471 ... Merkle root
|
||||||
|
24d95a54 ........................... Unix time: 1415239972
|
||||||
|
30c31b18 ........................... Target (bits)
|
||||||
|
fe9f0864 ........................... Nonce
|
||||||
|
|
||||||
|
00 ................................. Transaction count (0x00)
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### Inv
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `inv` message (inventory message) transmits one or more inventories of
|
||||||
|
objects known to the transmitting peer. It can be sent unsolicited to
|
||||||
|
announce new transactions or blocks, or it can be sent in reply to a
|
||||||
|
`getblocks` message or `mempool` message.
|
||||||
|
|
||||||
|
The receiving peer can compare the inventories from an `inv` message
|
||||||
|
against the inventories it has already seen, and then use a follow-up
|
||||||
|
message to request unseen objects.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|----------|-----------|-----------------------|-----------------
|
||||||
|
| *Varies* | count | compactSize uint | The number of inventory entries.
|
||||||
|
| *Varies* | inventory | inventory | One or more inventory entries up to a maximum of 50,000 entries.
|
||||||
|
|
||||||
|
The following annotated hexdump shows an `inv` message with two
|
||||||
|
inventory entries. (The message header has been omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
02 ................................. Count: 2
|
||||||
|
|
||||||
|
01000000 ........................... Type: MSG_TX
|
||||||
|
de55ffd709ac1f5dc509a0925d0b1fc4
|
||||||
|
42ca034f224732e429081da1b621f55a ... Hash (TXID)
|
||||||
|
|
||||||
|
01000000 ........................... Type: MSG_TX
|
||||||
|
91d36d997037e08018262978766f24b8
|
||||||
|
a055aaf1d872e94ae85e9817b2c68dc7 ... Hash (TXID)
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### MemPool
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `mempool` message requests the TXIDs of transactions that the
|
||||||
|
receiving node has verified as valid but which have not yet appeared in
|
||||||
|
a block. That is, transactions which are in the receiving node's memory
|
||||||
|
pool. The response to the `mempool` message is one or more `inv`
|
||||||
|
messages containing the TXIDs in the usual inventory format. The
|
||||||
|
`mempool` message was introduced in protocol version 60002 as
|
||||||
|
implemented in Bitcoin Core 0.7.0 (September 2012).
|
||||||
|
|
||||||
|
Sending the `mempool` message is mostly useful when a program first
|
||||||
|
connects to the network. Full nodes can use it to quickly gather most or
|
||||||
|
all of the unconfirmed transactions available on the network; this is
|
||||||
|
especially useful for miners trying to gather transactions for their
|
||||||
|
transaction fees. SPV clients can set a filter before sending a
|
||||||
|
`mempool` to only receive transactions that match that filter; this
|
||||||
|
allows a recently-started client to get most or all unconfirmed
|
||||||
|
transactions related to its wallet.
|
||||||
|
|
||||||
|
The `inv` response to the `mempool` message is, at best, one node's
|
||||||
|
view of the network---not a complete list of unconfirmed transactions
|
||||||
|
on the network. Here are some additional reasons the list might not
|
||||||
|
be complete:
|
||||||
|
|
||||||
|
* Before Bitcoin Core 0.9.0, the response to the `mempool` message was
|
||||||
|
only one `inv` message. An `inv` message is limited to 50,000
|
||||||
|
inventories, so a node with a memory pool larger than 50,000 entries
|
||||||
|
would not send everything. Later versions of Bitcoin Core send as
|
||||||
|
many `inv` messages as needed to reference its complete memory pool.
|
||||||
|
|
||||||
|
* The `mempool` message is not currently fully compatible with the
|
||||||
|
`filterload` message's `BLOOM_UPDATE_ALL` and
|
||||||
|
`BLOOM_UPDATE_P2PUBKEY_ONLY` flags. Mempool transactions are not
|
||||||
|
sorted like in-block transactions, so a transaction (tx2) spending an
|
||||||
|
output can appear before the transaction (tx1) containing that output,
|
||||||
|
which means the automatic filter update mechanism won't operate until
|
||||||
|
the second-appearing transaction (tx1) is seen---missing the
|
||||||
|
first-appearing transaction (tx2). It has been proposed in [Bitcoin
|
||||||
|
Core issue #2381][] that the transactions should be sorted before
|
||||||
|
being processed by the filter.
|
||||||
|
|
||||||
|
There is no payload in a `mempool` message. See the [message header
|
||||||
|
section][message header] for an example of a message without a payload.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### MerkleBlock
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `merkleblock` message is a reply to a `getdata` message which
|
||||||
|
requested a block using the inventory type `MSG_MERKLEBLOCK`. It is
|
||||||
|
only part of the reply: if any matching transactions are found, they will
|
||||||
|
be sent separately as `tx` messages.
|
||||||
|
|
||||||
|
This message is part of the bloom filters described in BIP37, added in
|
||||||
|
protocol version 70001 and implemented in Bitcoin Core 0.8.0
|
||||||
|
(February 2013).
|
||||||
|
|
||||||
|
If a filter has been previously set with the `filterload` message, the
|
||||||
|
`merkleblock` message will contain the TXIDs of any transactions in the
|
||||||
|
requested block that matched the filter, as well as any parts of the
|
||||||
|
block's merkle tree necessary to connect those transactions to the
|
||||||
|
block header's merkle root. The message also contains a complete copy
|
||||||
|
of the block header to allow the client to hash it and confirm its
|
||||||
|
proof of work.
|
||||||
|
|
||||||
|
| Bytes | Name | Data Type | Description
|
||||||
|
|----------|--------------------|------------------|----------------
|
||||||
|
| 80 | block header | block_header | The block header in the format described in the [block header section][block header].
|
||||||
|
| 4 | transaction count | uint32_t | The number of transactions in the block (including ones that don't match the filter).
|
||||||
|
| *Varies* | hash count | compactSize uint | The number of hashes in the following field.
|
||||||
|
| *Varies* | hashes | char[32] | One or more hashes of both transactions and merkle nodes in internal byte order. Each hash is 32 bits.
|
||||||
|
| *Varies* | flag byte count | compactSize uint | The number of flag bytes in the following field.
|
||||||
|
| *Varies* | flags | byte[] | A sequence of bits packed eight in a byte with the least significant bit first. May be padded to the nearest byte boundary but must not contain any more bits than that. Used to assign the hashes to particular nodes in the merkle tree as described below.
|
||||||
|
|
||||||
|
The annotated hexdump below shows a `merkleblock` message which
|
||||||
|
corresponds to the examples below. (The message header has been
|
||||||
|
omitted.)
|
||||||
|
|
||||||
|
{% highlight text %}
|
||||||
|
01000000 ........................... Block version: 1
|
||||||
|
82bb869cf3a793432a66e826e05a6fc3
|
||||||
|
7469f8efb7421dc88067010000000000 ... Hash of previous block's header
|
||||||
|
7f16c5962e8bd963659c793ce370d95f
|
||||||
|
093bc7e367117b3c30c1f8fdd0d97287 ... Merkle root
|
||||||
|
76381b4d ........................... Time: 1293629558
|
||||||
|
4c86041b ........................... nBits: 0x04864c * 256**(0x1b-3)
|
||||||
|
554b8529 ........................... Nonce
|
||||||
|
|
||||||
|
07000000 ........................... Transaction count: 7
|
||||||
|
04 ................................. Hash count: 4
|
||||||
|
|
||||||
|
3612262624047ee87660be1a707519a4
|
||||||
|
43b1c1ce3d248cbfc6c15870f6c5daa2 ... Hash #1
|
||||||
|
019f5b01d4195ecbc9398fbf3c3b1fa9
|
||||||
|
bb3183301d7a1fb3bd174fcfa40a2b65 ... Hash #2
|
||||||
|
41ed70551dd7e841883ab8f0b16bf041
|
||||||
|
76b7d1480e4f0af9f3d4c3595768d068 ... Hash #3
|
||||||
|
20d2a7bc994987302e5b1ac80fc425fe
|
||||||
|
25f8b63169ea78e68fbaaefa59379bbf ... Hash #4
|
||||||
|
|
||||||
|
01 ................................. Flag bytes: 1
|
||||||
|
1d ................................. Flags: 1 0 1 1 1 0 0 0
|
||||||
|
{% endhighlight %}
|
||||||
|
|
||||||
|
Note: when fully decoded, the above `merkleblock` message provided the
|
||||||
|
TXID for a single transaction that matched the filter. In the network
|
||||||
|
traffic dump this output was taken from, the full transaction belonging
|
||||||
|
to that TXID was sent immediately after the `merkleblock` message as
|
||||||
|
a `tx` message.
|
||||||
|
|
||||||
|
**Parsing A MerkleBlock**
|
||||||
|
|
||||||
|
As seen in the annotated hexdump above, the `merkleblock` message
|
||||||
|
provides three special data types: a transaction count, a list of
|
||||||
|
hashes, and a list of one-bit flags.
|
||||||
|
|
||||||
|
You can use the transaction count to construct an empty merkle tree.
|
||||||
|
We'll call each entry in the tree a node; on the bottom are TXID
|
||||||
|
nodes---the hashes for these nodes are TXIDs; the remaining nodes
|
||||||
|
(including the merkle root) are non-TXID nodes---they may actually have
|
||||||
|
the same hash as a TXID, but we treat them differently.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Keep the hashes and flags in the order they appear in the `merkleblock`
|
||||||
|
message. When we say "next flag" or "next hash", we mean the next flag
|
||||||
|
or hash on the list, even if it's the first one we've used so far.
|
||||||
|
|
||||||
|
Start with the merkle root node and the first flag. The table below
|
||||||
|
describes how to evaluate a flag based on whether the node being
|
||||||
|
processed is a TXID node or a non-TXID node. Once you apply a flag to a
|
||||||
|
node, never apply another flag to that same node or reuse that same
|
||||||
|
flag again.
|
||||||
|
|
||||||
|
| Flag | TXID Node | Non-TXID Node
|
||||||
|
|-------|------------------------------------------------------------------------------------------|----
|
||||||
|
| **0** | Use the next hash as this node's TXID, but this transaction didn't match the filter. | Use the next hash as this node's hash. Don't process any descendant nodes.
|
||||||
|
| **1** | Use the next hash as this node's TXID, and mark this transaction as matching the filter. | The hash needs to be computed. Process the left child node to get its hash; process the right child node to get its hash; then concatenate the two hashes as 64 raw bytes and hash them to get this node's hash.
|
||||||
|
|
||||||
|
Any time you begin processing a node for the first time, evaluate the next
|
||||||
|
flag. Never use a flag at any other time.
|
||||||
|
|
||||||
|
When processing a child node, you may need to process its children (the
|
||||||
|
grandchildren of the original node) or further-descended nodes before
|
||||||
|
returning to the parent node. This is expected---keep processing depth
|
||||||
|
first until you reach a TXID node or a non-TXID node with a flag of 0.
|
||||||
|
|
||||||
|
After you process a TXID node or a non-TXID node with a flag of 0, stop
|
||||||
|
processing flags and begin to ascend the tree. As you ascend, compute
|
||||||
|
the hash of any nodes for which you now have both child hashes or for
|
||||||
|
which you now have the sole child hash. See the [merkle tree
|
||||||
|
section][section merkle trees] for hashing instructions. If you reach a
|
||||||
|
node where only the left hash is known, descend into its right child (if
|
||||||
|
present) and further descendants as necessary.
|
||||||
|
|
||||||
|
However, if you find a node whose left and right children both have the
|
||||||
|
same hash, fail. This is related to CVE-2012-2459.
|
||||||
|
|
||||||
|
Continue descending and ascending until you have enough information to
|
||||||
|
obtain the hash of the merkle root node. If you run out of flags or
|
||||||
|
hashes before that condition is reached, fail. Then perform the
|
||||||
|
following checks (order doesn't matter):
|
||||||
|
|
||||||
|
* Fail if there are unused hashes in the hashes list.
|
||||||
|
|
||||||
|
* Fail if there are unused flag bits---except for the minimum number of
|
||||||
|
bits necessary to pad up to the next full byte.
|
||||||
|
|
||||||
|
* Fail if the hash of the merkle root node is not identical to the
|
||||||
|
merkle root in the block header.
|
||||||
|
|
||||||
|
* Fail if the block header is invalid. Remember to ensure that the hash
|
||||||
|
of the header is less than or equal to the target threshold encoded by
|
||||||
|
the nBits header field. Your program should also, of course, attempt
|
||||||
|
to ensure the header belongs to the best block chain and that the user
|
||||||
|
knows how many confirmations this block has.
|
||||||
|
|
||||||
|
For a detailed example of parsing a `merkleblock` message, please see
|
||||||
|
the corresponding [merkleblock examples section][section merkleblock
|
||||||
|
example].
|
||||||
|
|
||||||
|
**Creating A MerkleBlock**
|
||||||
|
|
||||||
|
It's easier to understand how to create a `merkleblock` message after
|
||||||
|
you understand how to parse an already-created message, so we recommend
|
||||||
|
you read the parsing section above first.
|
||||||
|
|
||||||
|
Create a complete merkle tree with TXIDs on the bottom row and all the
|
||||||
|
other hashes calculated up to the merkle root on the top row. For each
|
||||||
|
transaction that matches the filter, track its TXID node and all of its
|
||||||
|
ancestor nodes.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Start processing the tree with the merkle root node. The table below
|
||||||
|
describes how to process both TXID nodes and non-TXID nodes based on
|
||||||
|
whether the node is a match, a match ancestor, or neither a match nor a
|
||||||
|
match ancestor.
|
||||||
|
|
||||||
|
| | TXID Node | Non-TXID Node
|
||||||
|
|--------------------------------------|------------------------------------------------------------------------|----
|
||||||
|
| **Neither Match Nor Match Ancestor** | Append a 0 to the flag list; append this node's TXID to the hash list. | Append a 0 to the flag list; append this node's hash to the hash list. Do not descend into its child nodes.
|
||||||
|
| **Match Or Match Ancestor** | Append a 1 to the flag list; append this node's TXID to the hash list. | Append a 1 to the flag list; process the left child node. Then, if the node has a right child, process the right child. Do not append a hash to the hash list for this node.
|
||||||
|
|
||||||
|
Any time you begin processing a node for the first time, a flag should be
|
||||||
|
appended to the flag list. Never put a flag on the list at any other
|
||||||
|
time, except when processing is complete to pad out the flag list to a
|
||||||
|
byte boundary.
|
||||||
|
|
||||||
|
When processing a child node, you may need to process its children (the
|
||||||
|
grandchildren of the original node) or further-descended nodes before
|
||||||
|
returning to the parent node. This is expected---keep processing depth
|
||||||
|
first until you reach a TXID node or a node which is neither a TXID nor
|
||||||
|
a match ancestor.
|
||||||
|
|
||||||
|
After you process a TXID node or a node which is neither a TXID nor a
|
||||||
|
match ancestor, stop processing and begin to ascend the tree until you
|
||||||
|
find a node with a right child you haven't processed yet. Descend into
|
||||||
|
that right child and process it.
|
||||||
|
|
||||||
|
After you fully process the merkle root node according to the
|
||||||
|
instructions in the table above, processing is complete. Pad your flag
|
||||||
|
list to a byte boundary and construct the `merkleblock` message using the
|
||||||
|
template near the beginning of this subsection.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### NotFound
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `notfound` message is a reply to a `getdata` message which
|
||||||
|
requested an object the receiving node does not have available for
|
||||||
|
relay. (Nodes are not expected to relay historic transactions which
|
||||||
|
are no longer in the memory pool or relay set. Nodes may also have
|
||||||
|
pruned spent transactions from older blocks, making them unable to
|
||||||
|
send those blocks.)
|
||||||
|
|
||||||
|
The format and maximum size limitations of the `notfound` message are
|
||||||
|
identical to the `inv` message; only the message header differs.
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
||||||
|
#### Tx
|
||||||
|
|
||||||
|
{% autocrossref %}
|
||||||
|
|
||||||
|
The `tx` message transmits a single transaction in the raw transaction
|
||||||
|
format. It can be sent in a variety of situations;
|
||||||
|
|
||||||
|
* **Transaction Response:** Bitcoin Core and BitcoinJ will send it in
|
||||||
|
response to a `getdata` message that requests the transaction with an
|
||||||
|
inventory type of `MSG_TX`.
|
||||||
|
|
||||||
|
* **MerkleBlock Response:** Bitcoin Core will send it in response to a
|
||||||
|
`getdata` message that requests a merkleblock with an inventory type
|
||||||
|
of `MSG_MERKLEBLOCK`. (This is in addition to sending a `merkleblock`
|
||||||
|
message.) Each `tx` message in this case provides a matched
|
||||||
|
transaction from that block.
|
||||||
|
|
||||||
|
* **Unsolicited:** BitcoinJ will send a `tx` message unsolicited for
|
||||||
|
transactions it originates.
|
||||||
|
|
||||||
|
For an example hexdump of the raw transaction format, see the [raw
|
||||||
|
transaction section][raw format].
|
||||||
|
|
||||||
|
{% endautocrossref %}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
[block chain]: /en/developer-guide#block-chain "A chain of blocks with each block linking to the block that preceded; the most-difficult-to-recreate chain is The Block Chain"
|
[block chain]: /en/developer-guide#block-chain "A chain of blocks with each block linking to the block that preceded; the most-difficult-to-recreate chain is The Block Chain"
|
||||||
[block header]: /en/developer-reference#block-headers "An 80-byte header belonging to a single block which is hashed repeatedly to create proof of work"
|
[block header]: /en/developer-reference#block-headers "An 80-byte header belonging to a single block which is hashed repeatedly to create proof of work"
|
||||||
[block height]: /en/developer-guide#term-block-height "The number of chained blocks preceding this block"
|
[block height]: /en/developer-guide#term-block-height "The number of chained blocks preceding this block"
|
||||||
|
[block message]: /en/developer-reference#block "The P2P network message which sends a serialized block"
|
||||||
[block reward]: /en/developer-reference#term-block-reward "New satoshis given to a miner for creating one of the first 6,929,999 blocks"
|
[block reward]: /en/developer-reference#term-block-reward "New satoshis given to a miner for creating one of the first 6,929,999 blocks"
|
||||||
[block time]: /en/developer-reference#term-block-time "The time field in the block header"
|
[block time]: /en/developer-reference#term-block-time "The time field in the block header"
|
||||||
[block version]: /en/developer-reference#term-block-version "The version field in the block header"
|
[block version]: /en/developer-reference#term-block-version "The version field in the block header"
|
||||||
|
@ -46,14 +47,20 @@
|
||||||
[fiat]: /en/developer-guide#term-fiat "National currencies such as the dollar or euro"
|
[fiat]: /en/developer-guide#term-fiat "National currencies such as the dollar or euro"
|
||||||
[fork]: /en/developer-guide#term-fork "When two or more blocks have the same block height, forking the block chain."
|
[fork]: /en/developer-guide#term-fork "When two or more blocks have the same block height, forking the block chain."
|
||||||
[genesis block]: /en/developer-guide#term-genesis-block "The first block created; also called block 0"
|
[genesis block]: /en/developer-guide#term-genesis-block "The first block created; also called block 0"
|
||||||
|
[getblocks message]: /en/developer-reference#getblocks "A P2P protocol message used to request an inv message containing a range of block header hashes"
|
||||||
|
[getdata message]: /en/developer-reference#getdata "A P2P protocol message used to request one or more transactions, blocks, or merkleblocks"
|
||||||
|
[getheaders message]: /en/developer-reference#getheaders "A P2P protocol message used to request a range of block headers"
|
||||||
[hard fork]: /en/developer-guide#term-hard-fork "A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can't validate blocks created by upgraded nodes following newer consensus rules."
|
[hard fork]: /en/developer-guide#term-hard-fork "A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can't validate blocks created by upgraded nodes following newer consensus rules."
|
||||||
[hardened extended private key]: /en/developer-guide#term-hardened-extended-private-key "A private key whose corresponding public key cannot derive child keys"
|
[hardened extended private key]: /en/developer-guide#term-hardened-extended-private-key "A private key whose corresponding public key cannot derive child keys"
|
||||||
[HD protocol]: /en/developer-guide#term-hd-protocol "The Hierarchical Deterministic (HD) key creation and transfer protocol"
|
[HD protocol]: /en/developer-guide#term-hd-protocol "The Hierarchical Deterministic (HD) key creation and transfer protocol"
|
||||||
|
[headers message]: /en/developer-reference#headers "A P2P protocol message containing one or more block headers"
|
||||||
[high-priority transactions]: /en/developer-guide#term-high-priority-transactions "Transactions which don't pay a transaction fee; only transactions spending long-idle outputs are eligible"
|
[high-priority transactions]: /en/developer-guide#term-high-priority-transactions "Transactions which don't pay a transaction fee; only transactions spending long-idle outputs are eligible"
|
||||||
[input]: /en/developer-guide#term-input "The input to a transaction linking to the output of a previous transaction which permits spending of satoshis"
|
[input]: /en/developer-guide#term-input "The input to a transaction linking to the output of a previous transaction which permits spending of satoshis"
|
||||||
[inputs]: /en/developer-guide#term-input "The input to a transaction linking to the output of a previous transaction which permits spending of satoshis"
|
[inputs]: /en/developer-guide#term-input "The input to a transaction linking to the output of a previous transaction which permits spending of satoshis"
|
||||||
[intermediate certificate]: /en/developer-examples#term-intermediate-certificate "A intermediate certificate authority certificate which helps connect a leaf (receiver) certificate to a root certificate authority"
|
[intermediate certificate]: /en/developer-examples#term-intermediate-certificate "A intermediate certificate authority certificate which helps connect a leaf (receiver) certificate to a root certificate authority"
|
||||||
[internal byte order]: /en/developer-reference#hash-byte-order "The standard order in which hash digests are displayed as strings---the same format used in blocks"
|
[internal byte order]: /en/developer-reference#hash-byte-order "The standard order in which hash digests are displayed as strings---the same format used in blocks"
|
||||||
|
[inv message]: /en/developer-reference#inv "A P2P protocol message used to send inventories of transactions and blocks known to the transmitting peer"
|
||||||
|
[inventory]: /en/developer-reference#term-inventory "A data type identifier and a hash; used to identify transactions and blocks available for download through the P2P network."
|
||||||
[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"
|
||||||
[label]: /en/developer-guide#term-label "The label parameter of a bitcoin: URI which provides the spender with the receiver's name (unauthenticated)"
|
[label]: /en/developer-guide#term-label "The label parameter of a bitcoin: URI which provides the spender with the receiver's name (unauthenticated)"
|
||||||
|
@ -63,19 +70,26 @@
|
||||||
[mainnet]: /en/developer-examples#term-mainnet "The Bitcoin main network used to transfer satoshis (compare to testnet, the test network)"
|
[mainnet]: /en/developer-examples#term-mainnet "The Bitcoin main network used to transfer satoshis (compare to testnet, the test network)"
|
||||||
[master chain code]: /en/developer-guide#term-master-chain-code "The chain code derived from the root seed"
|
[master chain code]: /en/developer-guide#term-master-chain-code "The chain code derived from the root seed"
|
||||||
[master private key]: /en/developer-guide#term-master-private-key "A private key derived from the root seed"
|
[master private key]: /en/developer-guide#term-master-private-key "A private key derived from the root seed"
|
||||||
|
[mempool message]: /en/developer-reference#mempool "A P2P protocol message used to request one or more inv messages with currently-unconfirmed transactions"
|
||||||
[merge]: /en/developer-guide#term-merge "Spending, in the same transaction, multiple outputs which can be traced back to different previous spenders, leaking information about how many satoshis you control"
|
[merge]: /en/developer-guide#term-merge "Spending, in the same transaction, multiple outputs which can be traced back to different previous spenders, leaking information about how many satoshis you control"
|
||||||
[merge avoidance]: /en/developer-guide#term-merge-avoidance "A strategy for selecting which outputs to spend that avoids merging outputs with different histories that could leak private information"
|
[merge avoidance]: /en/developer-guide#term-merge-avoidance "A strategy for selecting which outputs to spend that avoids merging outputs with different histories that could leak private information"
|
||||||
[message]: /en/developer-guide#term-message "A parameter of bitcoin: URIs which allows the receiver to optionally specify a message to the spender"
|
|
||||||
[merkle root]: /en/developer-guide#term-merkle-root "The root node of a merkle tree descended from all the hashed pairs in the tree"
|
[merkle root]: /en/developer-guide#term-merkle-root "The root node of a merkle tree descended from all the hashed pairs in the tree"
|
||||||
[merkle tree]: /en/developer-guide#term-merkle-tree "A tree constructed by hashing paired data, then pairing and hashing the results until a single hash remains, the merkle root"
|
[merkle tree]: /en/developer-guide#term-merkle-tree "A tree constructed by hashing paired data, then pairing and hashing the results until a single hash remains, the merkle root"
|
||||||
|
[merkleblock message]: /en/developer-reference#merkleblock "A P2P protocol message used to request a filtered block useful for SPV proofs"
|
||||||
|
[message]: /en/developer-guide#term-message "A parameter of bitcoin: URIs which allows the receiver to optionally specify a message to the spender"
|
||||||
|
[message header]: /en/developer-reference#message-headers "The four header fields prefixed to all messages on the P2P network"
|
||||||
[millibitcoins]: /en/developer-guide#term-millibitcoins "0.001 bitcoins (100,000 satoshis)"
|
[millibitcoins]: /en/developer-guide#term-millibitcoins "0.001 bitcoins (100,000 satoshis)"
|
||||||
[mine]: /en/developer-guide#term-miner "Creating Bitcoin blocks which solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
[mine]: /en/developer-guide#term-miner "Creating Bitcoin blocks which solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
||||||
[miner]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
[miner]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
||||||
[miners]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
[miners]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
|
||||||
[minimum fee]: /en/developer-guide#term-minimum-fee "The minimum fee a transaction must pay in must circumstances to be mined or broadcast by peers across the network"
|
[minimum fee]: /en/developer-guide#term-minimum-fee "The minimum fee a transaction must pay in most circumstances to be mined or broadcast by peers across the network"
|
||||||
|
[msg_tx]: /en/developer-reference#term-msg_tx "The TXID data type identifier of an inventory on the P2P network"
|
||||||
|
[msg_block]: /en/developer-reference#term-msg_block "The block header hash data type identifier of an inventory on the P2P network"
|
||||||
|
[msg_filtered_block]: /en/developer-reference#term-msg_block "An alternative to the block header hash data type identifier of an inventory on the P2P network used to request a merkleblock"
|
||||||
[multisig]: /en/developer-guide#term-multisig "An pubkey script using OP_CHECKMULTISIG to check for multiple signatures"
|
[multisig]: /en/developer-guide#term-multisig "An pubkey script using OP_CHECKMULTISIG to check for multiple signatures"
|
||||||
[nbits]: /en/developer-reference#target-nbits "The encoded form of the target threshold as it appears in the block header"
|
[nbits]: /en/developer-reference#target-nbits "The encoded form of the target threshold as it appears in the block header"
|
||||||
[network]: /en/developer-guide#term-network "The Bitcoin P2P network which broadcasts transactions and blocks"
|
[network]: /en/developer-guide#term-network "The Bitcoin P2P network which broadcasts transactions and blocks"
|
||||||
|
[notfound message]: /en/developer-reference#notfound "A P2P protocol message sent to indicate that the requested data was not available"
|
||||||
[Null data]: /en/developer-guide#term-null-data "A standard transaction type which allows adding 40 bytes of arbitrary data to the block chain up to once per transaction"
|
[Null data]: /en/developer-guide#term-null-data "A standard transaction type which allows adding 40 bytes of arbitrary data to the block chain up to once per transaction"
|
||||||
[op_checkmultisig]: /en/developer-reference#term-op-checkmultisig "Op code 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 "Op code 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_checksig]: /en/developer-reference#term-op-checksig "Op code which returns true if a signature signs the correct parts of a transaction and matches a provided public key"
|
[op_checksig]: /en/developer-reference#term-op-checksig "Op code which returns true if a signature signs the correct parts of a transaction and matches a provided public key"
|
||||||
|
@ -147,15 +161,17 @@
|
||||||
[stack]: /en/developer-guide#term-stack "An evaluation stack used in Bitcoin's script language"
|
[stack]: /en/developer-guide#term-stack "An evaluation stack used in Bitcoin's script language"
|
||||||
[stale block]: /en/developer-guide#term-stale-block "Blocks which were successfully mined but which aren't included on the current valid block chain"
|
[stale block]: /en/developer-guide#term-stale-block "Blocks which were successfully mined but which aren't included on the current valid block chain"
|
||||||
[standard script]: /en/developer-guide#standard-transactions "A pubkey script which matches the IsStandard() patterns specified in Bitcoin Core---or a transaction containing only standard outputs. Only standard transactions are mined or broadcast by peers running the default Bitcoin Core software"
|
[standard script]: /en/developer-guide#standard-transactions "A pubkey script which matches the IsStandard() patterns specified in Bitcoin Core---or a transaction containing only standard outputs. Only standard transactions are mined or broadcast by peers running the default Bitcoin Core software"
|
||||||
|
[start string]: /en/developer-reference#term-start-string "Four defined bytes which start every message in the P2P protocol to allow seeking to the next message"
|
||||||
[target]: /en/developer-guide#term-target "The threshold below which a block header hash must be in order for the block to be added to the block chain"
|
[target]: /en/developer-guide#term-target "The threshold below which a block header hash must be in order for the block to be added to the block chain"
|
||||||
[testnet]: /en/developer-examples#testnet "A Bitcoin-like network where the satoshis have no real-world value to allow risk-free testing"
|
[testnet]: /en/developer-examples#testnet "A Bitcoin-like network where the satoshis have no real-world value to allow risk-free testing"
|
||||||
[transaction fee]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block"
|
[transaction fee]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block"
|
||||||
[transaction fees]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block"
|
[transaction fees]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block"
|
||||||
[transaction malleability]: /en/developer-guide#transaction-malleability "The ability of an attacker to change the transaction identifier (txid) of unconfirmed transactions, making dependent transactions invalid"
|
[transaction malleability]: /en/developer-guide#transaction-malleability "The ability of an attacker to change the transaction identifier (txid) of unconfirmed transactions, making dependent transactions invalid"
|
||||||
[txid]: /en/developer-guide#term-txid "A hash of a completed transaction which allows other transactions to spend its outputs"
|
|
||||||
[transaction]: /en/developer-guide#transactions "A transaction spending satoshis"
|
[transaction]: /en/developer-guide#transactions "A transaction spending satoshis"
|
||||||
[transaction version number]: /en/developer-guide#term-transaction-version-number "A version number prefixed to transactions to allow upgrading""
|
[transaction version number]: /en/developer-guide#term-transaction-version-number "A version number prefixed to transactions to allow upgrading""
|
||||||
[transactions]: /en/developer-guide#transactions "A transaction spending satoshis"
|
[transactions]: /en/developer-guide#transactions "A transaction spending satoshis"
|
||||||
|
[tx message]: /en/developer-reference#tx "A P2P protocol message which sends a single serialized transaction"
|
||||||
|
[txid]: /en/developer-guide#term-txid "A hash of a completed transaction which allows other transactions to spend its outputs"
|
||||||
[unconfirmed]: /en/developer-guide#term-unconfirmed-transactions "A transaction which has not yet been added to the block chain"
|
[unconfirmed]: /en/developer-guide#term-unconfirmed-transactions "A transaction which has not yet been added to the block chain"
|
||||||
[unconfirmed transactions]: /en/developer-guide#term-unconfirmed-transactions "A transaction which has not yet been added to the block chain"
|
[unconfirmed transactions]: /en/developer-guide#term-unconfirmed-transactions "A transaction which has not yet been added to the block chain"
|
||||||
[unique addresses]: /en/developer-guide#term-unique-address "Address which are only used once to protect privacy and increase security"
|
[unique addresses]: /en/developer-guide#term-unique-address "Address which are only used once to protect privacy and increase security"
|
||||||
|
@ -244,7 +260,11 @@
|
||||||
[rpc walletpassphrasechange]: /en/developer-reference#walletpassphrasechange
|
[rpc walletpassphrasechange]: /en/developer-reference#walletpassphrasechange
|
||||||
|
|
||||||
<!-- Other internal site links; alphabetical order -->
|
<!-- Other internal site links; alphabetical order -->
|
||||||
|
[Bitcoin Core 0.6.0]: /en/release/v0.6.0
|
||||||
|
[Bitcoin Core 0.6.1]: /en/release/v0.6.1
|
||||||
[Bitcoin Core 0.7.0]: /en/release/v0.7.0
|
[Bitcoin Core 0.7.0]: /en/release/v0.7.0
|
||||||
|
[Bitcoin Core 0.8.0]: /en/release/v0.8.0
|
||||||
|
[Bitcoin Core 0.9.0]: /en/release/v0.9.0
|
||||||
[Bitcoin Core 0.9.3]: /en/release/v0.9.3
|
[Bitcoin Core 0.9.3]: /en/release/v0.9.3
|
||||||
[bitcoin URI subsection]: /en/developer-guide#bitcoin-uri
|
[bitcoin URI subsection]: /en/developer-guide#bitcoin-uri
|
||||||
[bitcoinpdf]: https://bitcoin.org/bitcoin.pdf
|
[bitcoinpdf]: https://bitcoin.org/bitcoin.pdf
|
||||||
|
@ -266,8 +286,12 @@
|
||||||
[RPC]: /en/developer-reference#remote-procedure-calls-rpcs
|
[RPC]: /en/developer-reference#remote-procedure-calls-rpcs
|
||||||
[RPCs]: /en/developer-reference#remote-procedure-calls-rpcs
|
[RPCs]: /en/developer-reference#remote-procedure-calls-rpcs
|
||||||
[section detecting forks]: /en/developer-guide#detecting-forks
|
[section detecting forks]: /en/developer-guide#detecting-forks
|
||||||
|
[section getblocktemplate]: /en/developer-guide#getblocktemplate-rpc
|
||||||
[section hash byte order]: /en/developer-reference#hash-byte-order
|
[section hash byte order]: /en/developer-reference#hash-byte-order
|
||||||
[section merkle trees]: /en/developer-reference#merkle-trees
|
[section merkle trees]: /en/developer-reference#merkle-trees
|
||||||
|
[section merkleblock example]: /en/developer-examples#parsing-a-merkleblock
|
||||||
|
[section protocol versions]: /en/developer-reference#protocol-versions
|
||||||
|
[section serialized blocks]: /en/developer-reference#serialized-blocks
|
||||||
[section simple raw transaction]: /en/developer-examples#simple-raw-transaction
|
[section simple raw transaction]: /en/developer-examples#simple-raw-transaction
|
||||||
[section verifying payment]: /en/developer-guide#verifying-payment
|
[section verifying payment]: /en/developer-guide#verifying-payment
|
||||||
[signature script modification warning]: /en/developer-reference#signature_script_modification_warning
|
[signature script modification warning]: /en/developer-reference#signature_script_modification_warning
|
||||||
|
@ -277,13 +301,18 @@
|
||||||
|
|
||||||
<!-- Official reference documents (BIPs should not use zero padding:
|
<!-- Official reference documents (BIPs should not use zero padding:
|
||||||
BIP32 not BIP0032; alphabetical order -->
|
BIP32 not BIP0032; alphabetical order -->
|
||||||
|
[BIP14]: https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki
|
||||||
[BIP16]: https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki
|
[BIP16]: https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki
|
||||||
[BIP21]: https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
|
[BIP21]: https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
|
||||||
[BIP30]: https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki
|
[BIP30]: https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki
|
||||||
|
[BIP31]: https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki
|
||||||
[BIP32]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
|
[BIP32]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
|
||||||
[BIP34]: https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki
|
[BIP34]: https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki
|
||||||
|
[BIP35]: https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki
|
||||||
|
[BIP37]: https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki
|
||||||
[BIP39]: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
|
[BIP39]: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
|
||||||
[BIP50]: https://github.com/bitcoin/bips/blob/master/bip-0050.mediawiki
|
[BIP50]: https://github.com/bitcoin/bips/blob/master/bip-0050.mediawiki
|
||||||
|
[BIP61]: https://github.com/bitcoin/bips/blob/master/bip-0061.mediawiki
|
||||||
[BIP62]: https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki
|
[BIP62]: https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki
|
||||||
[BIP70]: https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki
|
[BIP70]: https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki
|
||||||
[BIP71]: https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki
|
[BIP71]: https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki
|
||||||
|
@ -297,12 +326,14 @@
|
||||||
[BFGMiner]: https://github.com/luke-jr/bfgminer
|
[BFGMiner]: https://github.com/luke-jr/bfgminer
|
||||||
[Bitcoin Core]: https://bitcoin.org/en/download
|
[Bitcoin Core]: https://bitcoin.org/en/download
|
||||||
[bitcoin core fee drop commit]: https://github.com/bitcoin/bitcoin/commit/6a4c196dd64da2fd33dc7ae77a8cdd3e4cf0eff1
|
[bitcoin core fee drop commit]: https://github.com/bitcoin/bitcoin/commit/6a4c196dd64da2fd33dc7ae77a8cdd3e4cf0eff1
|
||||||
|
[Bitcoin Core issue #2381]: https://github.com/bitcoin/bitcoin/issues/2381
|
||||||
[Bitcoin Seeder]: https://github.com/sipa/bitcoin-seeder
|
[Bitcoin Seeder]: https://github.com/sipa/bitcoin-seeder
|
||||||
[bitcoin-documentation mailing list]: https://groups.google.com/forum/#!forum/bitcoin-documentation
|
[bitcoin-documentation mailing list]: https://groups.google.com/forum/#!forum/bitcoin-documentation
|
||||||
[BitcoinJ]: http://bitcoinj.github.io
|
[BitcoinJ]: http://bitcoinj.github.io
|
||||||
[block170]: https://www.biteasy.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
|
[block170]: https://www.biteasy.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
|
||||||
[casascius address utility]: https://github.com/casascius/Bitcoin-Address-Utility
|
[casascius address utility]: https://github.com/casascius/Bitcoin-Address-Utility
|
||||||
[core base58.h]: https://github.com/bitcoin/bitcoin/blob/master/src/base58.h
|
[core base58.h]: https://github.com/bitcoin/bitcoin/blob/master/src/base58.h
|
||||||
|
[core chainparams.cpp]: https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp
|
||||||
[core git]: https://github.com/bitcoin/bitcoin
|
[core git]: https://github.com/bitcoin/bitcoin
|
||||||
[core paymentrequest.proto]: https://github.com/bitcoin/bitcoin/blob/master/src/qt/paymentrequest.proto
|
[core paymentrequest.proto]: https://github.com/bitcoin/bitcoin/blob/master/src/qt/paymentrequest.proto
|
||||||
[core script.h]: https://github.com/bitcoin/bitcoin/blob/master/src/script.h
|
[core script.h]: https://github.com/bitcoin/bitcoin/blob/master/src/script.h
|
||||||
|
@ -318,16 +349,19 @@
|
||||||
[high-speed block relay network]: https://www.mail-archive.com/bitcoin-development@lists.sourceforge.net/msg03189.html
|
[high-speed block relay network]: https://www.mail-archive.com/bitcoin-development@lists.sourceforge.net/msg03189.html
|
||||||
[HMAC-SHA512]: https://en.wikipedia.org/wiki/HMAC
|
[HMAC-SHA512]: https://en.wikipedia.org/wiki/HMAC
|
||||||
[HTTP longpoll]: https://en.wikipedia.org/wiki/Push_technology#Long_polling
|
[HTTP longpoll]: https://en.wikipedia.org/wiki/Push_technology#Long_polling
|
||||||
|
[IP-to-IP payment protocol]: https://en.bitcoin.it/wiki/IP_Transactions
|
||||||
[irc channels]: https://en.bitcoin.it/wiki/IRC_channels
|
[irc channels]: https://en.bitcoin.it/wiki/IRC_channels
|
||||||
[libblkmaker]: https://gitorious.org/bitcoin/libblkmaker
|
[libblkmaker]: https://gitorious.org/bitcoin/libblkmaker
|
||||||
[makeseeds script]: https://github.com/bitcoin/bitcoin/tree/master/contrib/seeds
|
[makeseeds script]: https://github.com/bitcoin/bitcoin/tree/master/contrib/seeds
|
||||||
[man-in-the-middle]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
|
[man-in-the-middle]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
|
||||||
[MIME]: https://en.wikipedia.org/wiki/Internet_media_type
|
[MIME]: https://en.wikipedia.org/wiki/Internet_media_type
|
||||||
[mozrootstore]: https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/
|
[mozrootstore]: https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/
|
||||||
|
[netcat]: https://en.wikipedia.org/wiki/Netcat
|
||||||
[Payment Request Generator]: http://bitcoincore.org/~gavin/createpaymentrequest.php
|
[Payment Request Generator]: http://bitcoincore.org/~gavin/createpaymentrequest.php
|
||||||
[Piotr Piasecki's testnet faucet]: https://tpfaucet.appspot.com/
|
[Piotr Piasecki's testnet faucet]: https://tpfaucet.appspot.com/
|
||||||
[prime symbol]: https://en.wikipedia.org/wiki/Prime_%28symbol%29
|
[prime symbol]: https://en.wikipedia.org/wiki/Prime_%28symbol%29
|
||||||
[protobuf]: https://developers.google.com/protocol-buffers/
|
[protobuf]: https://developers.google.com/protocol-buffers/
|
||||||
|
[python-bitcoinlib]: https://github.com/petertodd/python-bitcoinlib
|
||||||
[python-blkmaker]: https://gitorious.org/bitcoin/python-blkmaker
|
[python-blkmaker]: https://gitorious.org/bitcoin/python-blkmaker
|
||||||
[SHA256]: https://en.wikipedia.org/wiki/SHA-2
|
[SHA256]: https://en.wikipedia.org/wiki/SHA-2
|
||||||
[Stratum mining protocol]: http://mining.bitcoin.cz/stratum-mining
|
[Stratum mining protocol]: http://mining.bitcoin.cz/stratum-mining
|
||||||
|
@ -336,3 +370,7 @@
|
||||||
[wiki script]: https://en.bitcoin.it/wiki/Script
|
[wiki script]: https://en.bitcoin.it/wiki/Script
|
||||||
[x509]: https://en.wikipedia.org/wiki/X.509
|
[x509]: https://en.wikipedia.org/wiki/X.509
|
||||||
|
|
||||||
|
<!-- Direct links to code; link to a specific commit to prevent code
|
||||||
|
changes from moving the referenced object, but also update links
|
||||||
|
periodically to point to recent code. Last update: 2014-11-12 -->
|
||||||
|
[MAX_SIZE]: https://github.com/bitcoin/bitcoin/blob/60abd463ac2eaa8bc1d616d8c07880dc53d97211/src/serialize.h#L23
|
||||||
|
|
|
@ -65,9 +65,9 @@ require 'yaml'
|
||||||
(?![^\s]*<!--noref-->) ## No subst if <!--noref--> after key
|
(?![^\s]*<!--noref-->) ## No subst if <!--noref--> after key
|
||||||
(?!((?!<pre>).)*(<\/pre>)) ## No subst on a line with a closing pre tag. This
|
(?!((?!<pre>).)*(<\/pre>)) ## No subst on a line with a closing pre tag. This
|
||||||
## prevents matching in {% highlight %} code blocks.
|
## prevents matching in {% highlight %} code blocks.
|
||||||
(?![^\(]*(\.svg|\.png)) ## No subst if key inside an image name. This
|
(?![^\(]*(\.svg|\.png|\.gif)) ## No subst if key inside an image name. This
|
||||||
## simple regex has the side effect that we can't
|
## simple regex has the side effect that we can't
|
||||||
## use .svg or .png in non-image base text; if that
|
## use .svg, .png, or .gif in non-image base text; if that
|
||||||
## becomes an issue, we can devise a more complex
|
## becomes an issue, we can devise a more complex
|
||||||
## regex
|
## regex
|
||||||
(?!\w) ## Don't match inside words
|
(?!\w) ## Don't match inside words
|
||||||
|
|
|
@ -62,6 +62,8 @@ title: "Developer Documentation - Bitcoin"
|
||||||
<div>
|
<div>
|
||||||
<h2><img src="/img/ico_network.svg" class="titleicon" alt="Icon">P2P Network</h2>
|
<h2><img src="/img/ico_network.svg" class="titleicon" alt="Icon">P2P Network</h2>
|
||||||
<p><a href="/en/developer-guide#p2p-network">P2P Network Guide</a></p>
|
<p><a href="/en/developer-guide#p2p-network">P2P Network Guide</a></p>
|
||||||
|
<p><a href="/en/developer-reference#p2p-network">P2P Network Reference</a></p>
|
||||||
|
<p><a href="/en/developer-examples#p2p-network">P2P Network Examples</a></p>
|
||||||
<div class="resourcesext">
|
<div class="resourcesext">
|
||||||
<p><a href="https://en.bitcoin.it/wiki/Protocol_specification">Full Protocol Specification</a> - Wiki</p>
|
<p><a href="https://en.bitcoin.it/wiki/Protocol_specification">Full Protocol Specification</a> - Wiki</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -30,6 +30,8 @@ title: "Developer Examples - Bitcoin"
|
||||||
|
|
||||||
{% include example_payment_processing.md %}
|
{% include example_payment_processing.md %}
|
||||||
|
|
||||||
|
{% include example_p2p_networking.md %}
|
||||||
|
|
||||||
{% include references.md %}
|
{% include references.md %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -30,6 +30,8 @@ title: "Developer Reference - Bitcoin"
|
||||||
|
|
||||||
{% include ref_wallets.md %}
|
{% include ref_wallets.md %}
|
||||||
|
|
||||||
|
{% include ref_p2p_networking.md %}
|
||||||
|
|
||||||
## Bitcoin Core APIs
|
## Bitcoin Core APIs
|
||||||
|
|
||||||
<!-- TODO, Relevant links:
|
<!-- TODO, Relevant links:
|
||||||
|
|
BIN
img/dev/animated-en-merkleblock-creation.gif
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
img/dev/animated-en-merkleblock-parsing.gif
Normal file
After Width: | Height: | Size: 14 KiB |
36
img/dev/en-p2p-data-messages.dot
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
digraph {
|
||||||
|
|
||||||
|
size="6.25";
|
||||||
|
rankdir=LR
|
||||||
|
nodesep=0.05;
|
||||||
|
ranksep=0.1;
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans", dir="none" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
|
||||||
|
getblocks -> inv;
|
||||||
|
mempool -> inv;
|
||||||
|
|
||||||
|
inv -> getdata;
|
||||||
|
|
||||||
|
getdata -> tx;
|
||||||
|
getdata -> block;
|
||||||
|
getdata -> merkleblock;
|
||||||
|
getdata -> notfound;
|
||||||
|
|
||||||
|
getheaders -> headers [ minlen = 3 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
label1 [ label = "Request For Help\nGetting Up To Date" ];
|
||||||
|
label2 [ label = "Reply With\nInventory" ];
|
||||||
|
label3 [ label = "Request For Specific Data" ];
|
||||||
|
label4 [ label = "Reply With\nRequested Data" ];
|
||||||
|
|
||||||
|
label1 -> label2 -> label3 -> label4 [style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
label = "Overview Of P2P Protocol Data Request And Reply Messages"
|
||||||
|
}
|
BIN
img/dev/en-p2p-data-messages.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
118
img/dev/en-p2p-data-messages.svg
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: _anonymous_0 Pages: 1 -->
|
||||||
|
<svg width="450pt" height="208pt"
|
||||||
|
viewBox="0.00 0.00 450.00 207.63" 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)">
|
||||||
|
<title>_anonymous_0</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-271 593,-271 593,5 -4,5"/>
|
||||||
|
<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>
|
||||||
|
<!-- getblocks -->
|
||||||
|
<g id="node1" 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"/>
|
||||||
|
<text text-anchor="middle" x="76" y="-118.9" font-family="Sans" font-size="14.00">getblocks</text>
|
||||||
|
</g>
|
||||||
|
<!-- inv -->
|
||||||
|
<g id="node3" 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"/>
|
||||||
|
<text text-anchor="middle" x="206" y="-98.9" font-family="Sans" font-size="14.00">inv</text>
|
||||||
|
</g>
|
||||||
|
<!-- getblocks->inv -->
|
||||||
|
<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"/>
|
||||||
|
</g>
|
||||||
|
<!-- getdata -->
|
||||||
|
<g id="node7" 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"/>
|
||||||
|
<text text-anchor="middle" x="356" y="-98.9" font-family="Sans" font-size="14.00">getdata</text>
|
||||||
|
</g>
|
||||||
|
<!-- inv->getdata -->
|
||||||
|
<g id="edge6" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- mempool -->
|
||||||
|
<g id="node4" 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"/>
|
||||||
|
<text text-anchor="middle" x="76" y="-78.9" font-family="Sans" font-size="14.00">mempool</text>
|
||||||
|
</g>
|
||||||
|
<!-- mempool->inv -->
|
||||||
|
<g id="edge4" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- tx -->
|
||||||
|
<g id="node9" 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"/>
|
||||||
|
<text text-anchor="middle" x="524" y="-158.9" font-family="Sans" font-size="14.00">tx</text>
|
||||||
|
</g>
|
||||||
|
<!-- getdata->tx -->
|
||||||
|
<g id="edge8" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- block -->
|
||||||
|
<g id="node11" 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"/>
|
||||||
|
<text text-anchor="middle" x="524" y="-118.9" font-family="Sans" font-size="14.00">block</text>
|
||||||
|
</g>
|
||||||
|
<!-- getdata->block -->
|
||||||
|
<g id="edge10" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- merkleblock -->
|
||||||
|
<g id="node13" 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"/>
|
||||||
|
<text text-anchor="middle" x="524" y="-78.9" font-family="Sans" font-size="14.00">merkleblock</text>
|
||||||
|
</g>
|
||||||
|
<!-- getdata->merkleblock -->
|
||||||
|
<g id="edge12" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- notfound -->
|
||||||
|
<g id="node15" 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"/>
|
||||||
|
<text text-anchor="middle" x="524" y="-38.9" font-family="Sans" font-size="14.00">notfound</text>
|
||||||
|
</g>
|
||||||
|
<!-- getdata->notfound -->
|
||||||
|
<g id="edge14" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- getheaders -->
|
||||||
|
<g id="node16" 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"/>
|
||||||
|
<text text-anchor="middle" x="76" y="-198.9" font-family="Sans" font-size="14.00">getheaders</text>
|
||||||
|
</g>
|
||||||
|
<!-- headers -->
|
||||||
|
<g id="node18" 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"/>
|
||||||
|
<text text-anchor="middle" x="524" y="-198.9" font-family="Sans" font-size="14.00">headers</text>
|
||||||
|
</g>
|
||||||
|
<!-- getheaders->headers -->
|
||||||
|
<g id="edge16" 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"/>
|
||||||
|
</g>
|
||||||
|
<!-- label1 -->
|
||||||
|
<g id="node20" 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="76" y="-233.4" font-family="Sans" font-size="14.00">Getting Up To Date</text>
|
||||||
|
</g>
|
||||||
|
<!-- label2 -->
|
||||||
|
<g id="node21" 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="206" y="-233.4" font-family="Sans" font-size="14.00">Inventory</text>
|
||||||
|
</g>
|
||||||
|
<!-- label1->label2 -->
|
||||||
|
<!-- label3 -->
|
||||||
|
<g id="node22" 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>
|
||||||
|
</g>
|
||||||
|
<!-- label2->label3 -->
|
||||||
|
<!-- label4 -->
|
||||||
|
<g id="node23" 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="524" y="-233.4" font-family="Sans" font-size="14.00">Requested Data</text>
|
||||||
|
</g>
|
||||||
|
<!-- label3->label4 -->
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.3 KiB |
31
img/dev/gifs/README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Some Animated GIF Hints
|
||||||
|
|
||||||
|
An excellent set of background information can be found here:
|
||||||
|
|
||||||
|
http://www.imagemagick.org/Usage/anim_basics/
|
||||||
|
|
||||||
|
1. Create source images. GraphViz supports direct GIF output, but its
|
||||||
|
white background is not-quite-white and its transparent backgroud is
|
||||||
|
hideous---so we output to PNG and then convert to GIF.
|
||||||
|
|
||||||
|
for f in *dot ; do dot -o ${f/.dot}.png -T png $f ; done
|
||||||
|
|
||||||
|
2. Create animated GIF using ImageMagick. Manually prefix first frame
|
||||||
|
and suffix last frame to provide a brief pause in the animation on
|
||||||
|
those frames. This wastes space but the optimization removes all of
|
||||||
|
that wasted space except for 3 bytes.
|
||||||
|
|
||||||
|
convert -delay 100 \
|
||||||
|
en-merkleblock-parsing-001.gif \
|
||||||
|
*gif \
|
||||||
|
en-merkleblock-parsing-011.gif \
|
||||||
|
-loop 0 \
|
||||||
|
animated-en-merkleblock-parsing.gif
|
||||||
|
|
||||||
|
3. Compress animated GIF (118 KB -> 15 KB in this example). You may need
|
||||||
|
to play with color settings; 8 worked in this example but 4 was too
|
||||||
|
few. Fewer colors (base-2) results in much better compression.
|
||||||
|
|
||||||
|
gifsicle -b -O3 --colors 8 --no-background \
|
||||||
|
animated-en-merkleblock-parsing.gif
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0" ];
|
||||||
|
flag1 [ label = "1" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5" ];
|
||||||
|
D [ label = "H4" ];
|
||||||
|
C [ label = "H3" ];
|
||||||
|
B [ label = "H2" ];
|
||||||
|
A [ label = "H1" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "H8" ];
|
||||||
|
CD [ label = "H9" ];
|
||||||
|
EF [ label = "H10" ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12" ];
|
||||||
|
EFG2 [ label = "H13" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT;
|
||||||
|
EFG2 -> ROOT;
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, style = "invis" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "H14" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0" ];
|
||||||
|
flag1 [ label = "1" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4 ];
|
||||||
|
D [ label = "H4" ];
|
||||||
|
C [ label = "H3" ];
|
||||||
|
B [ label = "H2" ];
|
||||||
|
A [ label = "H1" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "H8" ];
|
||||||
|
CD [ label = "H9" ];
|
||||||
|
EF [ label = "H10", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12" ];
|
||||||
|
EFG2 [ label = "H13", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT;
|
||||||
|
EFG2 -> ROOT;
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, style = "invis" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "H14", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0" ];
|
||||||
|
flag1 [ label = "1", style = "filled" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4 ];
|
||||||
|
D [ label = "H4" ];
|
||||||
|
C [ label = "H3" ];
|
||||||
|
B [ label = "H2" ];
|
||||||
|
A [ label = "H1" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "H8" ];
|
||||||
|
CD [ label = "H9" ];
|
||||||
|
EF [ label = "H10", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12" ];
|
||||||
|
EFG2 [ label = "H13", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT;
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, style = "invis" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4, style = "filled" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0", style = "filled" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H12", style = "filled" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4 ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "H10", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals,filled" ];
|
||||||
|
EFG2 [ label = "H13", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1", style = "filled" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4 ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "H10", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4, style = "filled" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1", style = "filled" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4 ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "↓", penwidth = 4, style = "filled" ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1", style = "filled" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H5", style = "filled" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals,filled" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "↓", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0", style = "filled" ];
|
||||||
|
flag5 [ label = "1", style = "" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H6", style = "filled" ];
|
||||||
|
hash2 [ label = "H5", style = "" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6", style = "diagonals,filled" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "↓", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0", style = "" ];
|
||||||
|
flag5 [ label = "1", style = "" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H6", style = "" ];
|
||||||
|
hash2 [ label = "H5", style = "" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "H7" ];
|
||||||
|
F [ label = "H6", style = "diagonals" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "", penwidth = 4, style = "filled" ];
|
||||||
|
G2 [ label = "H11" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "filled" ];
|
||||||
|
flag6 [ label = "0", style = "" ];
|
||||||
|
flag5 [ label = "1", style = "" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H11", style = "filled" ];
|
||||||
|
hash3 [ label = "H6", style = "" ];
|
||||||
|
hash2 [ label = "H5", style = "" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "" ];
|
||||||
|
F [ label = "H6", style = "diagonals" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11", style = "diagonals,filled" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "" ];
|
||||||
|
flag6 [ label = "0", style = "" ];
|
||||||
|
flag5 [ label = "1", style = "" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H11", style = "" ];
|
||||||
|
hash3 [ label = "H6", style = "" ];
|
||||||
|
hash2 [ label = "H5", style = "" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "" ];
|
||||||
|
F [ label = "H6", style = "diagonals" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11", style = "diagonals" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "", penwidth = 4, style = "filled" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ROOT [ label = "↓", penwidth = 4 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.07
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "" ];
|
||||||
|
flag6 [ label = "0", style = "" ];
|
||||||
|
flag5 [ label = "1", style = "" ];
|
||||||
|
flag4 [ label = "1", style = "" ];
|
||||||
|
flag3 [ label = "1", style = "" ];
|
||||||
|
flag2 [ label = "0", style = "" ];
|
||||||
|
flag1 [ label = "1", style = "" ];
|
||||||
|
flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none", style = "invis" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H11", style = "" ];
|
||||||
|
hash3 [ label = "H6", style = "" ];
|
||||||
|
hash2 [ label = "H5", style = "" ];
|
||||||
|
hash1 [ label = "H12", style = "" ];
|
||||||
|
hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "Match Or\nMatch\nAncestor" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nOn\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nNot\nNeeded" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4 ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G [ label = "" ];
|
||||||
|
F [ label = "H6", style = "diagonals" ];
|
||||||
|
E [ label = "H5", penwidth = 4, style = "diagonals" ];
|
||||||
|
D [ label = "" ];
|
||||||
|
C [ label = "" ];
|
||||||
|
B [ label = "" ];
|
||||||
|
A [ label = "" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB [ label = "" ];
|
||||||
|
CD [ label = "" ];
|
||||||
|
EF [ label = "", penwidth = 4 ];
|
||||||
|
G2 [ label = "H11", style = "diagonals" ];
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD [ label = "H12", style = "diagonals" ];
|
||||||
|
EFG2 [ label = "", penwidth = 4, ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ROOT [ label = "", penwidth = 4, style = "filled" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0" ];
|
||||||
|
flag1 [ label = "1" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E;
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT;
|
||||||
|
EFG2 -> ROOT;
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, style = "invis" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 5.8 KiB |
|
@ -0,0 +1,288 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<g id="node6" class="node"><title>flag4</title>
|
||||||
|
<text text-anchor="middle" x="201" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag3 -->
|
||||||
|
<g id="node7" class="node"><title>flag3</title>
|
||||||
|
<text text-anchor="middle" x="168" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag2 -->
|
||||||
|
<g id="node8" class="node"><title>flag2</title>
|
||||||
|
<text text-anchor="middle" x="135" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag1 -->
|
||||||
|
<g id="node9" class="node"><title>flag1</title>
|
||||||
|
<text text-anchor="middle" x="102" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<g id="node15" class="node"><title>hash1</title>
|
||||||
|
<text text-anchor="middle" x="124" y="-198.9" font-family="Sans" font-size="14.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node62" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node59" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M685.187,-71.2222C678.23,-79.5078 670.307,-89.2936 663.828,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M641.83,-71.2222C642.897,-79.5078 644.448,-89.2936 646.012,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node56" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node53" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node71" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node74" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.136,-134.026C648.621,-148.958 648.621,-170.072 649.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node81" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M564.299,-221.027C569.834,-227.294 576.236,-234.327 582.136,-240.622"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M632.786,-221.027C627.018,-227.294 620.735,-234.327 615.281,-240.622"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,140 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0" ];
|
||||||
|
flag1 [ label = "1", style = "filled" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E;
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
ROOT [ style = "filled", label = "↓" ]
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT;
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, style = "invis" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,291 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<g id="node6" class="node"><title>flag4</title>
|
||||||
|
<text text-anchor="middle" x="201" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag3 -->
|
||||||
|
<g id="node7" class="node"><title>flag3</title>
|
||||||
|
<text text-anchor="middle" x="168" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag2 -->
|
||||||
|
<g id="node8" class="node"><title>flag2</title>
|
||||||
|
<text text-anchor="middle" x="135" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag1 -->
|
||||||
|
<g id="node9" class="node"><title>flag1</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="115,-271.5 89,-271.5 89,-246.5 115,-246.5 115,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="102" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<g id="node15" class="node"><title>hash1</title>
|
||||||
|
<text text-anchor="middle" x="124" y="-198.9" font-family="Sans" font-size="14.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node63" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node60" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M685.187,-71.2222C678.23,-79.5078 670.307,-89.2936 663.828,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M641.83,-71.2222C642.897,-79.5078 644.448,-89.2936 646.012,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node57" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node54" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node52" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node72" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node75" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.136,-134.026C648.621,-148.958 648.621,-170.072 649.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M632.786,-221.027C627.018,-227.294 620.735,-234.327 615.281,-240.622"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,141 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1" ];
|
||||||
|
flag2 [ label = "0", style = "filled" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1", style = "filled" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E;
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
ABCD [ style = "filled,diagonals", label = "H1" ]
|
||||||
|
ROOT [ label = "↓" ]
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2;
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.2 KiB |
|
@ -0,0 +1,299 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<g id="node6" class="node"><title>flag4</title>
|
||||||
|
<text text-anchor="middle" x="201" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag3 -->
|
||||||
|
<g id="node7" class="node"><title>flag3</title>
|
||||||
|
<text text-anchor="middle" x="168" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag2 -->
|
||||||
|
<g id="node8" class="node"><title>flag2</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="148,-271.5 122,-271.5 122,-246.5 148,-246.5 148,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="135" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<g id="node15" class="node"><title>hash1</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="151,-221 97,-221 97,-185 151,-185 151,-221"/>
|
||||||
|
<text text-anchor="middle" x="124" y="-198.9" font-family="Sans" font-size="14.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node64" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node61" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M685.187,-71.2222C678.23,-79.5078 670.307,-89.2936 663.828,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M641.83,-71.2222C642.897,-79.5078 644.448,-89.2936 646.012,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node58" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node55" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node52" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node53" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node75" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.136,-134.026C648.621,-148.958 648.621,-170.072 649.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,142 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1" ];
|
||||||
|
flag3 [ label = "1", style = "filled" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E;
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
EFG2 [ style = "filled", label = "↓" ]
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ]
|
||||||
|
ROOT [ label = "↓" ]
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF;
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.2 KiB |
|
@ -0,0 +1,294 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<g id="node6" class="node"><title>flag4</title>
|
||||||
|
<text text-anchor="middle" x="201" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag3 -->
|
||||||
|
<g id="node7" class="node"><title>flag3</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="181,-271.5 155,-271.5 155,-246.5 181,-246.5 181,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="168" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node65" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node62" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M685.187,-71.2222C678.23,-79.5078 670.307,-89.2936 663.828,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M641.83,-71.2222C642.897,-79.5078 644.448,-89.2936 646.012,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node59" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node56" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node52" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node54" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node53" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,140 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1" ];
|
||||||
|
flag4 [ label = "1", style = "filled" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E;
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
EF [ style = "filled", label = "↓" ];
|
||||||
|
EFG2 [ label = "↓" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF;
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, style = "invis" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.2 KiB |
|
@ -0,0 +1,293 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<g id="node6" class="node"><title>flag4</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="214,-271.5 188,-271.5 188,-246.5 214,-246.5 214,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="201" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node65" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node52" class="node"><title>EF</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M685.187,-71.2222C678.23,-79.5078 670.307,-89.2936 663.828,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node60" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node57" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node53" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node55" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node54" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,140 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0" ];
|
||||||
|
flag5 [ label = "1", style = "filled" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3" ];
|
||||||
|
hash2 [ label = "H2", style = "filled" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F;
|
||||||
|
E [ penwidth = 4, style = "filled,diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
EF [ label = "↓" ];
|
||||||
|
EFG2 [ label = "↓" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, style = "invis" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.5 KiB |
|
@ -0,0 +1,301 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<g id="node5" class="node"><title>flag5</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="247,-271.5 221,-271.5 221,-246.5 247,-246.5 247,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="234" y="-254.9" font-family="Sans" font-size="14.00">1</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag4 -->
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<g id="node14" class="node"><title>hash2</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="212,-221 158,-221 158,-185 212,-185 212,-221"/>
|
||||||
|
<text text-anchor="middle" x="185" y="-198.9" font-family="Sans" font-size="14.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node65" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node52" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M678.799,-78.9203C673.653,-85.1878 668.383,-91.7597 663.828,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="681.494,-81.1528 685.187,-71.2222 676.107,-76.6826 681.494,-81.1528"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="4" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="626,-71 614,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="614,-47 626,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="656,-35 668,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="668,-59 656,-71 "/>
|
||||||
|
<text text-anchor="middle" x="641" y="-48.1" font-family="Sans" font-size="16.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node60" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node57" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<!-- EF->E -->
|
||||||
|
<g id="edge50" class="edge"><title>EF->E</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.444,-87.3665C648.615,-81.8774 647.645,-76.2713 646.642,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.02,-88.1634 650.836,-97.6005 652.956,-87.22 646.02,-88.1634"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node53" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node55" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node54" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,140 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0", style = "filled" ];
|
||||||
|
flag5 [ label = "1", style = "invis" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3", style = "filled" ];
|
||||||
|
hash2 [ label = "H2", style = "invis" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F [ style = "filled,diagonals" label = "H3" ];
|
||||||
|
E [ penwidth = 4, style = "diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
EF [ label = "↓" ];
|
||||||
|
EFG2 [ label = "↓" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2;
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.8 KiB |
|
@ -0,0 +1,304 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<g id="node4" class="node"><title>flag6</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="280,-271.5 254,-271.5 254,-246.5 280,-246.5 280,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="267" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag5 -->
|
||||||
|
<!-- flag4 -->
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<g id="node13" class="node"><title>hash3</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="273,-221 219,-221 219,-185 273,-185 273,-221"/>
|
||||||
|
<text text-anchor="middle" x="246" y="-198.9" font-family="Sans" font-size="14.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash2 -->
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node65" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="687,-71 675,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="675,-47 687,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-35 729,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="729,-59 717,-71 "/>
|
||||||
|
<text text-anchor="middle" x="702" y="-48.1" font-family="Sans" font-size="16.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node52" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M678.799,-78.9203C673.653,-85.1878 668.383,-91.7597 663.828,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="681.494,-81.1528 685.187,-71.2222 676.107,-76.6826 681.494,-81.1528"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="626,-71 614,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="614,-47 626,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="656,-35 668,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="668,-59 656,-71 "/>
|
||||||
|
<text text-anchor="middle" x="641" y="-48.1" font-family="Sans" font-size="16.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node60" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node57" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<g id="edge52" class="edge"><title>EF->F</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M675.098,-89.8891C680.269,-83.6155 685.515,-77.048 689.998,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="672.38,-87.6835 668.651,-97.6005 677.75,-92.1733 672.38,-87.6835"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->E -->
|
||||||
|
<g id="edge50" class="edge"><title>EF->E</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.444,-87.3665C648.615,-81.8774 647.645,-76.2713 646.642,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.02,-88.1634 650.836,-97.6005 652.956,-87.22 646.02,-88.1634"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node53" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node55" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node54" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M713.353,-134.026C698.936,-148.958 679.279,-170.072 665.898,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,140 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0" ];
|
||||||
|
flag6 [ label = "0", style = "invis" ];
|
||||||
|
flag5 [ label = "1", style = "invis" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4" ];
|
||||||
|
hash3 [ label = "H3", style = "invis" ];
|
||||||
|
hash2 [ label = "H2", style = "invis" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F [ style = "diagonals", label = "H3" ];
|
||||||
|
E [ penwidth = 4, style = "diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
EF [ label = "H()", style = "filled" ];
|
||||||
|
EFG2 [ label = "↓" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 6.8 KiB |
|
@ -0,0 +1,301 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<!-- flag5 -->
|
||||||
|
<!-- flag4 -->
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<!-- hash2 -->
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node65" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="687,-71 675,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="675,-47 687,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-35 729,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="729,-59 717,-71 "/>
|
||||||
|
<text text-anchor="middle" x="702" y="-48.1" font-family="Sans" font-size="16.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node52" class="node"><title>EF</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M678.799,-78.9203C673.653,-85.1878 668.383,-91.7597 663.828,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="681.494,-81.1528 685.187,-71.2222 676.107,-76.6826 681.494,-81.1528"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="626,-71 614,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="614,-47 626,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="656,-35 668,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="668,-59 656,-71 "/>
|
||||||
|
<text text-anchor="middle" x="641" y="-48.1" font-family="Sans" font-size="16.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node60" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node57" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<g id="edge52" class="edge"><title>EF->F</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M675.098,-89.8891C680.269,-83.6155 685.515,-77.048 689.998,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="672.38,-87.6835 668.651,-97.6005 677.75,-92.1733 672.38,-87.6835"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->E -->
|
||||||
|
<g id="edge50" class="edge"><title>EF->E</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.444,-87.3665C648.615,-81.8774 647.645,-76.2713 646.642,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.02,-88.1634 650.836,-97.6005 652.956,-87.22 646.02,-88.1634"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node53" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<g id="edge68" class="edge"><title>EFG2->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M653.828,-174.842C654.141,-161.439 654.027,-145.808 653.486,-134.026"/>
|
||||||
|
<polygon fill="black" stroke="black" points="650.324,-174.884 653.485,-184.997 657.32,-175.121 650.324,-174.884"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node55" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node54" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M706.255,-141.431C692.947,-155.405 677.188,-172.404 665.898,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="708.959,-143.668 713.353,-134.026 703.906,-138.824 708.959,-143.668"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,141 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "filled" ];
|
||||||
|
flag6 [ label = "0", style = "invis" ];
|
||||||
|
flag5 [ label = "1", style = "invis" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4", style = "filled" ];
|
||||||
|
hash3 [ label = "H3", style = "invis" ];
|
||||||
|
hash2 [ label = "H2", style = "invis" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F [ style = "diagonals", label = "H3" ];
|
||||||
|
E [ penwidth = 4, style = "diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
G2 [ label = "H4", style = "filled,diagonals" ];
|
||||||
|
EF [ label = "H()", ];
|
||||||
|
EFG2 [ label = "↓" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 7.2 KiB |
|
@ -0,0 +1,312 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<g id="node3" class="node"><title>flag7</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="313,-271.5 287,-271.5 287,-246.5 313,-246.5 313,-271.5"/>
|
||||||
|
<text text-anchor="middle" x="300" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag6 -->
|
||||||
|
<!-- flag5 -->
|
||||||
|
<!-- flag4 -->
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<g id="node12" class="node"><title>hash4</title>
|
||||||
|
<polygon fill="lightgrey" stroke="lightgrey" stroke-width="1.75" points="334,-221 280,-221 280,-185 334,-185 334,-221"/>
|
||||||
|
<text text-anchor="middle" x="307" y="-198.9" font-family="Sans" font-size="14.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash3 -->
|
||||||
|
<!-- hash2 -->
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node52" class="node"><title>G2</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-134 705,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="705,-110 717,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="747,-98 759,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="759,-122 747,-134 "/>
|
||||||
|
<text text-anchor="middle" x="732" y="-111.1" font-family="Sans" font-size="16.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="687,-71 675,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="675,-47 687,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-35 729,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="729,-59 717,-71 "/>
|
||||||
|
<text text-anchor="middle" x="702" y="-48.1" font-family="Sans" font-size="16.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node53" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M678.799,-78.9203C673.653,-85.1878 668.383,-91.7597 663.828,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="681.494,-81.1528 685.187,-71.2222 676.107,-76.6826 681.494,-81.1528"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="626,-71 614,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="614,-47 626,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="656,-35 668,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="668,-59 656,-71 "/>
|
||||||
|
<text text-anchor="middle" x="641" y="-48.1" font-family="Sans" font-size="16.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node61" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node58" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node54" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M706.255,-141.431C692.947,-155.405 677.188,-172.404 665.898,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="708.959,-143.668 713.353,-134.026 703.906,-138.824 708.959,-143.668"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<g id="edge52" class="edge"><title>EF->F</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M675.098,-89.8891C680.269,-83.6155 685.515,-77.048 689.998,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="672.38,-87.6835 668.651,-97.6005 677.75,-92.1733 672.38,-87.6835"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->E -->
|
||||||
|
<g id="edge50" class="edge"><title>EF->E</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.444,-87.3665C648.615,-81.8774 647.645,-76.2713 646.642,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.02,-88.1634 650.836,-97.6005 652.956,-87.22 646.02,-88.1634"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<g id="edge70" class="edge"><title>EFG2->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M677.41,-177.594C690.815,-163.625 706.552,-146.625 717.702,-134.026"/>
|
||||||
|
<polygon fill="black" stroke="black" points="674.685,-175.377 670.246,-184.997 679.716,-180.245 674.685,-175.377"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<g id="edge68" class="edge"><title>EFG2->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M653.828,-174.842C654.141,-161.439 654.027,-145.808 653.486,-134.026"/>
|
||||||
|
<polygon fill="black" stroke="black" points="650.324,-174.884 653.485,-184.997 657.32,-175.121 650.324,-174.884"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node56" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node55" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,141 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "invis" ];
|
||||||
|
flag6 [ label = "0", style = "invis" ];
|
||||||
|
flag5 [ label = "1", style = "invis" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4", style = "invis" ];
|
||||||
|
hash3 [ label = "H3", style = "invis" ];
|
||||||
|
hash2 [ label = "H2", style = "invis" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F [ style = "diagonals", label = "H3" ];
|
||||||
|
E [ penwidth = 4, style = "diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
G2 [ label = "H4", style = "diagonals" ];
|
||||||
|
EF [ label = "H()" ];
|
||||||
|
EFG2 [ label = "H()", style = "filled" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "↓" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
digraph merkleblock {
|
||||||
|
|
||||||
|
//size="6.25,2.22";
|
||||||
|
size="6.25";
|
||||||
|
rankdir=BT
|
||||||
|
nodesep=0.1
|
||||||
|
splines="false"
|
||||||
|
|
||||||
|
edge [ penwidth = 1.75, fontname="Sans" ]
|
||||||
|
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
|
||||||
|
graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ]
|
||||||
|
|
||||||
|
subgraph cluster_flags {
|
||||||
|
node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
flag8 [ label = "0" ];
|
||||||
|
flag7 [ label = "0", style = "invis" ];
|
||||||
|
flag6 [ label = "0", style = "invis" ];
|
||||||
|
flag5 [ label = "1", style = "invis" ];
|
||||||
|
flag4 [ label = "1", style = "invis" ];
|
||||||
|
flag3 [ label = "1", style = "invis" ];
|
||||||
|
flag2 [ label = "0", style = "invis" ];
|
||||||
|
flag1 [ label = "1", style = "invis" ];
|
||||||
|
flag_label [ label = "Flags", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_hashes {
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
node [ shape = "none" ];
|
||||||
|
|
||||||
|
hash4 [ label = "H4", style = "invis" ];
|
||||||
|
hash3 [ label = "H3", style = "invis" ];
|
||||||
|
hash2 [ label = "H2", style = "invis" ];
|
||||||
|
hash1 [ label = "H1", style = "invis" ];
|
||||||
|
hash_label [ label = "Hashes", shape = "none", fontsize = 16 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_label -> flag_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_legend {
|
||||||
|
node [ label = "", fontsize = 18 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
edge [ style = "invis" ];
|
||||||
|
ranksep = 3;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
node [ shape = "none" ];
|
||||||
|
matched_filter_label [ label = "TXID\nFilter\nMatch" ];
|
||||||
|
hash_from_list_label [ label = "Hash\nFrom\nList" ];
|
||||||
|
hash_computed_label [ label = "Hash\nCom-\nputed" ];
|
||||||
|
waiting_label [ label = "Wait\nFor\nChild" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ];
|
||||||
|
hash_from_list [ label = "H1", style = "diagonals" ];
|
||||||
|
hash_computed [ label = "H()" ];
|
||||||
|
waiting [ label = "↓" ];
|
||||||
|
|
||||||
|
pre_legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
legend_label [ label = "", style = "invis", width=0, height=0 ];
|
||||||
|
pre_legend_label -> legend_label [ style = "invis" ];
|
||||||
|
|
||||||
|
waiting_label -> waiting;
|
||||||
|
hash_from_list_label -> hash_from_list;
|
||||||
|
hash_computed_label -> hash_computed;
|
||||||
|
matched_filter_label -> matched_filter;
|
||||||
|
|
||||||
|
labelloc = b;
|
||||||
|
label = "Legend"
|
||||||
|
}
|
||||||
|
|
||||||
|
legend_label -> hash_label [ style = "invis" ];
|
||||||
|
|
||||||
|
subgraph cluster_tree {
|
||||||
|
edge [ dir = "none" ];
|
||||||
|
node [ label = "", fontsize = 16 ];
|
||||||
|
graph [ penwidth = 0 ];
|
||||||
|
|
||||||
|
{
|
||||||
|
root_row [ shape = "none" ];
|
||||||
|
row1 [ shape = "none", label = "Non-TXID\nNodes" ];
|
||||||
|
row2 [ shape = "none", style = "invis", width = 1.2 ];
|
||||||
|
txid_row [ label = "TXID\nNodes", shape = "none" ];
|
||||||
|
|
||||||
|
row2 -> row1 [ dir = "back" ];
|
||||||
|
row1 -> root_row [ dir = ""];
|
||||||
|
txid_row -> row2 [ style = "invis" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
G;
|
||||||
|
F [ style = "diagonals", label = "H3" ];
|
||||||
|
E [ penwidth = 4, style = "diagonals", label = "H2" ];
|
||||||
|
D;
|
||||||
|
C;
|
||||||
|
B;
|
||||||
|
A;
|
||||||
|
|
||||||
|
G2 [ label = "H4", style = "diagonals" ];
|
||||||
|
EF [ label = "H()", ];
|
||||||
|
EFG2 [ label = "H()" ];
|
||||||
|
ABCD [ style = "diagonals", label = "H1" ];
|
||||||
|
ROOT [ label = "H()", style = "filled" ];
|
||||||
|
|
||||||
|
A -> AB;
|
||||||
|
B -> AB;
|
||||||
|
C -> CD;
|
||||||
|
D -> CD;
|
||||||
|
E -> EF [ dir = "back" ];
|
||||||
|
F -> EF [ dir = "back" ];
|
||||||
|
G -> G2;
|
||||||
|
|
||||||
|
AB -> A [ constraint = false, style = "invis" ];
|
||||||
|
AB -> B [ constraint = false, style = "invis" ];
|
||||||
|
CD -> C [ constraint = false, style = "invis" ];
|
||||||
|
CD -> D [ constraint = false, style = "invis" ];
|
||||||
|
EF -> E [ constraint = false, dir = "back" ];
|
||||||
|
EF -> F [ constraint = false, dir = "back" ];
|
||||||
|
G2 -> G [ constraint = false, style = "invis" ];
|
||||||
|
|
||||||
|
AB -> ABCD;
|
||||||
|
CD -> ABCD;
|
||||||
|
EF -> EFG2 [ dir = "back" ];
|
||||||
|
G2 -> EFG2 [ dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> AB [ constraint = false, style = "invis" ];
|
||||||
|
ABCD -> CD [ constraint = false, style = "invis" ];
|
||||||
|
EFG2 -> EF [ constraint = false, dir = "back" ];
|
||||||
|
EFG2 -> G2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
ABCD -> ROOT [ dir = "back" ];
|
||||||
|
EFG2 -> ROOT [ dir = "back" ];
|
||||||
|
|
||||||
|
ROOT -> ABCD [ constraint = false, dir = "back" ];
|
||||||
|
ROOT -> EFG2 [ constraint = false, dir = "back" ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//label = "Parsing A MerkleBlock Message"
|
||||||
|
}
|
After Width: | Height: | Size: 7.1 KiB |
|
@ -0,0 +1,308 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
|
-->
|
||||||
|
<!-- Title: merkleblock Pages: 1 -->
|
||||||
|
<svg width="450pt" height="153pt"
|
||||||
|
viewBox="0.00 0.00 450.00 152.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph1" class="graph" transform="scale(0.507328 0.507328) rotate(0) translate(4 297)">
|
||||||
|
<title>merkleblock</title>
|
||||||
|
<polygon fill="white" stroke="white" points="-4,5 -4,-297 884,-297 884,5 -4,5"/>
|
||||||
|
<g id="graph2" class="cluster"><title>cluster_flags</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="16,-237 16,-281 354,-281 354,-237 16,-237"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph3" class="cluster"><title>cluster_hashes</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="8,-177 8,-229 342,-229 342,-177 8,-177"/>
|
||||||
|
</g>
|
||||||
|
<g id="graph4" class="cluster"><title>cluster_legend</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="45,-8 45,-169 349,-169 349,-8 45,-8"/>
|
||||||
|
<text text-anchor="middle" x="197" y="-150.6" font-family="Sans" font-size="16.00">Legend</text>
|
||||||
|
</g>
|
||||||
|
<g id="graph6" class="cluster"><title>cluster_tree</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="0" points="362,-22 362,-285 871,-285 871,-22 362,-22"/>
|
||||||
|
</g>
|
||||||
|
<!-- flag8 -->
|
||||||
|
<g id="node2" class="node"><title>flag8</title>
|
||||||
|
<text text-anchor="middle" x="333" y="-254.9" font-family="Sans" font-size="14.00">0</text>
|
||||||
|
</g>
|
||||||
|
<!-- flag7 -->
|
||||||
|
<!-- flag6 -->
|
||||||
|
<!-- flag5 -->
|
||||||
|
<!-- flag4 -->
|
||||||
|
<!-- flag3 -->
|
||||||
|
<!-- flag2 -->
|
||||||
|
<!-- flag1 -->
|
||||||
|
<!-- flag_label -->
|
||||||
|
<g id="node10" class="node"><title>flag_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-254.1" font-family="Sans" font-size="16.00">Flags</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash4 -->
|
||||||
|
<!-- hash3 -->
|
||||||
|
<!-- hash2 -->
|
||||||
|
<!-- hash1 -->
|
||||||
|
<!-- hash_label -->
|
||||||
|
<g id="node16" class="node"><title>hash_label</title>
|
||||||
|
<text text-anchor="middle" x="53" y="-198.1" font-family="Sans" font-size="16.00">Hashes</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_label->flag_label -->
|
||||||
|
<!-- matched_filter_label -->
|
||||||
|
<g id="node20" class="node"><title>matched_filter_label</title>
|
||||||
|
<text text-anchor="middle" x="306" y="-69.8" font-family="Sans" font-size="18.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-47.8" font-family="Sans" font-size="18.00">Filter</text>
|
||||||
|
<text text-anchor="middle" x="306" y="-25.8" font-family="Sans" font-size="18.00">Match</text>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter -->
|
||||||
|
<g id="node24" class="node"><title>matched_filter</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="333,-134 279,-134 279,-98 333,-98 333,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="291,-134 279,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="279,-110 291,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="321,-98 333,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="333,-122 321,-134 "/>
|
||||||
|
</g>
|
||||||
|
<!-- matched_filter_label->matched_filter -->
|
||||||
|
<!-- hash_from_list_label -->
|
||||||
|
<g id="node21" class="node"><title>hash_from_list_label</title>
|
||||||
|
<text text-anchor="middle" x="234" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-47.8" font-family="Sans" font-size="18.00">From</text>
|
||||||
|
<text text-anchor="middle" x="234" y="-25.8" font-family="Sans" font-size="18.00">List</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list -->
|
||||||
|
<g id="node25" class="node"><title>hash_from_list</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="261,-134 207,-134 207,-98 261,-98 261,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="219,-134 207,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="207,-110 219,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="249,-98 261,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="261,-122 249,-134 "/>
|
||||||
|
<text text-anchor="middle" x="234" y="-110.8" font-family="Sans" font-size="18.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_from_list_label->hash_from_list -->
|
||||||
|
<!-- hash_computed_label -->
|
||||||
|
<g id="node22" class="node"><title>hash_computed_label</title>
|
||||||
|
<text text-anchor="middle" x="163" y="-69.8" font-family="Sans" font-size="18.00">Hash</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-47.8" font-family="Sans" font-size="18.00">Com-</text>
|
||||||
|
<text text-anchor="middle" x="163" y="-25.8" font-family="Sans" font-size="18.00">puted</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed -->
|
||||||
|
<g id="node26" class="node"><title>hash_computed</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="190,-134 136,-134 136,-98 190,-98 190,-134"/>
|
||||||
|
<text text-anchor="middle" x="163" y="-110.8" font-family="Sans" font-size="18.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- hash_computed_label->hash_computed -->
|
||||||
|
<!-- waiting_label -->
|
||||||
|
<g id="node23" class="node"><title>waiting_label</title>
|
||||||
|
<text text-anchor="middle" x="91" y="-69.8" font-family="Sans" font-size="18.00">Wait</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-47.8" font-family="Sans" font-size="18.00">For</text>
|
||||||
|
<text text-anchor="middle" x="91" y="-25.8" font-family="Sans" font-size="18.00">Child</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting -->
|
||||||
|
<g id="node27" class="node"><title>waiting</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="118,-134 64,-134 64,-98 118,-98 118,-134"/>
|
||||||
|
<text text-anchor="middle" x="91" y="-110.8" font-family="Sans" font-size="18.00">↓</text>
|
||||||
|
</g>
|
||||||
|
<!-- waiting_label->waiting -->
|
||||||
|
<!-- pre_legend_label -->
|
||||||
|
<!-- legend_label -->
|
||||||
|
<!-- pre_legend_label->legend_label -->
|
||||||
|
<!-- legend_label->hash_label -->
|
||||||
|
<!-- root_row -->
|
||||||
|
<g id="node38" class="node"><title>root_row</title>
|
||||||
|
</g>
|
||||||
|
<!-- row1 -->
|
||||||
|
<g id="node39" class="node"><title>row1</title>
|
||||||
|
<text text-anchor="middle" x="818" y="-207.6" font-family="Sans" font-size="16.00">Non-TXID</text>
|
||||||
|
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- row1->root_row -->
|
||||||
|
<g id="edge24" class="edge"><title>row1->root_row</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818,-226.101C818,-227.645 818,-229.209 818,-230.775"/>
|
||||||
|
<polygon fill="black" stroke="black" points="814.5,-230.913 818,-240.913 821.5,-230.913 814.5,-230.913"/>
|
||||||
|
</g>
|
||||||
|
<!-- row2 -->
|
||||||
|
<!-- row2->row1 -->
|
||||||
|
<g id="edge22" class="edge"><title>row2->row1</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M818.674,-144.378C818.542,-155.812 818.393,-168.837 818.268,-179.702"/>
|
||||||
|
<polygon fill="black" stroke="black" points="822.178,-144.066 818.793,-134.026 815.178,-143.986 822.178,-144.066"/>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row -->
|
||||||
|
<g id="node41" class="node"><title>txid_row</title>
|
||||||
|
<text text-anchor="middle" x="830" y="-57.6" font-family="Sans" font-size="16.00">TXID</text>
|
||||||
|
<text text-anchor="middle" x="830" y="-38.6" font-family="Sans" font-size="16.00">Nodes</text>
|
||||||
|
</g>
|
||||||
|
<!-- txid_row->row2 -->
|
||||||
|
<!-- G -->
|
||||||
|
<g id="node45" class="node"><title>G</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="790,-71 736,-71 736,-35 790,-35 790,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2 -->
|
||||||
|
<g id="node52" class="node"><title>G2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="759,-134 705,-134 705,-98 759,-98 759,-134"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-134 705,-122 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="705,-110 717,-98 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="747,-98 759,-110 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="759,-122 747,-134 "/>
|
||||||
|
<text text-anchor="middle" x="732" y="-111.1" font-family="Sans" font-size="16.00">H4</text>
|
||||||
|
</g>
|
||||||
|
<!-- G->G2 -->
|
||||||
|
<g id="edge40" class="edge"><title>G->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M751.972,-71.2222C747.646,-79.5078 742.829,-89.2936 738.986,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- F -->
|
||||||
|
<g id="node46" class="node"><title>F</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="729,-71 675,-71 675,-35 729,-35 729,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="687,-71 675,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="675,-47 687,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="717,-35 729,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="729,-59 717,-71 "/>
|
||||||
|
<text text-anchor="middle" x="702" y="-48.1" font-family="Sans" font-size="16.00">H3</text>
|
||||||
|
</g>
|
||||||
|
<!-- EF -->
|
||||||
|
<g id="node53" class="node"><title>EF</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-134 624,-134 624,-98 678,-98 678,-134"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-111.1" font-family="Sans" font-size="16.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- F->EF -->
|
||||||
|
<g id="edge38" class="edge"><title>F->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M678.799,-78.9203C673.653,-85.1878 668.383,-91.7597 663.828,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="681.494,-81.1528 685.187,-71.2222 676.107,-76.6826 681.494,-81.1528"/>
|
||||||
|
</g>
|
||||||
|
<!-- E -->
|
||||||
|
<g id="node47" class="node"><title>E</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="4" points="668,-71 614,-71 614,-35 668,-35 668,-71"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="626,-71 614,-59 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="614,-47 626,-35 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="656,-35 668,-47 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="4" points="668,-59 656,-71 "/>
|
||||||
|
<text text-anchor="middle" x="641" y="-48.1" font-family="Sans" font-size="16.00">H2</text>
|
||||||
|
</g>
|
||||||
|
<!-- E->EF -->
|
||||||
|
<g id="edge36" class="edge"><title>E->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M643.274,-81.4411C644.111,-86.9273 645.059,-92.5385 646.012,-97.6005"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.695,-80.6343 641.83,-71.2222 639.764,-81.6135 646.695,-80.6343"/>
|
||||||
|
</g>
|
||||||
|
<!-- D -->
|
||||||
|
<g id="node48" class="node"><title>D</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="607,-71 553,-71 553,-35 607,-35 607,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD -->
|
||||||
|
<g id="node61" class="node"><title>CD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-134 523,-134 523,-98 577,-98 577,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- D->CD -->
|
||||||
|
<g id="edge34" class="edge"><title>D->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M569.261,-71.2222C565.066,-79.5078 560.405,-89.2936 556.694,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- C -->
|
||||||
|
<g id="node49" class="node"><title>C</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-71 492,-71 492,-35 546,-35 546,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- C->CD -->
|
||||||
|
<g id="edge32" class="edge"><title>C->CD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M525.904,-71.2222C529.733,-79.5078 534.546,-89.2936 538.879,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- B -->
|
||||||
|
<g id="node50" class="node"><title>B</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-71 431,-71 431,-35 485,-35 485,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB -->
|
||||||
|
<g id="node58" class="node"><title>AB</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="485,-134 431,-134 431,-98 485,-98 485,-134"/>
|
||||||
|
</g>
|
||||||
|
<!-- B->AB -->
|
||||||
|
<g id="edge30" class="edge"><title>B->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M455.938,-71.2222C455.689,-79.5078 455.687,-89.2936 455.933,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- A -->
|
||||||
|
<g id="node51" class="node"><title>A</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="424,-71 370,-71 370,-35 424,-35 424,-71"/>
|
||||||
|
</g>
|
||||||
|
<!-- A->AB -->
|
||||||
|
<g id="edge28" class="edge"><title>A->AB</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M412.582,-71.2222C420.355,-79.5078 429.829,-89.2936 438.117,-97.6005"/>
|
||||||
|
</g>
|
||||||
|
<!-- G2->G -->
|
||||||
|
<!-- EFG2 -->
|
||||||
|
<g id="node54" class="node"><title>EFG2</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="678,-221 624,-221 624,-185 678,-185 678,-221"/>
|
||||||
|
<text text-anchor="middle" x="651" y="-198.1" font-family="Sans" font-size="16.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- G2->EFG2 -->
|
||||||
|
<g id="edge62" class="edge"><title>G2->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M706.255,-141.431C692.947,-155.405 677.188,-172.404 665.898,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="708.959,-143.668 713.353,-134.026 703.906,-138.824 708.959,-143.668"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->F -->
|
||||||
|
<g id="edge52" class="edge"><title>EF->F</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M675.098,-89.8891C680.269,-83.6155 685.515,-77.048 689.998,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="672.38,-87.6835 668.651,-97.6005 677.75,-92.1733 672.38,-87.6835"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->E -->
|
||||||
|
<g id="edge50" class="edge"><title>EF->E</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M649.444,-87.3665C648.615,-81.8774 647.645,-76.2713 646.642,-71.2222"/>
|
||||||
|
<polygon fill="black" stroke="black" points="646.02,-88.1634 650.836,-97.6005 652.956,-87.22 646.02,-88.1634"/>
|
||||||
|
</g>
|
||||||
|
<!-- EF->EFG2 -->
|
||||||
|
<g id="edge60" class="edge"><title>EF->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M648.879,-144.184C648.644,-157.59 648.73,-173.22 649.137,-184.997"/>
|
||||||
|
<polygon fill="black" stroke="black" points="652.382,-144.112 649.136,-134.026 645.384,-143.935 652.382,-144.112"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->G2 -->
|
||||||
|
<g id="edge70" class="edge"><title>EFG2->G2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M677.41,-177.594C690.815,-163.625 706.552,-146.625 717.702,-134.026"/>
|
||||||
|
<polygon fill="black" stroke="black" points="674.685,-175.377 670.246,-184.997 679.716,-180.245 674.685,-175.377"/>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->EF -->
|
||||||
|
<g id="edge68" class="edge"><title>EFG2->EF</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M653.828,-174.842C654.141,-161.439 654.027,-145.808 653.486,-134.026"/>
|
||||||
|
<polygon fill="black" stroke="black" points="650.324,-174.884 653.485,-184.997 657.32,-175.121 650.324,-174.884"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT -->
|
||||||
|
<g id="node56" class="node"><title>ROOT</title>
|
||||||
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="628,-277 574,-277 574,-241 628,-241 628,-277"/>
|
||||||
|
<text text-anchor="middle" x="601" y="-254.1" font-family="Sans" font-size="16.00">H()</text>
|
||||||
|
</g>
|
||||||
|
<!-- EFG2->ROOT -->
|
||||||
|
<g id="edge74" class="edge"><title>EFG2->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M625.871,-228.632C622.236,-232.676 618.605,-236.786 615.281,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="628.649,-230.78 632.786,-221.027 623.469,-226.071 628.649,-230.78"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD -->
|
||||||
|
<g id="node55" class="node"><title>ABCD</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="577,-221 523,-221 523,-185 577,-185 577,-221"/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="535,-221 523,-209 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="523,-197 535,-185 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="565,-185 577,-197 "/>
|
||||||
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="577,-209 565,-221 "/>
|
||||||
|
<text text-anchor="middle" x="550" y="-198.1" font-family="Sans" font-size="16.00">H1</text>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->ROOT -->
|
||||||
|
<g id="edge72" class="edge"><title>ABCD->ROOT</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M571.101,-228.632C574.759,-232.676 578.541,-236.786 582.136,-240.622"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.575,-226.148 564.299,-221.027 568.357,-230.814 573.575,-226.148"/>
|
||||||
|
</g>
|
||||||
|
<!-- ABCD->AB -->
|
||||||
|
<!-- ABCD->CD -->
|
||||||
|
<!-- ROOT->EFG2 -->
|
||||||
|
<g id="edge78" class="edge"><title>ROOT->EFG2</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M627.21,-232.997C630.852,-228.949 634.459,-224.846 637.728,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="624.405,-230.878 620.245,-240.622 629.574,-235.599 624.405,-230.878"/>
|
||||||
|
</g>
|
||||||
|
<!-- ROOT->ABCD -->
|
||||||
|
<g id="edge76" class="edge"><title>ROOT->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M580.312,-232.997C576.653,-228.949 572.86,-224.846 569.241,-221.027"/>
|
||||||
|
<polygon fill="black" stroke="black" points="577.837,-235.48 587.1,-240.622 583.065,-230.826 577.837,-235.48"/>
|
||||||
|
</g>
|
||||||
|
<!-- AB->B -->
|
||||||
|
<!-- AB->A -->
|
||||||
|
<!-- AB->ABCD -->
|
||||||
|
<g id="edge56" class="edge"><title>AB->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M475.198,-134.026C490.473,-148.958 512.801,-170.072 529.099,-184.997"/>
|
||||||
|
</g>
|
||||||
|
<!-- CD->D -->
|
||||||
|
<!-- CD->C -->
|
||||||
|
<!-- CD->ABCD -->
|
||||||
|
<g id="edge58" class="edge"><title>CD->ABCD</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M548.136,-134.026C547.621,-148.958 547.621,-170.072 548.137,-184.997"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 17 KiB |