Dev Docs: Document Blocks-First IBD & Orphan Blocks

This commit provides a detailed overview of the current block download
method, which I've retroactively named blocks-first for parallelism with
headers-first.

New And Significantly Revised:

* New Initial Block Download (IBD) section (h3) with Blocks-First
  subsection (h4)

* New Orphan Block subsection (under Blocks Broadcasting) describing
  orphan blocks and how they're handled under blocks-first. Also
  includes a simple illustration of the difference between orphan blocks
  and stale blocks. Thanks to luke-jr for his s/orphan block/stale
  block/ commit a couple months ago---that made this commit much easier.

Edits:

* Cleaned up a couple cases missed by previous s/orphan/stale/ commit
  because they used past tense (orphaned).

* In P2P reference section, mentioned that a `block` message can be sent
  unsolicited by miners.

* Mention that `getheaders` and `headers` were added in protocol
  version 31800.

* Moved a few internal links around and added a few new internal links.

Administrivia:

* Started adding "TODOv0.10" in HTML comments to places that need to be
  updated when 0.10 is released so that I can easily git grep for that
  tag later.
This commit is contained in:
David A. Harding 2014-11-27 19:36:59 -05:00
parent c4cce0e8f9
commit ccda4caa0c
No known key found for this signature in database
GPG key ID: 4B29C30FF29EC4B7
25 changed files with 1010 additions and 18 deletions

View file

@ -14,7 +14,8 @@ corresponding commands:
circo -T svg file.circo -o file.svg
neato -T png file.neato -o file.png
Notice: Graphviz can be inconsistent across versions. All of the SVG and
Notice: Graphviz can be inconsistent across versions.
Up until commit ab415e8b6 (2014-12-17), all of the SVG and
PNG images here were generated using graphviz version 2.26.3
(20100126.1600) on Debian 7 using the following shell loop:
@ -26,6 +27,11 @@ PNG images here were generated using graphviz version 2.26.3
optipng -o7 ${f/.dot}.png
done
Images created after commit ab415e8b6 used Debian Graphviz version
2.38.0-7. This higher version is required to support the HTML bold and
italics tags used in some newer images, and we may come to use some of
its other extra features such as the sides="" parameter.
For improved compatability between Graphviz versions, files created or
updated after 6 May 2014 are recommend to include the following code
near the top of the file:

48
img/dev/en-ibd-block.dot Normal file
View file

@ -0,0 +1,48 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.5;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans"]
graph [ penwidth = 1.75, fontname="Sans" ]
ibd -> block:f1 -> sync [dir="back"];
ibd [ label = "IBD\nNode", shape="none" ];
sync [ label = "Sync\nNode", shape="none" ];
block [ shape="plaintext", label=<
<table border="2" cellborder="1" cellpadding="5">
<tr>
<td colspan="4" port="f1" border="0" cellpadding="4"><b>Block Message</b></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Message Header</i></td>
</tr>
<tr>
<td border="1"><i>Start String</i><br/><font face="courier">f9beb4d9</font></td>
<td border="1"><i>Command</i><br/><font face="courier">block</font></td>
<td border="1"><i>Size</i><br/><font face="courier">215</font></td>
<td border="1"><i>Checksum</i><br/><font face="courier">934d270a</font></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Payload</i></td>
</tr>
<tr>
<td colspan="4" border="1"><i>Serialized Block</i><br/><font face="courier">010000006fe2...58eeac00000000</font></td>
</tr>
</table>>];
label = "First block message sent to Initial Blocks Download (IBD) node"
}

BIN
img/dev/en-ibd-block.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

56
img/dev/en-ibd-block.svg Normal file
View file

