Dev Docs: Add P2P Messages That Request Or Reply With Data

Adds to the devel reference page detailed documentation on the following
messages: block, getblocks, getdata, getheaders, headers, inv, mempool,
merkleblock, notfound, and tx.

Adds to the devel examples page an example of requesting and parsing a
merkleblock message.

Adds to the devel docs overview pages links to the above two new
P2P sections.

Tweaks the autocrossref plugin ignore pattern to not crossref in the
middle of a GIF image name; this allows the inclusion of animated GIFs.
This commit is contained in:
David A. Harding 2014-10-28 14:28:14 -04:00
parent a27cf8be5f
commit 1634212dd5
No known key found for this signature in database
GPG key ID: 4B29C30FF29EC4B7
57 changed files with 7352 additions and 6 deletions

View file

@ -24,6 +24,7 @@ block chain:
block-chain: block chain
block header:
block height:
'`block` message': block message
block reward:
block time:
block version:
@ -79,11 +80,15 @@ extended public key:
fiat:
fork:
forks: fork
'`getblocks` message': getblocks message
'`getdata` message': getdata message
'`getheaders` message': getheaders message
genesis block:
hard fork:
hard forks: hard fork
hardened extended private key:
HD protocol:
'`headers` message': headers message
high-priority transaction: high-priority transactions
high-priority transactions:
inputs: input
@ -91,8 +96,11 @@ input:
intermediate certificate:
intermediate certificates: intermediate certificate
internal byte order:
'`inv` message': inv message
IP address: DO NOT AUTOCROSSREF
IP addresses: DO NOT AUTOCROSSREF
inventories: inventory
inventory:
key index:
key pair:
'`label`': label
@ -105,8 +113,13 @@ man-in-the-middle:
master chain code:
master private key:
'`memo`': pp memo
'`mempool` message': mempool message
'`message`': message
message header:
message payload:
'`merchant_data`': pp merchant data
merkleblock: merkleblock message
'`merkleblock` message': merkleblock message
merkle root:
merkle tree:
merge:
@ -120,9 +133,13 @@ minimum fee:
mining: mine
millibitcoin: millibitcoins
millibitcoins:
'`MSG_BLOCK`': msg_block
'`MSG_FILTERED_BLOCK`': msg_filtered_block
'`MSG_TX`': msg_tx
multisig:
nbits:
network:
'`notfound` message': notfound message
null data:
'`op_checkmultisig`': op_checkmultisig
'`op_checksig`': op_checksig
@ -152,6 +169,7 @@ PaymentRequest:
PaymentRequests: paymentrequest
peer:
peers: peer
peer-to-peer: network
peer-to-peer network: network
pki:
'`pki_type`': pp pki type
@ -162,6 +180,11 @@ proof of work:
proof-of-work: proof of work
protocol buffer: 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 hash:
pubkey hashes: pubkey hash
@ -218,6 +241,7 @@ standard script:
standard scripts: standard script
standard transaction: standard script
standard transactions: standard script
start string:
target:
testnet:
#transaction -- Recommend we don't autocrossref this; it occurs too often
@ -227,6 +251,7 @@ transaction malleability:
transaction object format:
transaction version number:
'`transactions`': pp transactions
'`tx` message': tx message
txid:
txids: txid
unconfirmed:
@ -337,5 +362,10 @@ CVE-2012-2459:
'`walletpassphrase`': rpc walletpassphrase
'`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.8.0:
Bitcoin Core 0.9.0:
Bitcoin Core 0.9.3:

View 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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.svg)
We start by building the structure of a merkle tree based on the number
of transactions in the block.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg)
The third flag in the example is another 1 on another non-TXID node, so
we descend into its left child.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg)
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).
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.svg)
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.
![Parsing A MerkleBlock](/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.svg)
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 %}

