digraph { size=6.25; rankdir=LR //splines = ortho; ranksep = 0.2; nodesep = 0.1; edge [ penwidth = 1.75, fontname="Sans" ] node [ penwidth = 1.75, shape = "box", fontname="Sans", label = "", width=0.3, height=0.3 ] graph [ penwidth = 1.75, fontname="Sans" ] invis1 [ shape = "none", label = "Blocks\nFrom\nUpgraded\nNodes" ] invis0 [ shape = "none", label = "Blocks\nFrom Non-\nUpgraded\nNodes" ]; subgraph cluster_honest { block0 [ label = "Follows\nOld\nRules" ]; block1 [ label = "Follows\nOld\nRules" ]; block2_1 [ label = "Follows Old Rules\nBut Violates\nNew Rules", style = "filled" ]; block2_1 -> block4 [ style = "invis", minlen = 2 ]; block4 [ label = "Follows\nOld\nRules" ]; style = "invis"; } subgraph cluster_attack { block2 [ label = "Follows\nOld & New\nRules" ]; block3 [ label = "Follows\nOld & New\nRules" ]; style = "invis" } invis0 -> block0 [ minlen = 2, style = "dashed" ]; block0 -> block1 -> block2 -> block3 -> block4; block1 -> block2_1 label = "A Soft Fork: Blocks Violating New Rules Are Made Stale By The Upgraded Mining Majority" }