@ -0,0 +1,56 @@
<?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.38.0 (20140413.2041)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="450pt" height="181pt"
viewBox="0.00 0.00 450.00 180.69" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(0.868726 0.868726) rotate(0) translate(4 204)">
<title>%3</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-204 514,-204 514,4 -4,4"/>
<text text-anchor="middle" x="255" y="-7.8" font-family="Sans" font-size="14.00">First block message sent to Initial Blocks Download (IBD) node</text>
<!-- ibd -->
<g id="node1" class="node"><title>ibd</title>
<text text-anchor="middle" x="27" y="-184.3" font-family="Sans" font-size="14.00">IBD</text>
<text text-anchor="middle" x="27" y="-169.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- block -->
<g id="node2" class="node"><title>block</title>
<text text-anchor="start" x="195" y="-177.3" font-family="Sans" font-weight="bold" font-size="14.00">Block Message</text>
<text text-anchor="start" x="197.5" y="-151.3" font-family="Sans" font-style="italic" font-size="14.00">Message Header</text>
<polygon fill="none" stroke="black" points="102,-99.5 102,-139.5 194,-139.5 194,-99.5 102,-99.5"/>
<text text-anchor="start" x="108" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Start String</text>
<text text-anchor="start" x="114.5" y="-109.3" font-family="Courier,monospace" font-size="14.00">f9beb4d9</text>
<polygon fill="none" stroke="black" points="196,-99.5 196,-139.5 278,-139.5 278,-99.5 196,-99.5"/>
<text text-anchor="start" x="202" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Command</text>
<text text-anchor="start" x="216" y="-109.3" font-family="Courier,monospace" font-size="14.00">block</text>
<polygon fill="none" stroke="black" points="280,-99.5 280,-139.5 321,-139.5 321,-99.5 280,-99.5"/>
<text text-anchor="start" x="286" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Size</text>
<text text-anchor="start" x="288" y="-109.3" font-family="Courier,monospace" font-size="14.00">215</text>
<polygon fill="none" stroke="black" points="323,-99.5 323,-139.5 408,-139.5 408,-99.5 323,-99.5"/>
<text text-anchor="start" x="329" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Checksum</text>
<text text-anchor="start" x="332" y="-109.3" font-family="Courier,monospace" font-size="14.00">934d270a</text>
<text text-anchor="start" x="227.5" y="-82.3" font-family="Sans" font-style="italic" font-size="14.00">Payload</text>
<polygon fill="none" stroke="black" points="102,-30.5 102,-70.5 408,-70.5 408,-30.5 102,-30.5"/>
<text text-anchor="start" x="200.5" y="-54.3" font-family="Sans" font-style="italic" font-size="14.00">Serialized Block</text>
<text text-anchor="start" x="135" y="-40.3" font-family="Courier,monospace" font-size="14.00">010000006fe2...58eeac00000000</text>
<polygon fill="none" stroke="black" stroke-width="2" points="99,-28 99,-195 411,-195 411,-28 99,-28"/>
</g>
<!-- ibd&#45;&gt;block -->
<g id="edge1" class="edge"><title>ibd&#45;&gt;block:f1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M64.3931,-180.5C82.6786,-180.5 101,-180.5 101,-180.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="64.3547,-177 54.3547,-180.5 64.3546,-184 64.3547,-177"/>
</g>
<!-- sync -->
<g id="node3" class="node"><title>sync</title>
<text text-anchor="middle" x="483" y="-184.3" font-family="Sans" font-size="14.00">Sync</text>
<text text-anchor="middle" x="483" y="-169.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- block&#45;&gt;sync -->
<g id="edge2" class="edge"><title>block:f1&#45;&gt;sync</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M419.324,-180.5C428.742,-180.5 443.067,-180.5 455.645,-180.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="419,-177 409,-180.5 419,-184 419,-177"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -0,0 +1,57 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.4;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans"]
graph [ penwidth = 1.75, fontname="Sans" ]
ibd -> getblocks:f1 -> sync;
ibd [ label = "IBD\nNode", shape="none" ];
sync [ label = "Sync\nNode", shape="none" ];
getblocks [ shape="plaintext", label=<
<table border="2" cellborder="1">
<tr>
<td colspan="4" port="f1" border="0" cellpadding="4"><b>GetBlocks Message</b></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Message Header</i></td>
</tr>
<tr>
<td border="1"><i>Start String</i><br/><font face="courier">f9beb4d9</font></td>
<td border="1"><i>Command</i><br/><font face="courier">getblocks</font></td>
<td border="1"><i>Size</i><br/><font face="courier">69</font></td>
<td border="1"><i>Checksum</i><br/><font face="courier">f5fcbcad</font></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Payload</i></td>
</tr>
<tr>
<td colspan="2"><i>Protocol Version</i><br /><font face="courier">70002</font></td>
<td colspan="2"><i>Header Hash Count</i><br /><font face="courier">1</font></td>
</tr>
<tr>
<td colspan="4"><i>Header Hashes (Highest-Height First)</i><br /><font face="courier">6fe28c0ab6f1b3...d6190000000000</font></td>
</tr>
<tr>
<td colspan="4"><i>Stopping Hash (Zero Is "No Stop")</i><br /><font face="courier">00000000000000...00000000000000</font></td>
</tr>
</table>>];
label = "First getblocks message sent from Initial Blocks Download (IBD) node"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,65 @@
<?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.38.0 (20140413.2041)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="450pt" height="225pt"
viewBox="0.00 0.00 450.00 224.56" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(0.877193 0.877193) rotate(0) translate(4 252)">
<title>%3</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-252 509,-252 509,4 -4,4"/>
<text text-anchor="middle" x="252.5" y="-7.8" font-family="Sans" font-size="14.00">First getblocks message sent from Initial Blocks Download (IBD) node</text>
<!-- ibd -->
<g id="node1" class="node"><title>ibd</title>
<text text-anchor="middle" x="27" y="-232.3" font-family="Sans" font-size="14.00">IBD</text>
<text text-anchor="middle" x="27" y="-217.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getblocks -->
<g id="node2" class="node"><title>getblocks</title>
<text text-anchor="start" x="174.5" y="-225.3" font-family="Sans" font-weight="bold" font-size="14.00">GetBlocks Message</text>
<text text-anchor="start" x="195.5" y="-202.3" font-family="Sans" font-style="italic" font-size="14.00">Message Header</text>
<polygon fill="none" stroke="black" points="95.5,-159.5 95.5,-193.5 181.5,-193.5 181.5,-159.5 95.5,-159.5"/>
<text text-anchor="start" x="98.5" y="-180.3" font-family="Sans" font-style="italic" font-size="14.00">Start String</text>
<text text-anchor="start" x="105" y="-166.3" font-family="Courier,monospace" font-size="14.00">f9beb4d9</text>
<polygon fill="none" stroke="black" points="183.5,-159.5 183.5,-193.5 264.5,-193.5 264.5,-159.5 183.5,-159.5"/>
<text text-anchor="start" x="189" y="-180.3" font-family="Sans" font-style="italic" font-size="14.00">Command</text>
<text text-anchor="start" x="186.5" y="-166.3" font-family="Courier,monospace" font-size="14.00">getblocks</text>
<polygon fill="none" stroke="black" points="266.5,-159.5 266.5,-193.5 315.5,-193.5 315.5,-159.5 266.5,-159.5"/>
<text text-anchor="start" x="276.5" y="-180.3" font-family="Sans" font-style="italic" font-size="14.00">Size</text>
<text text-anchor="start" x="282.5" y="-166.3" font-family="Courier,monospace" font-size="14.00">69</text>
<polygon fill="none" stroke="black" points="317.5,-159.5 317.5,-193.5 410.5,-193.5 410.5,-159.5 317.5,-159.5"/>
<text text-anchor="start" x="327.5" y="-180.3" font-family="Sans" font-style="italic" font-size="14.00">Checksum</text>
<text text-anchor="start" x="330.5" y="-166.3" font-family="Courier,monospace" font-size="14.00">f5fcbcad</text>
<text text-anchor="start" x="225.5" y="-145.3" font-family="Sans" font-style="italic" font-size="14.00">Payload</text>
<polygon fill="none" stroke="black" points="95.5,-102.5 95.5,-136.5 264.5,-136.5 264.5,-102.5 95.5,-102.5"/>
<text text-anchor="start" x="123.5" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Protocol Version</text>
<text text-anchor="start" x="159" y="-109.3" font-family="Courier,monospace" font-size="14.00">70002</text>
<polygon fill="none" stroke="black" points="266.5,-102.5 266.5,-136.5 410.5,-136.5 410.5,-102.5 266.5,-102.5"/>
<text text-anchor="start" x="270.5" y="-123.3" font-family="Sans" font-style="italic" font-size="14.00">Header Hash Count</text>
<text text-anchor="start" x="334" y="-109.3" font-family="Courier,monospace" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="95.5,-66.5 95.5,-100.5 410.5,-100.5 410.5,-66.5 95.5,-66.5"/>
<text text-anchor="start" x="123.5" y="-87.3" font-family="Sans" font-style="italic" font-size="14.00">Header Hashes (Highest&#45;Height First)</text>
<text text-anchor="start" x="125" y="-73.3" font-family="Courier,monospace" font-size="14.00">6fe28c0ab6f1b3...d6190000000000</text>
<polygon fill="none" stroke="black" points="95.5,-30.5 95.5,-64.5 410.5,-64.5 410.5,-30.5 95.5,-30.5"/>
<text text-anchor="start" x="134.5" y="-51.3" font-family="Sans" font-style="italic" font-size="14.00">Stopping Hash (Zero Is &quot;No Stop&quot;)</text>
<text text-anchor="start" x="125" y="-37.3" font-family="Courier,monospace" font-size="14.00">00000000000000...00000000000000</text>
<polygon fill="none" stroke="black" stroke-width="2" points="92,-28 92,-243 413,-243 413,-28 92,-28"/>
</g>
<!-- ibd&#45;&gt;getblocks -->
<g id="edge1" class="edge"><title>ibd&#45;&gt;getblocks:f1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M54.2826,-228.5C64.8835,-228.5 76.4737,-228.5 84.4768,-228.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="84.5,-232 94.5,-228.5 84.5,-225 84.5,-232"/>
</g>
<!-- sync -->
<g id="node3" class="node"><title>sync</title>
<text text-anchor="middle" x="478" y="-232.3" font-family="Sans" font-size="14.00">Sync</text>
<text text-anchor="middle" x="478" y="-217.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getblocks&#45;&gt;sync -->
<g id="edge2" class="edge"><title>getblocks:f1&#45;&gt;sync</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M411.5,-228.5C411.5,-228.5 425.372,-228.5 440.348,-228.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="440.736,-232 450.736,-228.5 440.736,-225 440.736,-232"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -0,0 +1,57 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.4;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans"]
graph [ penwidth = 1.75, fontname="Sans" ]
ibd -> getblocks:f1 -> sync;
ibd [ label = "IBD\nNode", shape="none" ];
sync [ label = "Sync\nNode", shape="none" ];
getblocks [ shape="plaintext", label=<
<table border="2" cellborder="1">
<tr>
<td colspan="4" port="f1" border="0" cellpadding="4"><b>GetBlocks Message</b></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Message Header</i></td>
</tr>
<tr>
<td border="1"><i>Start String</i><br/><font face="courier">f9beb4d9</font></td>
<td border="1"><i>Command</i><br/><font face="courier">getblocks</font></td>
<td border="1"><i>Size</i><br/><font face="courier">677</font></td>
<td border="1"><i>Checksum</i><br/><font face="courier">52be83ef</font></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Payload</i></td>
</tr>
<tr>
<td colspan="2"><i>Protocol Version</i><br /><font face="courier">70002</font></td>
<td colspan="2"><i>Header Hash Count</i><br /><font face="courier">20</font></td>
</tr>
<tr>
<td colspan="4"><i>Header Hashes (Highest-Height First)</i><br /><font face="courier">db773c8f3b90ef...64f64f00000000<br/>459f16a1c695d0...f66d8000000000</font><br/><i>......18 more header hashes......</i></td>
</tr>
<tr>
<td colspan="4"><i>Stopping Hash (Zero Is "No Stop")</i><br /><font face="courier">00000000000000...00000000000000</font></td>
</tr>
</table>>];
label = "Second getblocks message sent from Initial Blocks Download (IBD) node"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,67 @@
<?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.38.0 (20140413.2041)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="450pt" height="245pt"
viewBox="0.00 0.00 450.00 244.83" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(0.862069 0.862069) rotate(0) translate(4 280)">
<title>%3</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-280 518,-280 518,4 -4,4"/>
<text text-anchor="middle" x="257" y="-7.8" font-family="Sans" font-size="14.00">Second getblocks message sent from Initial Blocks Download (IBD) node</text>
<!-- ibd -->
<g id="node1" class="node"><title>ibd</title>
<text text-anchor="middle" x="31.5" y="-260.3" font-family="Sans" font-size="14.00">IBD</text>
<text text-anchor="middle" x="31.5" y="-245.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getblocks -->
<g id="node2" class="node"><title>getblocks</title>
<text text-anchor="start" x="179" y="-253.3" font-family="Sans" font-weight="bold" font-size="14.00">GetBlocks Message</text>
<text text-anchor="start" x="200" y="-230.3" font-family="Sans" font-style="italic" font-size="14.00">Message Header</text>
<polygon fill="none" stroke="black" points="100,-187.5 100,-221.5 186,-221.5 186,-187.5 100,-187.5"/>
<text text-anchor="start" x="103" y="-208.3" font-family="Sans" font-style="italic" font-size="14.00">Start String</text>
<text text-anchor="start" x="109.5" y="-194.3" font-family="Courier,monospace" font-size="14.00">f9beb4d9</text>
<polygon fill="none" stroke="black" points="188,-187.5 188,-221.5 269,-221.5 269,-187.5 188,-187.5"/>
<text text-anchor="start" x="193.5" y="-208.3" font-family="Sans" font-style="italic" font-size="14.00">Command</text>
<text text-anchor="start" x="191" y="-194.3" font-family="Courier,monospace" font-size="14.00">getblocks</text>
<polygon fill="none" stroke="black" points="271,-187.5 271,-221.5 320,-221.5 320,-187.5 271,-187.5"/>
<text text-anchor="start" x="281" y="-208.3" font-family="Sans" font-style="italic" font-size="14.00">Size</text>
<text text-anchor="start" x="283" y="-194.3" font-family="Courier,monospace" font-size="14.00">677</text>
<polygon fill="none" stroke="black" points="322,-187.5 322,-221.5 415,-221.5 415,-187.5 322,-187.5"/>
<text text-anchor="start" x="332" y="-208.3" font-family="Sans" font-style="italic" font-size="14.00">Checksum</text>
<text text-anchor="start" x="335" y="-194.3" font-family="Courier,monospace" font-size="14.00">52be83ef</text>
<text text-anchor="start" x="230" y="-173.3" font-family="Sans" font-style="italic" font-size="14.00">Payload</text>
<polygon fill="none" stroke="black" points="100,-130.5 100,-164.5 269,-164.5 269,-130.5 100,-130.5"/>
<text text-anchor="start" x="128" y="-151.3" font-family="Sans" font-style="italic" font-size="14.00">Protocol Version</text>
<text text-anchor="start" x="163.5" y="-137.3" font-family="Courier,monospace" font-size="14.00">70002</text>
<polygon fill="none" stroke="black" points="271,-130.5 271,-164.5 415,-164.5 415,-130.5 271,-130.5"/>
<text text-anchor="start" x="275" y="-151.3" font-family="Sans" font-style="italic" font-size="14.00">Header Hash Count</text>
<text text-anchor="start" x="334.5" y="-137.3" font-family="Courier,monospace" font-size="14.00">20</text>
<polygon fill="none" stroke="black" points="100,-66.5 100,-128.5 415,-128.5 415,-66.5 100,-66.5"/>
<text text-anchor="start" x="128" y="-115.3" font-family="Sans" font-style="italic" font-size="14.00">Header Hashes (Highest&#45;Height First)</text>
<text text-anchor="start" x="129.5" y="-101.3" font-family="Courier,monospace" font-size="14.00">db773c8f3b90ef...64f64f00000000</text>
<text text-anchor="start" x="129.5" y="-87.3" font-family="Courier,monospace" font-size="14.00">459f16a1c695d0...f66d8000000000</text>
<text text-anchor="start" x="148" y="-73.3" font-family="Sans" font-style="italic" font-size="14.00">......18 more header hashes......</text>
<polygon fill="none" stroke="black" points="100,-30.5 100,-64.5 415,-64.5 415,-30.5 100,-30.5"/>
<text text-anchor="start" x="139" y="-51.3" font-family="Sans" font-style="italic" font-size="14.00">Stopping Hash (Zero Is &quot;No Stop&quot;)</text>
<text text-anchor="start" x="129.5" y="-37.3" font-family="Courier,monospace" font-size="14.00">00000000000000...00000000000000</text>
<polygon fill="none" stroke="black" stroke-width="2" points="96.5,-28 96.5,-271 417.5,-271 417.5,-28 96.5,-28"/>
</g>
<!-- ibd&#45;&gt;getblocks -->
<g id="edge1" class="edge"><title>ibd&#45;&gt;getblocks:f1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M58.7826,-256.5C69.3835,-256.5 80.9737,-256.5 88.9768,-256.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="89,-260 99,-256.5 89,-253 89,-260"/>
</g>
<!-- sync -->
<g id="node3" class="node"><title>sync</title>
<text text-anchor="middle" x="482.5" y="-260.3" font-family="Sans" font-size="14.00">Sync</text>
<text text-anchor="middle" x="482.5" y="-245.3" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getblocks&#45;&gt;sync -->
<g id="edge2" class="edge"><title>getblocks:f1&#45;&gt;sync</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M416,-256.5C416,-256.5 429.872,-256.5 444.848,-256.5"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="445.236,-260 455.236,-256.5 445.236,-253 445.236,-260"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,73 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.2;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans"]
graph [ penwidth = 1.75, fontname="Sans" ]
ibd -> getdata:f1 -> sync;
ibd [ label = "IBD\nNode", shape="none" ];
sync [ label = "Sync\nNode", shape="none" ];
getdata [ shape="plaintext", label=<
<table border="2" cellborder="1">
<tr>
<td colspan="4" port="f1" border="0" cellpadding="4"><b>GetData Message</b></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Message Header</i></td>
</tr>
<tr>
<td border="1"><i>Start String</i><br/><font face="courier">f9beb4d9</font></td>
<td border="1"><i>Command</i><br/><font face="courier">getdata</font></td>
<td border="1"><i>Size</i><br/><font face="courier">4609</font></td>
<td border="1"><i>Checksum</i><br/><font face="courier">33e41222</font></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Payload</i></td>
</tr>
<tr>
<td colspan="4"><i>Number Of Objects Requested By Inventory</i><br /><font face="courier">128</font></td>
</tr>
<tr>
<td colspan="4">
<table border="0">
<tr>
<td colspan="2"><i>Objects Requested (Inventory Entries)</i></td>
</tr>
<tr>
<td><i>Type</i></td>
<td><i>Unique Identifier (For Blocks, A Header Hash)</i></td>
</tr>
<tr>
<td>Block</td>
<td><font face="courier">4860eb18bf1b1620...688e9a8300000000</font></td>
</tr>
<tr>
<td>Block</td>
<td><font face="courier">bddd99ccfda39da1...065f626a00000000</font></td>
</tr>
<tr>
<td colspan="2"><i>...............126 more inventory entries...............</i></td>
</tr>
</table>
</td>
</tr>
</table>>];
label = "First getdata message sent from Initial Blocks Download (IBD) node"
}

BIN
img/dev/en-ibd-getdata.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -0,0 +1,65 @@
<?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.38.0 (20140413.2041)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="450pt" height="246pt"
viewBox="0.00 0.00 450.00 245.98" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(0.822669 0.822669) rotate(0) translate(4 295)">
<title>%3</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-295 543,-295 543,4 -4,4"/>
<text text-anchor="middle" x="269.5" y="-7.8" font-family="Sans" font-size="14.00">First getdata message sent from Initial Blocks Download (IBD) node</text>
<!-- ibd -->
<g id="node1" class="node"><title>ibd</title>
<text text-anchor="middle" x="27" y="-275.8" font-family="Sans" font-size="14.00">IBD</text>
<text text-anchor="middle" x="27" y="-260.8" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getdata -->
<g id="node2" class="node"><title>getdata</title>
<text text-anchor="start" x="198.5" y="-268.8" font-family="Sans" font-weight="bold" font-size="14.00">GetData Message</text>
<text text-anchor="start" x="212.5" y="-245.8" font-family="Sans" font-style="italic" font-size="14.00">Message Header</text>
<polygon fill="none" stroke="black" points="80.5,-203 80.5,-237 212.5,-237 212.5,-203 80.5,-203"/>
<text text-anchor="start" x="106.5" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Start String</text>
<text text-anchor="start" x="113" y="-209.8" font-family="Courier,monospace" font-size="14.00">f9beb4d9</text>
<polygon fill="none" stroke="black" points="214.5,-203 214.5,-237 313.5,-237 313.5,-203 214.5,-203"/>
<text text-anchor="start" x="229" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Command</text>
<text text-anchor="start" x="235" y="-209.8" font-family="Courier,monospace" font-size="14.00">getdata</text>
<polygon fill="none" stroke="black" points="315.5,-203 315.5,-237 366.5,-237 366.5,-203 315.5,-203"/>
<text text-anchor="start" x="326.5" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Size</text>
<text text-anchor="start" x="324" y="-209.8" font-family="Courier,monospace" font-size="14.00">4609</text>
<polygon fill="none" stroke="black" points="368.5,-203 368.5,-237 459.5,-237 459.5,-203 368.5,-203"/>
<text text-anchor="start" x="377.5" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Checksum</text>
<text text-anchor="start" x="380.5" y="-209.8" font-family="Courier,monospace" font-size="14.00">33e41222</text>
<text text-anchor="start" x="242.5" y="-188.8" font-family="Sans" font-style="italic" font-size="14.00">Payload</text>
<polygon fill="none" stroke="black" points="80.5,-146 80.5,-180 459.5,-180 459.5,-146 80.5,-146"/>
<text text-anchor="start" x="118" y="-166.8" font-family="Sans" font-style="italic" font-size="14.00">Number Of Objects Requested By Inventory</text>
<text text-anchor="start" x="257.5" y="-152.8" font-family="Courier,monospace" font-size="14.00">128</text>
<polygon fill="none" stroke="black" points="80.5,-31 80.5,-144 459.5,-144 459.5,-31 80.5,-31"/>
<text text-anchor="start" x="137.5" y="-126.8" font-family="Sans" font-style="italic" font-size="14.00">Objects Requested (Inventory Entries)</text>
<text text-anchor="start" x="91" y="-105.8" font-family="Sans" font-style="italic" font-size="14.00">Type</text>
<text text-anchor="start" x="135" y="-105.8" font-family="Sans" font-style="italic" font-size="14.00">Unique Identifier (For Blocks, A Header Hash)</text>
<text text-anchor="start" x="89" y="-83.8" font-family="Sans" font-size="14.00">Block</text>
<text text-anchor="start" x="148.5" y="-83.8" font-family="Courier,monospace" font-size="14.00">4860eb18bf1b1620...688e9a8300000000</text>
<text text-anchor="start" x="89" y="-62.8" font-family="Sans" font-size="14.00">Block</text>
<text text-anchor="start" x="148.5" y="-62.8" font-family="Courier,monospace" font-size="14.00">bddd99ccfda39da1...065f626a00000000</text>
<text text-anchor="start" x="107.5" y="-42.8" font-family="Sans" font-style="italic" font-size="14.00">...............126 more inventory entries...............</text>
<polygon fill="none" stroke="black" stroke-width="2" points="77,-28 77,-286 462,-286 462,-28 77,-28"/>
</g>
<!-- ibd&#45;&gt;getdata -->
<g id="edge1" class="edge"><title>ibd&#45;&gt;getdata:f1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M54.0518,-272C59.4406,-272 64.8119,-272 69.2213,-272"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="69.5,-275.5 79.5,-272 69.5,-268.5 69.5,-275.5"/>
</g>
<!-- sync -->
<g id="node3" class="node"><title>sync</title>
<text text-anchor="middle" x="512" y="-275.8" font-family="Sans" font-size="14.00">Sync</text>
<text text-anchor="middle" x="512" y="-260.8" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- getdata&#45;&gt;sync -->
<g id="edge2" class="edge"><title>getdata:f1&#45;&gt;sync</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M460.5,-272C460.5,-272 466.72,-272 474.794,-272"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="474.863,-275.5 484.862,-272 474.862,-268.5 474.863,-275.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

73
img/dev/en-ibd-inv.dot Normal file
View file

@ -0,0 +1,73 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.2;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans"]
graph [ penwidth = 1.75, fontname="Sans" ]
ibd -> inv:f1 -> sync [ dir = "back" ];
ibd [ label = "IBD\nNode", shape="none" ];
sync [ label = "Sync\nNode", shape="none" ];
inv [ shape="plaintext", label=<
<table border="2" cellborder="1">
<tr>
<td colspan="4" port="f1" border="0" cellpadding="4"><b>Inv Message</b></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Message Header</i></td>
</tr>
<tr>
<td border="1"><i>Start String</i><br/><font face="courier">f9beb4d9</font></td>
<td border="1"><i>Command</i><br/><font face="courier">inv</font></td>
<td border="1"><i>Size</i><br/><font face="courier">18003</font></td>
<td border="1"><i>Checksum</i><br/><font face="courier">25173c57</font></td>
</tr>
<tr>
<td colspan="4" border="0"><i>Payload</i></td>
</tr>
<tr>
<td colspan="4"><i>Number Of Inventories (Max 500 In Reply To GetBlocks) </i><br /><font face="courier">500</font></td>
</tr>
<tr>
<td colspan="4">
<table border="0">
<tr>
<td colspan="2"><i>Inventory Entries</i></td>
</tr>
<tr>
<td><i>Type</i></td>
<td><i>Unique Identifier (For Blocks, A Header Hash)</i></td>
</tr>
<tr>
<td><font face="courier">block</font></td>
<td><font face="courier">4860eb18bf1b1620...688e9a8300000000</font></td>
</tr>
<tr>
<td><font face="courier">block</font></td>
<td><font face="courier">bddd99ccfda39da1...065f626a00000000</font></td>
</tr>
<tr>
<td colspan="2"><i>...............498 more inventory entries...............</i></td>
</tr>
</table>
</td>
</tr>
</table>>];
label = "First inv message reply sent to Initial Blocks Download (IBD) node"
}