View 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 (March 2014) | Added `reject` message (see [BIP61][]). Send multiple `inv` messages in response to `mempool` message if necessary.
| 70001 | Bitcoin Core 0.8.0 (February 2013) | Added `filterload` message, `filteradd` message, `filterclear` message, and `merkleblock` message; also added relay field to `version` message and `MSG_FILTERED_BLOCK` inventory type to `getdata` message (see [BIP37][]).
| 60002 | Bitcoin Core 0.7.0 (September 2012) | Added `mempool` message and extended `getdata` message to allow download of memory pool transactions (see [BIP35][]).
| 60001 | Bitcoin Core 0.6.1 (May 2012) | Added `pong` message (see [BIP31][]).
| 60000 | Bitcoin Core 0.6.0 (March 2012) | Separated protocol version from Bitcoin Core version (see [BIP14][]).
{% 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.
![Overview Of P2P Protocol Data Request And Reply Messages](/img/dev/en-p2p-data-messages.svg)
Many of the data messages use
[inventories][inventory]{:#term-inventory}{:.term} as unique identifiers for
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 500 header hashes (the maximum which will ever be sent as a reply to this message).
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 hasnt 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 are 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 previous 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 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.
![Example Of Parsing A MerkleBlock Message](/img/dev/animated-en-merkleblock-parsing.gif)
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 descend into 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 unless the hash of the merkle root node is 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.
![Example Of Creating A MerkleBlock Message](/img/dev/animated-en-merkleblock-creation.gif)
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 descend into 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 begin processing again.
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 %}

View file

@ -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 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 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 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"
@ -46,14 +47,20 @@
[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."
[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."
[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"
[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"
[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"
[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"
[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 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)"
@ -63,19 +70,26 @@
[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 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 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 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)"
[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"
[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"
[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"
[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"
[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"
@ -147,15 +161,17 @@
[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"
[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"
[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 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"
[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 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"
[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 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"
@ -244,7 +260,11 @@
[rpc walletpassphrasechange]: /en/developer-reference#walletpassphrasechange
<!-- 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.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 URI subsection]: /en/developer-guide#bitcoin-uri
[bitcoinpdf]: https://bitcoin.org/bitcoin.pdf
@ -266,8 +286,12 @@
[RPC]: /en/developer-reference#remote-procedure-calls-rpcs
[RPCs]: /en/developer-reference#remote-procedure-calls-rpcs
[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 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 verifying payment]: /en/developer-guide#verifying-payment
[signature script modification warning]: /en/developer-reference#signature_script_modification_warning
@ -277,13 +301,18 @@
<!-- Official reference documents (BIPs should not use zero padding:
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
[BIP21]: https://github.com/bitcoin/bips/blob/master/bip-0021.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
[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
[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
[BIP70]: https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki
[BIP71]: https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki
@ -296,12 +325,14 @@
<!-- Other external site links; alphabetical order -->
[BFGMiner]: https://github.com/luke-jr/bfgminer
[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-documentation mailing list]: https://groups.google.com/forum/#!forum/bitcoin-documentation
[BitcoinJ]: http://bitcoinj.github.io
[block170]: https://www.biteasy.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
[casascius address utility]: https://github.com/casascius/Bitcoin-Address-Utility
[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 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
@ -317,16 +348,19 @@
[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
[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
[libblkmaker]: https://gitorious.org/bitcoin/libblkmaker
[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
[MIME]: https://en.wikipedia.org/wiki/Internet_media_type
[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
[Piotr Piasecki's testnet faucet]: https://tpfaucet.appspot.com/
[prime symbol]: https://en.wikipedia.org/wiki/Prime_%28symbol%29
[protobuf]: https://developers.google.com/protocol-buffers/
[python-bitcoinlib]: https://github.com/petertodd/python-bitcoinlib
[python-blkmaker]: https://gitorious.org/bitcoin/python-blkmaker
[SHA256]: https://en.wikipedia.org/wiki/SHA-2
[Stratum mining protocol]: http://mining.bitcoin.cz/stratum-mining
@ -335,3 +369,7 @@
[wiki script]: https://en.bitcoin.it/wiki/Script
[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

View file

@ -65,9 +65,9 @@ require 'yaml'
(?![^\s]*<!--noref-->) ## No subst if <!--noref--> after key
(?!((?!<pre>).)*(<\/pre>)) ## No subst on a line with a closing pre tag. This
## 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
## 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
## regex
(?!\w) ## Don't match inside words

View file

@ -62,6 +62,8 @@ title: "Developer Documentation - Bitcoin"
<div>
<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-reference#p2p-network">P2P Network Reference</a></p>
<p><a href="/en/developer-examples#p2p-network">P2P Network Examples</a></p>
<div class="resourcesext">
<p><a href="https://en.bitcoin.it/wiki/Protocol_specification">Full Protocol Specification</a> - Wiki</p>
</div>

View file

@ -30,6 +30,8 @@ title: "Developer Examples - Bitcoin"
{% include example_payment_processing.md %}
{% include example_p2p_networking.md %}
{% include references.md %}
</div>

View file

@ -30,6 +30,8 @@ title: "Developer Reference - Bitcoin"
{% include ref_wallets.md %}
{% include ref_p2p_networking.md %}
## Bitcoin Core APIs
<!-- TODO, Relevant links:

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View 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&#45;&gt;inv -->
<g id="edge2" class="edge"><title>getblocks&#45;&gt;inv</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M116.776,-116.727C137.03,-113.611 160.945,-109.931 178.916,-107.167"/>
</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&#45;&gt;getdata -->
<g id="edge6" class="edge"><title>inv&#45;&gt;getdata</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M233.164,-103C257.732,-103 294.053,-103 320.831,-103"/>
</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&#45;&gt;inv -->
<g id="edge4" class="edge"><title>mempool&#45;&gt;inv</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M115.711,-89.1093C136.17,-92.2569 160.59,-96.0138 178.871,-98.8264"/>
</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&#45;&gt;tx -->
<g id="edge8" class="edge"><title>getdata&#45;&gt;tx</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-115.578C422.681,-126.815 468.117,-143.042 496.844,-153.301"/>
</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&#45;&gt;block -->
<g id="edge10" class="edge"><title>getdata&#45;&gt;block</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-107.193C422.681,-110.938 468.117,-116.347 496.844,-119.767"/>
</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&#45;&gt;merkleblock -->
<g id="edge12" class="edge"><title>getdata&#45;&gt;merkleblock</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-98.8073C415.369,-95.9323 447.752,-92.0772 474.492,-88.8939"/>
</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&#45;&gt;notfound -->
<g id="edge14" class="edge"><title>getdata&#45;&gt;notfound</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M391.218,-90.422C418.448,-80.6973 456.143,-67.2348 484.415,-57.1376"/>
</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&#45;&gt;headers -->
<g id="edge16" class="edge"><title>getheaders&#45;&gt;headers</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M123.097,-203C213.183,-203 408.074,-203 488.344,-203"/>
</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&#45;&gt;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&#45;&gt;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&#45;&gt;label4 -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

31
img/dev/gifs/README.md Normal file
View 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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;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&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;EF -->
<!-- EFG2&#45;&gt;G2 -->
<!-- EFG2&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ABCD -->
<!-- ROOT&#45;&gt;EFG2 -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;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&#45;&gt;EFG2 -->
<!-- AB&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;E -->
<!-- EF&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- EFG2&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;EF -->
<!-- EFG2&#45;&gt;G2 -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;EFG2 -->
<!-- AB&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;E -->
<!-- EF&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;EF -->
<!-- EFG2&#45;&gt;G2 -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;EF -->
<!-- EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;E -->
<!-- EF&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;F -->
<!-- EF&#45;&gt;E -->
<g id="edge50" class="edge"><title>EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;F -->
<g id="edge52" class="edge"><title>EF&#45;&gt;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&#45;&gt;E -->
<g id="edge50" class="edge"><title>EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;F -->
<g id="edge52" class="edge"><title>EF&#45;&gt;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&#45;&gt;E -->
<g id="edge50" class="edge"><title>EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;EF -->
<g id="edge68" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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&#45;&gt;G -->
<!-- G2&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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&#45;&gt;F -->
<g id="edge52" class="edge"><title>EF&#45;&gt;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&#45;&gt;E -->
<g id="edge50" class="edge"><title>EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G2 -->
<g id="edge70" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;EF -->
<g id="edge68" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<!-- ROOT&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View file

@ -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&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;</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&#45;&gt;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&#45;&gt;waiting -->
<!-- pre_legend_label -->
<!-- legend_label -->
<!-- pre_legend_label&#45;&gt;legend_label -->
<!-- legend_label&#45;&gt;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&#45;TXID</text>
<text text-anchor="middle" x="818" y="-188.6" font-family="Sans" font-size="16.00">Nodes</text>
</g>
<!-- row1&#45;&gt;root_row -->
<g id="edge24" class="edge"><title>row1&#45;&gt;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&#45;&gt;row1 -->
<g id="edge22" class="edge"><title>row2&#45;&gt;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&#45;&gt;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&#45;&gt;G2 -->
<g id="edge40" class="edge"><title>G&#45;&gt;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&#45;&gt;EF -->
<g id="edge38" class="edge"><title>F&#45;&gt;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&#45;&gt;EF -->
<g id="edge36" class="edge"><title>E&#45;&gt;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&#45;&gt;CD -->
<g id="edge34" class="edge"><title>D&#45;&gt;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&#45;&gt;CD -->
<g id="edge32" class="edge"><title>C&#45;&gt;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&#45;&gt;AB -->
<g id="edge30" class="edge"><title>B&#45;&gt;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&#45;&gt;AB -->
<g id="edge28" class="edge"><title>A&#45;&gt;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&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge62" class="edge"><title>G2&#45;&gt;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&#45;&gt;F -->
<g id="edge52" class="edge"><title>EF&#45;&gt;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&#45;&gt;E -->
<g id="edge50" class="edge"><title>EF&#45;&gt;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&#45;&gt;EFG2 -->
<g id="edge60" class="edge"><title>EF&#45;&gt;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&#45;&gt;G2 -->
<g id="edge70" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;EF -->
<g id="edge68" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge74" class="edge"><title>EFG2&#45;&gt;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&#45;&gt;ROOT -->
<g id="edge72" class="edge"><title>ABCD&#45;&gt;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&#45;&gt;AB -->
<!-- ABCD&#45;&gt;CD -->
<!-- ROOT&#45;&gt;EFG2 -->
<g id="edge78" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;ABCD -->
<g id="edge76" class="edge"><title>ROOT&#45;&gt;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&#45;&gt;B -->
<!-- AB&#45;&gt;A -->
<!-- AB&#45;&gt;ABCD -->
<g id="edge56" class="edge"><title>AB&#45;&gt;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&#45;&gt;D -->
<!-- CD&#45;&gt;C -->
<!-- CD&#45;&gt;ABCD -->
<g id="edge58" class="edge"><title>CD&#45;&gt;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