BIN
img/dev/en-ibd-inv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

65
img/dev/en-ibd-inv.svg Normal file
View file

@ -0,0 +1,65 @@
<?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.38.0 (20140413.2041)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="450pt" height="234pt"
viewBox="0.00 0.00 450.00 234.41" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(0.783972 0.783972) rotate(0) translate(4 295)">
<title>%3</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-295 570,-295 570,4 -4,4"/>
<text text-anchor="middle" x="283" y="-7.8" font-family="Sans" font-size="14.00">First inv message reply sent to Initial Blocks Download (IBD) node</text>
<!-- ibd -->
<g id="node1" class="node"><title>ibd</title>
<text text-anchor="middle" x="27" y="-275.8" font-family="Sans" font-size="14.00">IBD</text>
<text text-anchor="middle" x="27" y="-260.8" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- inv -->
<g id="node2" class="node"><title>inv</title>
<text text-anchor="start" x="232.5" y="-268.8" font-family="Sans" font-weight="bold" font-size="14.00">Inv Message</text>
<text text-anchor="start" x="225.5" y="-245.8" font-family="Sans" font-style="italic" font-size="14.00">Message Header</text>
<polygon fill="none" stroke="black" points="80,-203 80,-237 221,-237 221,-203 80,-203"/>
<text text-anchor="start" x="110.5" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Start String</text>
<text text-anchor="start" x="117" y="-209.8" font-family="Courier,monospace" font-size="14.00">f9beb4d9</text>
<polygon fill="none" stroke="black" points="223,-203 223,-237 327,-237 327,-203 223,-203"/>
<text text-anchor="start" x="240" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Command</text>
<text text-anchor="start" x="262.5" y="-209.8" font-family="Courier,monospace" font-size="14.00">inv</text>
<polygon fill="none" stroke="black" points="329,-203 329,-237 391,-237 391,-203 329,-203"/>
<text text-anchor="start" x="345.5" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Size</text>
<text text-anchor="start" x="339" y="-209.8" font-family="Courier,monospace" font-size="14.00">18003</text>
<polygon fill="none" stroke="black" points="393,-203 393,-237 486,-237 486,-203 393,-203"/>
<text text-anchor="start" x="403" y="-223.8" font-family="Sans" font-style="italic" font-size="14.00">Checksum</text>
<text text-anchor="start" x="406" y="-209.8" font-family="Courier,monospace" font-size="14.00">25173c57</text>
<text text-anchor="start" x="255.5" y="-188.8" font-family="Sans" font-style="italic" font-size="14.00">Payload</text>
<polygon fill="none" stroke="black" points="80,-146 80,-180 486,-180 486,-146 80,-146"/>
<text text-anchor="start" x="86" y="-166.8" font-family="Sans" font-style="italic" font-size="14.00">Number Of Inventories (Max 500 In Reply To GetBlocks) </text>
<text text-anchor="start" x="270.5" y="-152.8" font-family="Courier,monospace" font-size="14.00">500</text>
<polygon fill="none" stroke="black" points="80,-31 80,-144 486,-144 486,-31 80,-31"/>
<text text-anchor="start" x="222.5" y="-126.8" font-family="Sans" font-style="italic" font-size="14.00">Inventory Entries</text>
<text text-anchor="start" x="98.5" y="-105.8" font-family="Sans" font-style="italic" font-size="14.00">Type</text>
<text text-anchor="start" x="156" y="-105.8" font-family="Sans" font-style="italic" font-size="14.00">Unique Identifier (For Blocks, A Header Hash)</text>
<text text-anchor="start" x="94" y="-83.8" font-family="Courier,monospace" font-size="14.00">block</text>
<text text-anchor="start" x="169.5" y="-83.8" font-family="Courier,monospace" font-size="14.00">4860eb18bf1b1620...688e9a8300000000</text>
<text text-anchor="start" x="94" y="-62.8" font-family="Courier,monospace" font-size="14.00">block</text>
<text text-anchor="start" x="169.5" y="-62.8" font-family="Courier,monospace" font-size="14.00">bddd99ccfda39da1...065f626a00000000</text>
<text text-anchor="start" x="120.5" y="-42.8" font-family="Sans" font-style="italic" font-size="14.00">...............498 more inventory entries...............</text>
<polygon fill="none" stroke="black" stroke-width="2" points="77,-28 77,-286 489,-286 489,-28 77,-28"/>
</g>
<!-- ibd&#45;&gt;inv -->
<g id="edge1" class="edge"><title>ibd&#45;&gt;inv:f1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M64.0987,-272C72.4781,-272 79,-272 79,-272"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="64.0976,-268.5 54.0976,-272 64.0976,-275.5 64.0976,-268.5"/>
</g>
<!-- sync -->
<g id="node3" class="node"><title>sync</title>
<text text-anchor="middle" x="539" y="-275.8" font-family="Sans" font-size="14.00">Sync</text>
<text text-anchor="middle" x="539" y="-260.8" font-family="Sans" font-size="14.00">Node</text>
</g>
<!-- inv&#45;&gt;sync -->
<g id="edge2" class="edge"><title>inv:f1&#45;&gt;sync</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M497.038,-272C501.35,-272 506.609,-272 511.902,-272"/>
<polygon fill="black" stroke="black" stroke-width="1.75" points="497,-268.5 487,-272 497,-275.5 497,-268.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -0,0 +1,43 @@
digraph {
// This file is licensed under the MIT License (MIT) available on
// http://opensource.org/licenses/MIT.
size=6.25;
rankdir=LR
splines = "false";
ranksep = 0.2;
nodesep = 0.1;
edge [ penwidth = 1.75, fontname="Sans" ]
node [ penwidth = 1.75, shape = "box", fontname="Sans", ]
graph [ penwidth = 1.75, fontname="Sans" ]
subgraph cluster_mainchain {
block0 [ label = "1\n←Parent: 0" ];
block1 [ label = "2\n←Parent: 1" ];
block2 [ label = "3\n←Parent: 2" ];
style = "invis";
}
block0 -> block1 -> block2;
block0 -> block1_1;
block2 -> block5 [ style = "invis", minlen = 4 ];
block1_1 [ label = "2 (Stale)\n←Parent: 1", style = "filled" ];
block5 [ label = "5 (Orphan)\n←Parent: 4", style = "filled" ];
subgraph cluster_toplabel {
node [ style = "invis", height = 0, width = 0, label = "" ];
graph [ penwidth = 0 ];
a -> b -> c -> d -> e -> f -> g [ style = "invis" ];
label = "Orphan blocks have no known parent, so they can't be validated"
}
label = " \nStale blocks are valid but not part of the best block chain"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -0,0 +1,80 @@
<?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="196pt"
viewBox="0.00 0.00 450.00 195.85" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph1" class="graph" transform="scale(0.910931 0.910931) rotate(0) translate(4 211)">
<title>_anonymous_0</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-211 491,-211 491,5 -4,5"/>
<text text-anchor="middle" x="243" y="-25.4" font-family="Sans" font-size="14.00"> </text>
<text text-anchor="middle" x="243" y="-8.4" font-family="Sans" font-size="14.00">Stale blocks are valid but not part of the best block chain</text>
<g id="graph2" class="cluster"><title>cluster_mainchain</title>
</g>
<g id="graph3" class="cluster"><title>cluster_toplabel</title>
<polygon fill="none" stroke="black" stroke-width="0" points="15,-158 15,-199 478,-199 478,-158 15,-158"/>
<text text-anchor="middle" x="246.5" y="-182.4" font-family="Sans" font-size="14.00">Orphan blocks have no known parent, so they can&#39;t be validated</text>
</g>
<!-- block0 -->
<g id="node2" class="node"><title>block0</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="108,-142 16,-142 16,-100 108,-100 108,-142"/>
<text text-anchor="middle" x="62" y="-125.4" font-family="Sans" font-size="14.00">1</text>
<text text-anchor="middle" x="62" y="-108.4" font-family="Sans" font-size="14.00">←Parent: 0</text>
</g>
<!-- block1 -->
<g id="node3" class="node"><title>block1</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="214,-142 122,-142 122,-100 214,-100 214,-142"/>
<text text-anchor="middle" x="168" y="-125.4" font-family="Sans" font-size="14.00">2</text>
<text text-anchor="middle" x="168" y="-108.4" font-family="Sans" font-size="14.00">←Parent: 1</text>
</g>
<!-- block0&#45;&gt;block1 -->
<g id="edge3" class="edge"><title>block0&#45;&gt;block1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M108.185,-121C109.328,-121 110.477,-121 111.627,-121"/>
<polygon fill="black" stroke="black" points="111.977,-124.5 121.977,-121 111.977,-117.5 111.977,-124.5"/>
</g>
<!-- block1_1 -->
<g id="node7" class="node"><title>block1_1</title>
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="214,-84 122,-84 122,-42 214,-42 214,-84"/>
<text text-anchor="middle" x="168" y="-67.4" font-family="Sans" font-size="14.00">2 (Stale)</text>
<text text-anchor="middle" x="168" y="-50.4" font-family="Sans" font-size="14.00">←Parent: 1</text>
</g>
<!-- block0&#45;&gt;block1_1 -->
<g id="edge6" class="edge"><title>block0&#45;&gt;block1_1</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M100.568,-99.8966C106.998,-96.3782 113.735,-92.692 120.359,-89.0675"/>
<polygon fill="black" stroke="black" points="122.19,-92.0555 129.283,-84.1849 118.83,-85.9146 122.19,-92.0555"/>
</g>
<!-- block2 -->
<g id="node4" class="node"><title>block2</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="320,-142 228,-142 228,-100 320,-100 320,-142"/>
<text text-anchor="middle" x="274" y="-125.4" font-family="Sans" font-size="14.00">3</text>
<text text-anchor="middle" x="274" y="-108.4" font-family="Sans" font-size="14.00">←Parent: 2</text>
</g>
<!-- block1&#45;&gt;block2 -->
<g id="edge4" class="edge"><title>block1&#45;&gt;block2</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M214.185,-121C215.328,-121 216.477,-121 217.627,-121"/>
<polygon fill="black" stroke="black" points="217.977,-124.5 227.977,-121 217.977,-117.5 217.977,-124.5"/>
</g>
<!-- block5 -->
<g id="node9" class="node"><title>block5</title>
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="476,-142 384,-142 384,-100 476,-100 476,-142"/>
<text text-anchor="middle" x="430" y="-125.4" font-family="Sans" font-size="14.00">5 (Orphan)</text>
<text text-anchor="middle" x="430" y="-108.4" font-family="Sans" font-size="14.00">←Parent: 4</text>
</g>
<!-- block2&#45;&gt;block5 -->
<!-- a -->
<!-- b -->
<!-- a&#45;&gt;b -->
<!-- c -->
<!-- b&#45;&gt;c -->
<!-- d -->
<!-- c&#45;&gt;d -->
<!-- e -->
<!-- d&#45;&gt;e -->
<!-- f -->
<!-- e&#45;&gt;f -->
<!-- g -->
<!-- f&#45;&gt;g -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB