From: Brian Warner <warner@lothar.com> Date: Sun, 22 Feb 2009 06:40:54 +0000 (-0700) Subject: docs: move many specification-like documents into specifications/ X-Git-Url: https://git.rkrishnan.org/%5B/frontends/%22file:/flags?a=commitdiff_plain;h=4ab3397992245cdff207041a424df14b450186dd;p=tahoe-lafs%2Ftahoe-lafs.git docs: move many specification-like documents into specifications/ --- diff --git a/docs/CHK-hashes.svg b/docs/CHK-hashes.svg deleted file mode 100644 index 22bd524f..00000000 --- a/docs/CHK-hashes.svg +++ /dev/null @@ -1,723 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.45.1" - sodipodi:docbase="/home/warner/trees/tahoe/docs" - sodipodi:docname="chk-hashes.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Mend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Mend" - style="overflow:visible;"> - <path - id="path3237" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.4) rotate(180) translate(10,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path3391" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.58344932" - inkscape:cx="372.04724" - inkscape:cy="526.18109" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="791" - inkscape:window-height="827" - inkscape:window-x="591" - inkscape:window-y="150" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g2168" - transform="translate(-8.75,0)"> - <rect - y="80.555412" - x="53.132294" - height="135.40164" - width="197.10367" - id="rect2160" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text2162" - y="108.97614" - x="151.88493" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="108.97614" - x="151.88493" - id="tspan2164" - sodipodi:role="line">data</tspan><tspan - id="tspan2166" - y="132.97614" - x="151.88493" - sodipodi:role="line">(plaintext)</tspan></text> - </g> - <g - id="g2190" - transform="translate(-0.25,0)"> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect2178" - width="197.10367" - height="135.40164" - x="44.632294" - y="324.55542" /> - <text - xml:space="preserve" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="143.38493" - y="352.97614" - id="text2180" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan2182" - x="143.38493" - y="352.97614">data</tspan><tspan - sodipodi:role="line" - x="143.38493" - y="376.97614" - id="tspan2184">(crypttext)</tspan></text> - </g> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect2198" - width="197.10367" - height="135.40164" - x="44.382294" - y="583.55542" /> - <text - xml:space="preserve" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="142.68532" - y="611.97614" - id="text2200" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - x="142.68532" - y="611.97614" - id="tspan2204">shares</tspan></text> - <g - id="g3193" - transform="translate(-10.413708,29.158381)"> - <path - transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - sodipodi:ry="20.567339" - sodipodi:rx="20.567339" - sodipodi:cy="133.6877" - sodipodi:cx="418.20258" - id="path2212" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <path - sodipodi:type="arc" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="path3185" - sodipodi:cx="418.20258" - sodipodi:cy="133.6877" - sodipodi:rx="20.567339" - sodipodi:ry="20.567339" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" /> - <path - transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - sodipodi:ry="20.567339" - sodipodi:rx="20.567339" - sodipodi:cy="133.6877" - sodipodi:cx="418.20258" - id="path3187" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <path - id="path3189" - d="M 396.76226,145.32825 L 407.17597,134.91454" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - <path - id="path3191" - d="M 433.21024,147.41099 L 423.8379,134.91454" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - </g> - <g - id="g3200" - transform="translate(-9.3723369,269.71503)"> - <path - sodipodi:type="arc" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="path3202" - sodipodi:cx="418.20258" - sodipodi:cy="133.6877" - sodipodi:rx="20.567339" - sodipodi:ry="20.567339" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" /> - <path - transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - sodipodi:ry="20.567339" - sodipodi:rx="20.567339" - sodipodi:cy="133.6877" - sodipodi:cx="418.20258" - id="path3204" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <path - sodipodi:type="arc" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="path3206" - sodipodi:cx="418.20258" - sodipodi:cy="133.6877" - sodipodi:rx="20.567339" - sodipodi:ry="20.567339" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 396.76226,145.32825 L 407.17597,134.91454" - id="path3208" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 433.21024,147.41099 L 423.8379,134.91454" - id="path3210" /> - </g> - <g - transform="translate(-6.2482246,538.38869)" - id="g3212"> - <path - transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - sodipodi:ry="20.567339" - sodipodi:rx="20.567339" - sodipodi:cy="133.6877" - sodipodi:cx="418.20258" - id="path3214" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <path - sodipodi:type="arc" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="path3216" - sodipodi:cx="418.20258" - sodipodi:cy="133.6877" - sodipodi:rx="20.567339" - sodipodi:ry="20.567339" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" /> - <path - transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" - d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" - sodipodi:ry="20.567339" - sodipodi:rx="20.567339" - sodipodi:cy="133.6877" - sodipodi:cx="418.20258" - id="path3218" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <path - id="path3220" - d="M 396.76226,145.32825 L 407.17597,134.91454" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - <path - id="path3222" - d="M 433.21024,147.41099 L 423.8379,134.91454" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - </g> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="399.88635" - y="110.96302" - id="text3224" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3226" - x="399.88635" - y="110.96302">plaintext</tspan><tspan - sodipodi:role="line" - x="399.88635" - y="130.96302" - id="tspan3228">hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="400.92773" - y="350.4783" - id="text3230" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3232" - x="400.92773" - y="350.4783">crypttext</tspan><tspan - sodipodi:role="line" - x="400.92773" - y="370.4783" - id="tspan3234">hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="405.09323" - y="618.1106" - id="text3236" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3238" - x="405.09323" - y="618.1106">share</tspan><tspan - sodipodi:role="line" - x="405.09323" - y="638.1106" - id="tspan3240">hash tree</tspan></text> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.05825377;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect3242" - width="207.32907" - height="421.5722" - x="527.92419" - y="161.13995" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="536.46478" - y="183.39211" - id="text3244" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3246" - x="536.46478" - y="183.39211">URI Extension Block</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="536.95264" - y="245.09413" - id="text3248" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3250" - x="536.95264" - y="245.09413">plaintext root</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="536.95264" - y="281.08698" - id="text3252" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3254" - x="536.95264" - y="281.08698">plaintext (flat) hash</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="540.59265" - y="435.34201" - id="text3256" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3258" - x="540.59265" - y="435.34201">crypttext root</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="540.59265" - y="483.33246" - id="text3260" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3262" - x="540.59265" - y="483.33246">crypttext (flat) hash</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="539.89264" - y="558.74603" - id="text3264" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3266" - x="539.89264" - y="558.74603">share root</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" - d="M 239.95229,183.39211 L 363.35632,183.39211" - id="path3383" /> - <path - id="path3583" - d="M 239.95229,425.05834 L 363.35632,425.05834" - style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" - d="M 239.95229,692.43375 L 363.35632,692.43375" - id="path3585" /> - <path - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 417.58968,150.5351 C 470.69959,151.57647 472.62807,183.93923 479.03055,202.60364 C 487.14356,226.25457 499.85797,233.58442 529.01635,241.13436" - id="path3589" - sodipodi:nodetypes="csz" /> - <path - sodipodi:nodetypes="csz" - id="path3591" - d="M 421.75516,391.09175 C 449.87218,392.13312 454.33789,400.8898 470.69958,411.91917 C 496.5159,429.32187 494.65112,422.07253 523.8095,429.62247" - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" /> - <path - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 420.71379,662.88952 C 420.71379,662.88952 471.01868,647.53267 473.30302,607.17618 C 475.6461,565.78169 496.083,554.97747 525.89224,551.46284" - id="path3595" - sodipodi:nodetypes="czz" /> - <path - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 241.59802,201.56227 C 288.98039,203.12433 310.58883,210.67426 381.1417,228.63791 C 451.69457,246.60156 477.72883,273.67719 523.80949,273.41685" - id="path3599" - sodipodi:nodetypes="czz" /> - <path - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 243.68076,448.36714 C 296.26998,448.88782 323.60597,457.47913 393.63815,465.02907 C 463.67033,472.57901 487.62186,479.8686 523.80949,478.56689" - id="path3601" - sodipodi:nodetypes="czz" /> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect3603" - width="611.87836" - height="109.69247" - x="54.846237" - y="807.26807" /> - <text - xml:space="preserve" - style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="329.71826" - y="910.10474" - id="text3605" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3607" - x="329.71826" - y="910.10474">URI</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="159.39687" - y="841.54694" - id="text3609" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3611" - x="159.39687" - y="841.54694">encryption</tspan><tspan - sodipodi:role="line" - x="159.39687" - y="861.54694" - id="tspan3613">key</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="359.92844" - y="842.72693" - id="text3615" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3617" - x="359.92844" - y="842.72693">storage</tspan><tspan - sodipodi:role="line" - x="359.92844" - y="862.72693" - id="tspan3619">index</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="570.74371" - y="844.42694" - id="text3621" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3623" - x="570.74371" - y="844.42694">UEB</tspan><tspan - sodipodi:role="line" - x="570.74371" - y="864.42694" - id="tspan3625">hash</tspan></text> - <path - style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:9,9;stroke-dashoffset:0;stroke-opacity:1" - d="M 267.37541,557.0321 L 315.36587,66.843852 L 740.4242,73.699632 L 740.4242,752.42182 L 418.20256,752.42182 L 416.48862,713.00109 L 356.50054,646.15724 L 310.22403,661.58274 L 190.24789,659.8688 L 191.96183,557.0321 L 267.37541,557.0321 z " - id="path3627" - sodipodi:nodetypes="ccccccccccc" /> - <path - style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 358.21449,824.40751 C 362.49935,783.27283 382.20972,758.84911 414.77467,740.42421" - id="path3629" - sodipodi:nodetypes="cz" /> - <path - style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 629.01779,582.74128 C 623.87595,661.15426 575.88549,723.71325 574.17154,814.12384" - id="path3631" - sodipodi:nodetypes="cz" /> - <g - id="g3434"> - <path - transform="translate(1.7139449,-5.1418348)" - d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1 101.12275,278.51605 A 36.849815 23.138256 0 1 1 174.82238 278.51605 z" - sodipodi:ry="23.138256" - sodipodi:rx="36.849815" - sodipodi:cy="278.51605" - sodipodi:cx="137.97256" - id="path3635" - style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3637" - y="281.24622" - x="115.93739" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="281.24622" - x="115.93739" - id="tspan3639" - sodipodi:role="line">AES</tspan></text> - </g> - <path - style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)" - d="M 133.6877,212.52917 L 135.40165,250.23596" - id="path3646" /> - <path - style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)" - d="M 138.82954,296.51247 L 138.82954,323.93559" - id="path3648" /> - <path - style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 147.39926,817.55173 C 123.40403,754.13577 56.155146,767.27832 30.851008,736.99632 C 4.7133492,705.71682 5.5877376,315.58243 32.564954,281.08697 C 58.702614,247.66504 65.129907,260.94812 101.12275,272.51724" - id="path3650" - sodipodi:nodetypes="czzz" /> - <g - id="g3426"> - <path - transform="translate(-1.7139449,243.38018)" - sodipodi:type="arc" - style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="path3219" - sodipodi:cx="137.97256" - sodipodi:cy="278.51605" - sodipodi:rx="36.849815" - sodipodi:ry="23.138256" - d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1 101.12275,278.51605 A 36.849815 23.138256 0 1 1 174.82238 278.51605 z" /> - <text - xml:space="preserve" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="112.5095" - y="529.76825" - id="text3221" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3223" - x="112.5095" - y="529.76825">FEC</tspan></text> - </g> - <path - id="path3445" - d="M 195.38972,855.25852 L 318.79375,855.25852" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - id="path3447" - d="M 133.68771,457.62329 L 133.68771,498.75797" - style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - d="M 133.68771,546.74843 L 133.68771,582.74127" - id="path3449" - sodipodi:nodetypes="cc" /> - <path - id="path3451" - d="M 99.408806,943.93737 L 147.39926,943.93737" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="65.129906" - y="953.42938" - id="text3453" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3455" - x="65.129906" - y="953.42938">A</tspan></text> - <text - xml:space="preserve" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="164.53871" - y="952.95337" - id="text3457" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - x="164.53871" - y="952.95337" - id="tspan3461">B :</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="217.67101" - y="952.95337" - id="text3465" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3467" - x="217.67101" - y="952.95337">B is derived from A by hashing, therefore B validates A</tspan></text> - <path - sodipodi:nodetypes="cc" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a10101;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 99.408806,969.64654 L 147.39926,969.64654" - id="path3469" /> - <text - sodipodi:linespacing="100%" - id="text3471" - y="979.13855" - x="65.129906" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="979.13855" - x="65.129906" - id="tspan3473" - sodipodi:role="line">A</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3475" - y="978.66254" - x="164.53871" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - id="tspan3477" - y="978.66254" - x="164.53871" - sodipodi:role="line">B :</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3479" - y="978.66254" - x="217.67101" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="978.66254" - x="217.67101" - id="tspan3481" - sodipodi:role="line">B is derived from A by encryption or erasure coding</tspan></text> - <path - id="path3483" - d="M 99.408806,997.06966 L 147.39926,997.06966" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="65.129906" - y="1006.5616" - id="text3485" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3487" - x="65.129906" - y="1006.5616">A</tspan></text> - <text - xml:space="preserve" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="164.53871" - y="1006.0856" - id="text3489" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - x="164.53871" - y="1006.0856" - id="tspan3491">B :</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="217.67101" - y="1006.0856" - id="text3493" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3495" - x="217.67101" - y="1006.0856">A is used as an index to retrieve data B</tspan></text> - <text - xml:space="preserve" - style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#1bcc03;fill-opacity:1;stroke:#1bcc03;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="625.5899" - y="740.42419" - id="text3497" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3499" - x="625.5899" - y="740.42419">SHARE</tspan></text> - <text - xml:space="preserve" - style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="249.20799" - y="30.851007" - id="text3501" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3503" - x="249.20799" - y="30.851007">CHK File Hashes</tspan></text> - </g> -</svg> diff --git a/docs/Makefile b/docs/Makefile index 04db86d8..49007217 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,7 +1,5 @@ -SOURCES = CHK-hashes.svg file-encoding1.svg file-encoding2.svg \ - file-encoding3.svg file-encoding4.svg file-encoding5.svg \ - file-encoding6.svg subtree1.svg lease-tradeoffs.svg +SOURCES = subtree1.svg lease-tradeoffs.svg PNGS = $(patsubst %.svg,%.png,$(SOURCES)) EPSS = $(patsubst %.svg,%.eps,$(SOURCES)) diff --git a/docs/URI-extension.txt b/docs/URI-extension.txt deleted file mode 100644 index 8ec383e0..00000000 --- a/docs/URI-extension.txt +++ /dev/null @@ -1,61 +0,0 @@ - -"URI Extension Block" - -This block is a serialized dictionary with string keys and string values -(some of which represent numbers, some of which are SHA-256 hashes). All -buckets hold an identical copy. The hash of the serialized data is kept in -the URI. - -The download process must obtain a valid copy of this data before any -decoding can take place. The download process must also obtain other data -before incremental validation can be performed. Full-file validation (for -clients who do not wish to do incremental validation) can be performed solely -with the data from this block. - -At the moment, this data block contains the following keys (and an estimate -on their sizes): - - size 5 - segment_size 7 - num_segments 2 - needed_shares 2 - total_shares 3 - - codec_name 3 - codec_params 5+1+2+1+3=12 - tail_codec_params 12 - - share_root_hash 32 (binary) or 52 (base32-encoded) each - plaintext_hash - plaintext_root_hash - crypttext_hash - crypttext_root_hash - -Some pieces are needed elsewhere (size should be visible without pulling the -block, the Tahoe3 algorithm needs total_shares to find the right peers, all -peer selection algorithms need needed_shares to ask a minimal set of peers). -Some pieces are arguably redundant but are convenient to have present -(test_encode.py makes use of num_segments). - -The rule for this data block is that it should be a constant size for all -files, regardless of file size. Therefore hash trees (which have a size that -depends linearly upon the number of segments) are stored elsewhere in the -bucket, with only the hash tree root stored in this data block. - -This block will be serialized as follows: - - assert that all keys match ^[a-zA-z_\-]+$ - sort all the keys lexicographically - for k in keys: - write("%s:" % k) - write(netstring(data[k])) - - -Serialized size: - - dense binary (but decimal) packing: 160+46=206 - including 'key:' (185) and netstring (6*3+7*4=46) on values: 231 - including 'key:%d\n' (185+13=198) and printable values (46+5*52=306)=504 - -We'll go with the 231-sized block, and provide a tool to dump it as text if -we really want one. diff --git a/docs/dirnodes.txt b/docs/dirnodes.txt deleted file mode 100644 index adc8fcab..00000000 --- a/docs/dirnodes.txt +++ /dev/null @@ -1,433 +0,0 @@ - -= Tahoe Directory Nodes = - -As explained in the architecture docs, Tahoe can be roughly viewed as a -collection of three layers. The lowest layer is the distributed filestore, or -DHT: it provides operations that accept files and upload them to the mesh, -creating a URI in the process which securely references the file's contents. -The middle layer is the filesystem, creating a structure of directories and -filenames resembling the traditional unix/windows filesystems. The top layer -is the application layer, which uses the lower layers to provide useful -services to users, like a backup application, or a way to share files with -friends. - -This document examines the middle layer, the "filesystem". - -== DHT Primitives == - -In the lowest layer (DHT), there are two operations that reference immutable -data (which we refer to as "CHK URIs" or "CHK read-capabilities" or "CHK -read-caps"). One puts data into the grid (but only if it doesn't exist -already), the other retrieves it: - - chk_uri = put(data) - data = get(chk_uri) - -We also have three operations which reference mutable data (which we refer to -as "mutable slots", or "mutable write-caps and read-caps", or sometimes "SSK -slots"). One creates a slot with some initial contents, a second replaces the -contents of a pre-existing slot, and the third retrieves the contents: - - mutable_uri = create(initial_data) - replace(mutable_uri, new_data) - data = get(mutable_uri) - -== Filesystem Goals == - -The main goal for the middle (filesystem) layer is to give users a way to -organize the data that they have uploaded into the mesh. The traditional way -to do this in computer filesystems is to put this data into files, give those -files names, and collect these names into directories. - -Each directory is a series of name-value pairs, which maps "child name" to an -object of some kind. Those child objects might be files, or they might be -other directories. - -The directory structure is therefore a directed graph of nodes, in which each -node might be a directory node or a file node. All file nodes are terminal -nodes. - -== Dirnode Goals == - -What properties might be desirable for these directory nodes? In no -particular order: - - 1: functional. Code which does not work doesn't count. - 2: easy to document, explain, and understand - 3: confidential: it should not be possible for others to see the contents of - a directory - 4: integrity: it should not be possible for others to modify the contents - of a directory - 5: available: directories should survive host failure, just like files do - 6: efficient: in storage, communication bandwidth, number of round-trips - 7: easy to delegate individual directories in a flexible way - 8: updateness: everybody looking at a directory should see the same contents - 9: monotonicity: everybody looking at a directory should see the same - sequence of updates - -Some of these goals are mutually exclusive. For example, availability and -consistency are opposing, so it is not possible to achieve #5 and #8 at the -same time. Moreover, it takes a more complex architecture to get close to the -available-and-consistent ideal, so #2/#6 is in opposition to #5/#8. - -Tahoe-0.7.0 introduced distributed mutable files, which use public key -cryptography for integrity, and erasure coding for availability. These -achieve roughly the same properties as immutable CHK files, but their -contents can be replaced without changing their identity. Dirnodes are then -just a special way of interpreting the contents of a specific mutable file. -Earlier releases used a "vdrive server": this server was abolished in the -0.7.0 release. - -For details of how mutable files work, please see "mutable.txt" in this -directory. - -For the current 0.7.0 release, we achieve most of our desired properties. The -integrity and availability of dirnodes is equivalent to that of regular -(immutable) files, with the exception that there are more simultaneous-update -failure modes for mutable slots. Delegation is quite strong: you can give -read-write or read-only access to any subtree, and the data format used for -dirnodes is such that read-only access is transitive: i.e. if you grant Bob -read-only access to a parent directory, then Bob will get read-only access -(and *not* read-write access) to its children. - -Relative to the previous "vdrive-server" based scheme, the current -distributed dirnode approach gives better availability, but cannot guarantee -updateness quite as well, and requires far more network traffic for each -retrieval and update. Mutable files are somewhat less available than -immutable files, simply because of the increased number of combinations -(shares of an immutable file are either present or not, whereas there are -multiple versions of each mutable file, and you might have some shares of -version 1 and other shares of version 2). In extreme cases of simultaneous -update, mutable files might suffer from non-monotonicity. - - -== Dirnode secret values == - -As mentioned before, dirnodes are simply a special way to interpret the -contents of a mutable file, so the secret keys and capability strings -described in "mutable.txt" are all the same. Each dirnode contains an RSA -public/private keypair, and the holder of the "write capability" will be able -to retrieve the private key (as well as the AES encryption key used for the -data itself). The holder of the "read capability" will be able to obtain the -public key and the AES data key, but not the RSA private key needed to modify -the data. - -The "write capability" for a dirnode grants read-write access to its -contents. This is expressed on concrete form as the "dirnode write cap": a -printable string which contains the necessary secrets to grant this access. -Likewise, the "read capability" grants read-only access to a dirnode, and can -be represented by a "dirnode read cap" string. - -For example, -URI:DIR2:swdi8ge1s7qko45d3ckkyw1aac%3Aar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o -is a write-capability URI, while -URI:DIR2-RO:buxjqykt637u61nnmjg7s8zkny:ar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o -is a read-capability URI, both for the same dirnode. - - -== Dirnode storage format == - -Each dirnode is stored in a single mutable file, distributed in the Tahoe -grid. The contents of this file are a serialized list of netstrings, one per -child. Each child is a list of four netstrings: (name, rocap, rwcap, -metadata). (remember that the contents of the mutable file are encrypted by -the read-cap, so this section describes the plaintext contents of the mutable -file, *after* it has been decrypted by the read-cap). - -The name is simple a UTF-8 -encoded child name. The 'rocap' is a read-only -capability URI to that child, either an immutable (CHK) file, a mutable file, -or a directory. The 'rwcap' is a read-write capability URI for that child, -encrypted with the dirnode's write-cap: this enables the "transitive -readonlyness" property, described further below. The 'metadata' is a -JSON-encoded dictionary of type,value metadata pairs. Some metadata keys are -pre-defined, the rest are left up to the application. - -Each rwcap is stored as IV + ciphertext + MAC. The IV is a 16-byte random -value. The ciphertext is obtained by using AES in CTR mode on the rwcap URI -string, using a key that is formed from a tagged hash of the IV and the -dirnode's writekey. The MAC is a 32-byte SHA-256 -based HMAC (using that same -AES key) over the (IV+ciphertext) pair. - -If Bob has read-only access to the 'bar' directory, and he adds it as a child -to the 'foo' directory, then he will put the read-only cap for 'bar' in both -the rwcap and rocap slots (encrypting the rwcap contents as described above). -If he has full read-write access to 'bar', then he will put the read-write -cap in the 'rwcap' slot, and the read-only cap in the 'rocap' slot. Since -other users who have read-only access to 'foo' will be unable to decrypt its -rwcap slot, this limits those users to read-only access to 'bar' as well, -thus providing the transitive readonlyness that we desire. - -=== Dirnode sizes, mutable-file initial read sizes === - -How big are dirnodes? When reading dirnode data out of mutable files, how -large should our initial read be? If we guess exactly, we can read a dirnode -in a single round-trip, and update one in two RTT. If we guess too high, -we'll waste some amount of bandwidth. If we guess low, we need to make a -second pass to get the data (or the encrypted privkey, for writes), which -will cost us at least another RTT. - -Assuming child names are between 10 and 99 characters long, how long are the -various pieces of a dirnode? - - netstring(name) ~= 4+len(name) - chk-cap = 97 (for 4-char filesizes) - dir-rw-cap = 88 - dir-ro-cap = 91 - netstring(cap) = 4+len(cap) - encrypted(cap) = 16+cap+32 - JSON({}) = 2 - JSON({ctime=float,mtime=float}): 57 - netstring(metadata) = 4+57 = 61 - -so a CHK entry is: - 5+ 4+len(name) + 4+97 + 5+16+97+32 + 4+57 -And a 15-byte filename gives a 336-byte entry. When the entry points at a -subdirectory instead of a file, the entry is a little bit smaller. So an -empty directory uses 0 bytes, a directory with one child uses about 336 -bytes, a directory with two children uses about 672, etc. - -When the dirnode data is encoding using our default 3-of-10, that means we -get 112ish bytes of data in each share per child. - -The pubkey, signature, and hashes form the first 935ish bytes of the -container, then comes our data, then about 1216 bytes of encprivkey. So if we -read the first: - - 1kB: we get 65bytes of dirnode data : only empty directories - 1kiB: 89bytes of dirnode data : maybe one short-named subdir - 2kB: 1065bytes: about 9 entries - 3kB: 2065bytes: about 18 entries, or 7.5 entries plus the encprivkey - 4kB: 3065bytes: about 27 entries, or about 16.5 plus the encprivkey - -So we've written the code to do an initial read of 2kB from each share when -we read the mutable file, which should give good performance (one RTT) for -small directories. - - -== Design Goals, redux == - -How well does this design meet the goals? - - #1 functional: YES: the code works and has extensive unit tests - #2 documentable: YES: this document is the existence proof - #3 confidential: YES: see below - #4 integrity: MOSTLY: a coalition of storage servers can rollback individual - mutable files, but not a single one. No server can - substitute fake data as genuine. - #5 availability: YES: as long as 'k' storage servers are present and have - the same version of the mutable file, the dirnode will - be available. - #6 efficient: MOSTLY: - network: single dirnode lookup is very efficient, since clients can - fetch specific keys rather than being required to get or set - the entire dirnode each time. Traversing many directories - takes a lot of roundtrips, and these can't be collapsed with - promise-pipelining because the intermediate values must only - be visible to the client. Modifying many dirnodes at once - (e.g. importing a large pre-existing directory tree) is pretty - slow, since each graph edge must be created independently. - storage: each child has a separate IV, which makes them larger than - if all children were aggregated into a single encrypted string - #7 delegation: VERY: each dirnode is a completely independent object, - to which clients can be granted separate read-write or - read-only access - #8 updateness: VERY: with only a single point of access, and no caching, - each client operation starts by fetching the current - value, so there are no opportunities for staleness - #9 monotonicity: VERY: the single point of access also protects against - retrograde motion - - - -=== Confidentiality leaks in the vdrive server === - -Dirnode (and the mutable files upon which they are based) are very private -against other clients: traffic between the client and the storage servers is -protected by the Foolscap SSL connection, so they can observe very little. -Storage index values are hashes of secrets and thus unguessable, and they are -not made public, so other clients cannot snoop through encrypted dirnodes -that they have not been told about. - -Storage servers can observe access patterns and see ciphertext, but they -cannot see the plaintext (of child names, metadata, or URIs). If an attacker -operates a significant number of storage servers, they can infer the shape of -the directory structure by assuming that directories are usually accessed -from root to leaf in rapid succession. Since filenames are usually much -shorter than read-caps and write-caps, the attacker can use the length of the -ciphertext to guess the number of children of each node, and might be able to -guess the length of the child names (or at least their sum). From this, the -attacker may be able to build up a graph with the same shape as the plaintext -filesystem, but with unlabeled edges and unknown file contents. - - -=== Integrity failures in the vdrive server === - -The mutable file's integrity mechanism (RSA signature on the hash of the file -contents) prevents the storage server from modifying the dirnode's contents -without detection. Therefore the storage servers can make the dirnode -unavailable, but not corrupt it. - -A sufficient number of colluding storage servers can perform a rollback -attack: replace all shares of the whole mutable file with an earlier version. -TODO: To prevent this, when retrieving the contents of a mutable file, the -client should query more servers than necessary and use the highest available -version number. This insures that one or two misbehaving storage servers -cannot cause this rollback on their own. - - -=== Improving the efficiency of dirnodes === - -The current mutable-file -based dirnode scheme suffers from certain -inefficiencies. A very large directory (with thousands or millions of -children) will take a significant time to extract any single entry, because -the whole file must be downloaded first, then parsed and searched to find the -desired child entry. Likewise, modifying a single child will require the -whole file to be re-uploaded. - -The current design assumes (and in some cases, requires) that dirnodes remain -small. The mutable files on which dirnodes are based are currently using -"SDMF" ("Small Distributed Mutable File") design rules, which state that the -size of the data shall remain below one megabyte. More advanced forms of -mutable files (MDMF and LDMF) are in the design phase to allow efficient -manipulation of larger mutable files. This would reduce the work needed to -modify a single entry in a large directory. - -Judicious caching may help improve the reading-large-directory case. Some -form of mutable index at the beginning of the dirnode might help as well. The -MDMF design rules allow for efficient random-access reads from the middle of -the file, which would give the index something useful to point at. - -The current SDMF design generates a new RSA public/private keypair for each -directory. This takes considerable time and CPU effort, generally one or two -seconds per directory. We have designed (but not yet built) a DSA-based -mutable file scheme which will use shared parameters to reduce the -directory-creation effort to a bare minimum (picking a random number instead -of generating two random primes). - - -When a backup program is run for the first time, it needs to copy a large -amount of data from a pre-existing filesystem into reliable storage. This -means that a large and complex directory structure needs to be duplicated in -the dirnode layer. With the one-object-per-dirnode approach described here, -this requires as many operations as there are edges in the imported -filesystem graph. - -Another approach would be to aggregate multiple directories into a single -storage object. This object would contain a serialized graph rather than a -single name-to-child dictionary. Most directory operations would fetch the -whole block of data (and presumeably cache it for a while to avoid lots of -re-fetches), and modification operations would need to replace the whole -thing at once. This "realm" approach would have the added benefit of -combining more data into a single encrypted bundle (perhaps hiding the shape -of the graph from a determined attacker), and would reduce round-trips when -performing deep directory traversals (assuming the realm was already cached). -It would also prevent fine-grained rollback attacks from working: a coalition -of storage servers could change the entire realm to look like an earlier -state, but it could not independently roll back individual directories. - -The drawbacks of this aggregation would be that small accesses (adding a -single child, looking up a single child) would require pulling or pushing a -lot of unrelated data, increasing network overhead (and necessitating -test-and-set semantics for the modification side, which increases the chances -that a user operation will fail, making it more challenging to provide -promises of atomicity to the user). - -It would also make it much more difficult to enable the delegation -("sharing") of specific directories. Since each aggregate "realm" provides -all-or-nothing access control, the act of delegating any directory from the -middle of the realm would require the realm first be split into the upper -piece that isn't being shared and the lower piece that is. This splitting -would have to be done in response to what is essentially a read operation, -which is not traditionally supposed to be a high-effort action. On the other -hand, it may be possible to aggregate the ciphertext, but use distinct -encryption keys for each component directory, to get the benefits of both -schemes at once. - - -=== Dirnode expiration and leases === - -Dirnodes are created any time a client wishes to add a new directory. How -long do they live? What's to keep them from sticking around forever, taking -up space that nobody can reach any longer? - -Mutable files are created with limited-time "leases", which keep the shares -alive until the last lease has expired or been cancelled. Clients which know -and care about specific dirnodes can ask to keep them alive for a while, by -renewing a lease on them (with a typical period of one month). Clients are -expected to assist in the deletion of dirnodes by canceling their leases as -soon as they are done with them. This means that when a client deletes a -directory, it should also cancel its lease on that directory. When the lease -count on a given share goes to zero, the storage server can delete the -related storage. Multiple clients may all have leases on the same dirnode: -the server may delete the shares only after all of the leases have gone away. - -We expect that clients will periodically create a "manifest": a list of -so-called "refresh capabilities" for all of the dirnodes and files that they -can reach. They will give this manifest to the "repairer", which is a service -that keeps files (and dirnodes) alive on behalf of clients who cannot take on -this responsibility for themselves. These refresh capabilities include the -storage index, but do *not* include the readkeys or writekeys, so the -repairer does not get to read the files or directories that it is helping to -keep alive. - -After each change to the user's vdrive, the client creates a manifest and -looks for differences from their previous version. Anything which was removed -prompts the client to send out lease-cancellation messages, allowing the data -to be deleted. - - -== Starting Points: root dirnodes == - -Any client can record the URI of a directory node in some external form (say, -in a local file) and use it as the starting point of later traversal. Each -Tahoe user is expected to create a new (unattached) dirnode when they first -start using the grid, and record its URI for later use. - -== Mounting and Sharing Directories == - -The biggest benefit of this dirnode approach is that sharing individual -directories is almost trivial. Alice creates a subdirectory that she wants to -use to share files with Bob. This subdirectory is attached to Alice's -filesystem at "~alice/share-with-bob". She asks her filesystem for the -read-write directory URI for that new directory, and emails it to Bob. When -Bob receives the URI, he asks his own local vdrive to attach the given URI, -perhaps at a place named "~bob/shared-with-alice". Every time either party -writes a file into this directory, the other will be able to read it. If -Alice prefers, she can give a read-only URI to Bob instead, and then Bob will -be able to read files but not change the contents of the directory. Neither -Alice nor Bob will get access to any files above the mounted directory: there -are no 'parent directory' pointers. If Alice creates a nested set of -directories, "~alice/share-with-bob/subdir2", and gives a read-only URI to -share-with-bob to Bob, then Bob will be unable to write to either -share-with-bob/ or subdir2/. - -A suitable UI needs to be created to allow users to easily perform this -sharing action: dragging a folder their vdrive to an IM or email user icon, -for example. The UI will need to give the sending user an opportunity to -indicate whether they want to grant read-write or read-only access to the -recipient. The recipient then needs an interface to drag the new folder into -their vdrive and give it a home. - -== Revocation == - -When Alice decides that she no longer wants Bob to be able to access the -shared directory, what should she do? Suppose she's shared this folder with -both Bob and Carol, and now she wants Carol to retain access to it but Bob to -be shut out. Ideally Carol should not have to do anything: her access should -continue unabated. - -The current plan is to have her client create a deep copy of the folder in -question, delegate access to the new folder to the remaining members of the -group (Carol), asking the lucky survivors to replace their old reference with -the new one. Bob may still have access to the old folder, but he is now the -only one who cares: everyone else has moved on, and he will no longer be able -to see their new changes. In a strict sense, this is the strongest form of -revocation that can be accomplished: there is no point trying to force Bob to -forget about the files that he read a moment before being kicked out. In -addition it must be noted that anyone who can access the directory can proxy -for Bob, reading files to him and accepting changes whenever he wants. -Preventing delegation between communication parties is just as pointless as -asking Bob to forget previously accessed files. However, there may be value -to configuring the UI to ask Carol to not share files with Bob, or to -removing all files from Bob's view at the same time his access is revoked. - diff --git a/docs/file-encoding.txt b/docs/file-encoding.txt deleted file mode 100644 index 23862ead..00000000 --- a/docs/file-encoding.txt +++ /dev/null @@ -1,148 +0,0 @@ - -== FileEncoding == - -When the client wishes to upload an immutable file, the first step is to -decide upon an encryption key. There are two methods: convergent or random. -The goal of the convergent-key method is to make sure that multiple uploads -of the same file will result in only one copy on the grid, whereas the -random-key method does not provide this "convergence" feature. - -The convergent-key method computes the SHA-256d hash of a single-purpose tag, -the encoding parameters, a "convergence secret", and the contents of the -file. It uses a portion of the resulting hash as the AES encryption key. -There are security concerns with using convergence this approach (the -"partial-information guessing attack", please see ticket #365 for some -references), so Tahoe uses a separate (randomly-generated) "convergence -secret" for each node, stored in NODEDIR/private/convergence . The encoding -parameters (k, N, and the segment size) are included in the hash to make sure -that two different encodings of the same file will get different keys. This -method requires an extra IO pass over the file, to compute this key, and -encryption cannot be started until the pass is complete. This means that the -convergent-key method will require at least two total passes over the file. - -The random-key method simply chooses a random encryption key. Convergence is -disabled, however this method does not require a separate IO pass, so upload -can be done with a single pass. This mode makes it easier to perform -streaming upload. - -Regardless of which method is used to generate the key, the plaintext file is -encrypted (using AES in CTR mode) to produce a ciphertext. This ciphertext is -then erasure-coded and uploaded to the servers. Two hashes of the ciphertext -are generated as the encryption proceeds: a flat hash of the whole -ciphertext, and a Merkle tree. These are used to verify the correctness of -the erasure decoding step, and can be used by a "verifier" process to make -sure the file is intact without requiring the decryption key. - -The encryption key is hashed (with SHA-256d and a single-purpose tag) to -produce the "Storage Index". This Storage Index (or SI) is used to identify -the shares produced by the method described below. The grid can be thought of -as a large table that maps Storage Index to a ciphertext. Since the -ciphertext is stored as erasure-coded shares, it can also be thought of as a -table that maps SI to shares. - -Anybody who knows a Storage Index can retrieve the associated ciphertext: -ciphertexts are not secret. - - -[[Image(file-encoding1.png)]] - -The ciphertext file is then broken up into segments. The last segment is -likely to be shorter than the rest. Each segment is erasure-coded into a -number of "blocks". This takes place one segment at a time. (In fact, -encryption and erasure-coding take place at the same time, once per plaintext -segment). Larger segment sizes result in less overhead overall, but increase -both the memory footprint and the "alacrity" (the number of bytes we have to -receive before we can deliver validated plaintext to the user). The current -default segment size is 128KiB. - -One block from each segment is sent to each shareholder (aka leaseholder, -aka landlord, aka storage node, aka peer). The "share" held by each remote -shareholder is nominally just a collection of these blocks. The file will -be recoverable when a certain number of shares have been retrieved. - -[[Image(file-encoding2.png)]] - -The blocks are hashed as they are generated and transmitted. These -block hashes are put into a Merkle hash tree. When the last share has been -created, the merkle tree is completed and delivered to the peer. Later, when -we retrieve these blocks, the peer will send many of the merkle hash tree -nodes ahead of time, so we can validate each block independently. - -The root of this block hash tree is called the "block root hash" and -used in the next step. - -[[Image(file-encoding3.png)]] - -There is a higher-level Merkle tree called the "share hash tree". Its leaves -are the block root hashes from each share. The root of this tree is called -the "share root hash" and is included in the "URI Extension Block", aka UEB. -The ciphertext hash and Merkle tree are also put here, along with the -original file size, and the encoding parameters. The UEB contains all the -non-secret values that could be put in the URI, but would have made the URI -too big. So instead, the UEB is stored with the share, and the hash of the -UEB is put in the URI. - -The URI then contains the secret encryption key and the UEB hash. It also -contains the basic encoding parameters (k and N) and the file size, to make -download more efficient (by knowing the number of required shares ahead of -time, sufficient download queries can be generated in parallel). - -The URI (also known as the immutable-file read-cap, since possessing it -grants the holder the capability to read the file's plaintext) is then -represented as a (relatively) short printable string like so: - - URI:CHK:auxet66ynq55naiy2ay7cgrshm:6rudoctmbxsmbg7gwtjlimd6umtwrrsxkjzthuldsmo4nnfoc6fa:3:10:1000000 - -[[Image(file-encoding4.png)]] - -During download, when a peer begins to transmit a share, it first transmits -all of the parts of the share hash tree that are necessary to validate its -block root hash. Then it transmits the portions of the block hash tree -that are necessary to validate the first block. Then it transmits the -first block. It then continues this loop: transmitting any portions of the -block hash tree to validate block#N, then sending block#N. - -[[Image(file-encoding5.png)]] - -So the "share" that is sent to the remote peer actually consists of three -pieces, sent in a specific order as they become available, and retrieved -during download in a different order according to when they are needed. - -The first piece is the blocks themselves, one per segment. The last -block will likely be shorter than the rest, because the last segment is -probably shorter than the rest. The second piece is the block hash tree, -consisting of a total of two SHA-1 hashes per block. The third piece is a -hash chain from the share hash tree, consisting of log2(numshares) hashes. - -During upload, all blocks are sent first, followed by the block hash -tree, followed by the share hash chain. During download, the share hash chain -is delivered first, followed by the block root hash. The client then uses -the hash chain to validate the block root hash. Then the peer delivers -enough of the block hash tree to validate the first block, followed by -the first block itself. The block hash chain is used to validate the -block, then it is passed (along with the first block from several other -peers) into decoding, to produce the first segment of crypttext, which is -then decrypted to produce the first segment of plaintext, which is finally -delivered to the user. - -[[Image(file-encoding6.png)]] - -== Hashes == - -All hashes use SHA-256d, as defined in Practical Cryptography (by Ferguson -and Schneier). All hashes use a single-purpose tag, e.g. the hash that -converts an encryption key into a storage index is defined as follows: - - SI = SHA256d(netstring("allmydata_immutable_key_to_storage_index_v1") + key) - -When two separate values need to be combined together in a hash, we wrap each -in a netstring. - -Using SHA-256d (instead of plain SHA-256) guards against length-extension -attacks. Using the tag protects our Merkle trees against attacks in which the -hash of a leaf is confused with a hash of two children (allowing an attacker -to generate corrupted data that nevertheless appears to be valid), and is -simply good "cryptograhic hygiene". The "Chosen Protocol Attack" by Kelsey, -Schneier, and Wagner (http://www.schneier.com/paper-chosen-protocol.html) is -relevant. Putting the tag in a netstring guards against attacks that seek to -confuse the end of the tag with the beginning of the subsequent value. diff --git a/docs/file-encoding1.svg b/docs/file-encoding1.svg deleted file mode 100644 index 06b702a2..00000000 --- a/docs/file-encoding1.svg +++ /dev/null @@ -1,435 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/warner/trees/tahoe/docs" - sodipodi:docname="file-encoding1.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Mend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Mend" - style="overflow:visible;"> - <path - id="path3252" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.4) rotate(180) translate(10,0)" /> - </marker> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective81" /> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.0395661" - inkscape:cx="631.22458" - inkscape:cy="706.27996" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="1680" - inkscape:window-height="1050" - inkscape:window-x="0" - inkscape:window-y="0" - showgrid="false" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g3081" - transform="translate(-198.1596,-0.9619396)"> - <rect - y="17.505058" - x="210.76614" - height="78.85553" - width="305.95944" - id="rect1872" - style="fill:#e3f4d7;stroke:#000000;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text1874" - y="44.315933" - x="258.83313" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="44.315933" - x="258.83313" - id="tspan3079" - sodipodi:role="line">FILE (plaintext)</tspan></text> - </g> - <g - id="g4629" - transform="translate(-8.6574585,46.173112)"> - <rect - style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" - id="rect3033" - width="116.35974" - height="73.956482" - x="442.19803" - y="243.98456" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="501.92212" - y="264.25281" - id="text3035" - sodipodi:linespacing="100%"><tspan - y="264.25281" - x="501.92212" - id="tspan3047" - sodipodi:role="line">convergent</tspan><tspan - id="tspan4627" - y="284.25281" - x="501.92212" - sodipodi:role="line">encryption</tspan><tspan - y="304.25281" - x="501.92212" - sodipodi:role="line" - id="tspan4604">key</tspan></text> - </g> - <g - id="g3139" - transform="translate(-122.35224,48.551816)"> - <path - transform="matrix(0.923205,0,0,0.923205,-231.4625,247.6493)" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3128" - style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3130" - y="434.10446" - x="299.26846" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="434.10446" - x="299.26846" - id="tspan3137" - sodipodi:role="line">AES-CTR</tspan></text> - </g> - <g - id="g3201" - transform="translate(-129.86188,50.020871)"> - <rect - style="fill:#d5e5ff;stroke:#000000;stroke-width:0.96806562;stroke-opacity:1" - id="rect3154" - width="286.73019" - height="78.85553" - x="196.96533" - y="521.95709" /> - <text - transform="scale(0.968066,1.032988)" - xml:space="preserve" - style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="249.83606" - y="531.24384" - id="text3156" - sodipodi:linespacing="100%"><tspan - y="531.24384" - x="249.83606" - id="tspan3163" - sodipodi:role="line">FILE (crypttext)</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 208.10132,509.1107 L 208.10132,568.80529" - id="path3170" - sodipodi:nodetypes="cc" /> - <g - id="g4640" - transform="translate(447.30202,-236.63721)"> - <rect - y="755.01099" - x="24.107248" - height="28.084265" - width="36.708984" - id="rect3195" - style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3197" - y="771.30011" - x="32.327164" - style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="771.30011" - x="32.327164" - id="tspan3246" - sodipodi:role="line">tag</tspan></text> - </g> - <g - id="g4661" - transform="translate(1.9238797,4.8096992)"> - <rect - y="702.01349" - x="514.47058" - height="55.723186" - width="100.84161" - id="rect3237" - style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3239" - y="724.94507" - x="564.60577" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="724.94507" - x="564.60577" - id="tspan3253" - sodipodi:role="line">storage</tspan><tspan - id="tspan4659" - y="744.94507" - x="564.60577" - sodipodi:role="line">index</tspan></text> - </g> - <g - id="g3212" - transform="translate(-96.193983,-7.2527756)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" - id="path3214" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" /> - <text - xml:space="preserve" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="548.34637" - y="181.94142" - id="text3216" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3218" - x="548.34637" - y="181.94142">SHA-256</tspan></text> - </g> - <g - transform="translate(-9.1639282,440.10771)" - id="g3220"> - <path - transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3222" - style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3224" - y="181.94142" - x="548.34637" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="181.94142" - x="548.34637" - id="tspan3226" - sodipodi:role="line">SHA-256</tspan></text> - </g> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 320.32596,46.173119 C 407.86248,54.830577 448.26397,96.193988 468.4647,138.51934" - id="path2462" - sodipodi:nodetypes="cz" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 200.08348,97.15593 C 198.48026,294.3536 195.91508,353.03192 205.85512,444.41621" - id="path4024" - sodipodi:nodetypes="cs" /> - <g - id="g4558" - transform="translate(141.40516,-11.543278)"> - <rect - y="125.18694" - x="220.07802" - height="36.436913" - width="55.42865" - id="rect4549" - style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text4551" - y="145.6524" - x="237.65776" - style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan4553" - x="237.65776" - y="145.6524">tag</tspan></text> - </g> - <path - sodipodi:nodetypes="cz" - id="path4563" - d="M 416.51994,129.86189 C 429.9871,127.93801 436.72069,133.70964 452.11173,151.9865" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - <g - id="g4576" - transform="translate(12.505218,-12.505218)"> - <rect - style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" - id="rect4567" - width="161.24203" - height="40.284672" - x="481.72565" - y="69.394432" /> - <text - xml:space="preserve" - style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="498.39401" - y="92.476768" - id="text4569" - sodipodi:linespacing="100%"><tspan - y="92.476768" - x="498.39401" - id="tspan4571" - sodipodi:role="line">encoding parameters</tspan></text> - </g> - <path - sodipodi:nodetypes="cz" - id="path4581" - d="M 564.65868,98.11787 C 565.62061,128.89994 533.87661,132.7477 507.90423,147.1768" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 479.04603,201.04543 C 487.70348,234.71332 489.62738,252.99018 491.55126,288.58195" - id="path4583" - sodipodi:nodetypes="cz" /> - <g - id="g4616" - transform="translate(16.352977,64.449968)"> - <rect - y="227.63158" - x="583.60315" - height="71.070618" - width="119.24558" - id="rect4587" - style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text4589" - y="246.66689" - x="644.2406" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan4591" - x="644.2406" - y="246.66689">random</tspan><tspan - id="tspan4600" - sodipodi:role="line" - x="644.2406" - y="266.66687">encryption</tspan><tspan - id="tspan4602" - sodipodi:role="line" - x="644.2406" - y="286.66687">key</tspan></text> - </g> - <path - sodipodi:nodetypes="cz" - id="path4593" - d="M 486.74156,365.53714 C 480.96991,415.55801 289.54389,464.61694 241.4469,469.42664" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 654.1191,362.65133 C 625.26089,454.03561 275.1148,476.16022 241.4469,480.00798" - id="path4595" - sodipodi:nodetypes="cz" /> - <text - xml:space="preserve" - style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier 10 Pitch" - x="561.77289" - y="335.71701" - id="text4636" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan4638" - x="561.77289" - y="335.71701">or</tspan></text> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 485.77962,367.46102 C 496.36095,429.98711 582.93553,528.10497 576.20196,584.85942" - id="path4645" - sodipodi:nodetypes="cz" /> - <path - sodipodi:nodetypes="cz" - id="path4647" - d="M 654.1191,364.57521 C 642.57581,418.44383 597.36465,548.3057 582.93554,585.82136" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 507.90424,532.91467 C 534.83855,543.49601 533.87661,566.58256 548.30571,589.66912" - id="path4649" - sodipodi:nodetypes="cz" /> - <path - sodipodi:nodetypes="cz" - id="path4651" - d="M 564.65869,648.34745 C 568.50644,671.43401 569.46838,687.78698 569.46838,704.13996" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - </g> -</svg> diff --git a/docs/file-encoding2.svg b/docs/file-encoding2.svg deleted file mode 100644 index 6db3de37..00000000 --- a/docs/file-encoding2.svg +++ /dev/null @@ -1,922 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.45" - sodipodi:docbase="/home/warner/trees/tahoe/docs" - sodipodi:docname="file-encoding2.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.51978303" - inkscape:cx="372.04724" - inkscape:cy="526.18109" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="900" - inkscape:window-height="756" - inkscape:window-x="779" - inkscape:window-y="153" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g3201" - transform="translate(-5.78221,-477.996)"> - <rect - style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" - id="rect3154" - width="286.73019" - height="78.85553" - x="196.96533" - y="521.95709" /> - <text - transform="scale(0.968066,1.032988)" - xml:space="preserve" - style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="249.83606" - y="531.24384" - id="text3156" - sodipodi:linespacing="100%"><tspan - y="531.24384" - x="249.83606" - id="tspan3163" - sodipodi:role="line">FILE (crypttext)</tspan></text> - </g> - <g - id="g2022"> - <rect - y="214.548" - x="40.845631" - height="80.782936" - width="80.498047" - id="rect3273" - style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3275" - y="255.87878" - x="56.581703" - style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve" - transform="scale(0.968066,1.032988)"><tspan - y="255.87878" - x="56.581703" - id="tspan1993" - sodipodi:role="line">segA</tspan></text> - </g> - <g - id="g2017"> - <rect - style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" - id="rect3284" - width="80.498047" - height="80.782936" - x="161.45784" - y="214.548" /> - <text - transform="scale(0.968066,1.032988)" - xml:space="preserve" - style="font-size:28;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="184.53419" - y="251.69087" - id="text3286" - sodipodi:linespacing="100%"><tspan - y="251.69087" - x="184.53419" - id="tspan1995" - sodipodi:role="line">segB</tspan></text> - </g> - <g - id="g2012"> - <rect - y="214.548" - x="282.07007" - height="80.782936" - width="80.498047" - id="rect3290" - style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3292" - y="253.62892" - x="304.44913" - style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve" - transform="scale(0.968066,1.032988)"><tspan - y="253.62892" - x="304.44913" - id="tspan1997" - sodipodi:role="line">segC</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 223.51231,125.60384 L 88.587195,212.82815" - id="path4243" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 297.10782,124.24096 L 205.79487,215.55391" - id="path4245" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 373.4291,122.87808 L 325.7283,212.82816" - id="path4247" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 458.9333,124.24096 L 443.56317,216.05143" - id="path4249" - sodipodi:nodetypes="cc" /> - <rect - y="214.548" - x="422.02194" - height="80.782951" - width="61.22403" - id="rect3296" - style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3298" - y="253.42572" - x="440.45892" - style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve" - transform="scale(0.968066,1.032988)"><tspan - sodipodi:role="line" - id="tspan1999" - x="440.45892" - y="253.42572">segD</tspan></text> - <rect - style="fill:white;fill-opacity:1;stroke:black;stroke-width:0.96806562;stroke-opacity:1" - id="rect3308" - width="32.312965" - height="80.782936" - x="484.21405" - y="214.548" /> - <g - id="g2040" - transform="translate(-16.41804,-13.31249)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path2029" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" /> - <text - xml:space="preserve" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="84.763" - y="377.10425" - id="text2031" - sodipodi:linespacing="100%"><tspan - y="377.10425" - x="84.763" - id="tspan2038" - sodipodi:role="line">FEC</tspan></text> - </g> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect2045" - width="62.568695" - height="54.581161" - x="106.49989" - y="400.05042" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="114.42955" - y="424.05099" - id="text2932" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan2934" - x="114.42955" - y="424.05099">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="126.88751" - y="445.35098" - id="text2936" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan2938" - x="126.88751" - y="445.35098">A1</tspan></text> - <rect - ry="0" - y="471.49408" - x="106.49989" - height="54.581161" - width="62.568695" - id="rect2956" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text2960" - y="495.49466" - x="114.42955" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3869" - x="114.42955" - y="495.49466">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text2964" - y="516.79468" - x="126.88751" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3018" - x="126.88751" - y="516.79468">A2</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect2970" - width="62.568695" - height="54.581161" - x="106.49989" - y="542.93781" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="114.42955" - y="566.93835" - id="text2974" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan2976" - x="114.42955" - y="566.93835">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="126.88751" - y="588.23834" - id="text2978" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3040" - x="126.88751" - y="588.23834">A3</tspan></text> - <rect - ry="0" - y="614.38141" - x="106.49989" - height="54.581161" - width="62.568695" - id="rect2984" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text2988" - y="638.38196" - x="114.42955" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="638.38196" - x="114.42955" - id="tspan2990" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text2992" - y="659.68195" - x="126.88751" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3042" - x="126.88751" - y="659.68195">A4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 79.874914,296.213 L 79.874914,326.83172" - id="path2996" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 90.524902,388.06915 C 85.442028,403.37176 95.420905,411.5033 105.16864,424.01286" - id="path3000" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 82.537411,389.4004 C 77.419162,441.79407 81.801856,464.47336 103.83739,495.90028" - id="path3002" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 71.887422,389.4004 C 62.3162,464.27336 66.595451,538.86154 105.16864,573.1127" - id="path3004" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 59.906185,384.0754 C 30.833264,497.98462 73.280777,611.91471 105.16864,643.66887" - id="path3006" - sodipodi:nodetypes="cc" /> - <g - transform="translate(114.1248,-13.31249)" - id="g3090"> - <path - transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3092" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3094" - y="377.10425" - x="84.763" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3096" - x="84.763" - y="377.10425">FEC</tspan></text> - </g> - <rect - ry="0" - y="400.05042" - x="237.04271" - height="54.581161" - width="62.568695" - id="rect3098" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3100" - y="424.05099" - x="244.97237" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="424.05099" - x="244.97237" - id="tspan3102" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3104" - y="445.35098" - x="257.43033" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3266" - x="257.43033" - y="445.35098">B1</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3108" - width="62.568695" - height="54.581161" - x="237.04271" - y="471.49408" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="244.97237" - y="495.49466" - id="text3110" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3112" - x="244.97237" - y="495.49466">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="257.43033" - y="516.79468" - id="text3114" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3268" - x="257.43033" - y="516.79468">B2</tspan></text> - <rect - ry="0" - y="542.93781" - x="237.04271" - height="54.581161" - width="62.568695" - id="rect3118" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3120" - y="566.93835" - x="244.97237" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="566.93835" - x="244.97237" - id="tspan3122" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3124" - y="588.23834" - x="257.43033" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3270" - x="257.43033" - y="588.23834">B3</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3128" - width="62.568695" - height="54.581161" - x="237.04271" - y="614.38141" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="244.97237" - y="638.38196" - id="text3130" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3132" - x="244.97237" - y="638.38196">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="257.43033" - y="659.68195" - id="text3134" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3272" - x="257.43033" - y="659.68195">B4</tspan></text> - <path - id="path3138" - d="M 210.41773,296.213 L 210.41773,326.83172" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3140" - d="M 221.06772,388.06915 C 215.98484,403.37176 225.96372,411.5033 235.71146,424.01286" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3142" - d="M 213.08023,389.4004 C 207.96198,441.79407 212.34467,464.47336 234.38021,495.90028" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3144" - d="M 202.43024,389.4004 C 192.85902,464.27336 197.13827,538.86154 235.71146,573.1127" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3146" - d="M 190.449,384.0754 C 161.37608,497.98462 203.82359,611.91471 235.71146,643.66887" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <g - id="g3148" - transform="translate(241.4443,-13.31249)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3150" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" /> - <text - xml:space="preserve" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="84.763" - y="377.10425" - id="text3152" - sodipodi:linespacing="100%"><tspan - y="377.10425" - x="84.763" - id="tspan3154" - sodipodi:role="line">FEC</tspan></text> - </g> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3156" - width="62.568695" - height="54.581161" - x="364.36224" - y="400.05042" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="372.2919" - y="424.05099" - id="text3158" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3160" - x="372.2919" - y="424.05099">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="384.74988" - y="445.35098" - id="text3162" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3274" - x="384.74988" - y="445.35098">C1</tspan></text> - <rect - ry="0" - y="471.49408" - x="364.36224" - height="54.581161" - width="62.568695" - id="rect3166" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3168" - y="495.49466" - x="372.2919" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="495.49466" - x="372.2919" - id="tspan3170" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3172" - y="516.79468" - x="384.74988" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3278" - x="384.74988" - y="516.79468">C2</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3176" - width="62.568695" - height="54.581161" - x="364.36224" - y="542.93781" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="372.2919" - y="566.93835" - id="text3178" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3180" - x="372.2919" - y="566.93835">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="384.74988" - y="588.23834" - id="text3182" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3280" - x="384.74988" - y="588.23834">C3</tspan></text> - <rect - ry="0" - y="614.38141" - x="364.36224" - height="54.581161" - width="62.568695" - id="rect3186" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3188" - y="638.38196" - x="372.2919" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="638.38196" - x="372.2919" - id="tspan3190" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3192" - y="659.68195" - x="384.74988" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3282" - x="384.74988" - y="659.68195">C4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 337.73727,296.213 L 337.73727,326.83172" - id="path3196" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 348.38726,388.06915 C 343.30438,403.37176 353.28326,411.5033 363.031,424.01286" - id="path3198" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 340.39977,389.4004 C 335.28152,441.79407 339.66421,464.47336 361.69975,495.90028" - id="path3200" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 329.74978,389.4004 C 320.17856,464.27336 324.45781,538.86154 363.031,573.1127" - id="path3202" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 317.76854,384.0754 C 288.69562,497.98462 331.14313,611.91471 363.031,643.66887" - id="path3204" - sodipodi:nodetypes="cc" /> - <g - transform="translate(370.3755,-13.31249)" - id="g3207"> - <path - transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3209" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3211" - y="377.10425" - x="84.763" - style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3213" - x="84.763" - y="377.10425">FEC</tspan></text> - </g> - <rect - ry="0" - y="400.05042" - x="493.29343" - height="54.581161" - width="62.568695" - id="rect3215" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3217" - y="424.05099" - x="501.22308" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="424.05099" - x="501.22308" - id="tspan3219" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3221" - y="445.35098" - x="513.68103" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3284" - x="513.68103" - y="445.35098">D1</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3225" - width="62.568695" - height="54.581161" - x="493.29343" - y="471.49408" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="501.22308" - y="495.49466" - id="text3227" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3229" - x="501.22308" - y="495.49466">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="513.68103" - y="516.79468" - id="text3231" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3286" - x="513.68103" - y="516.79468">D2</tspan></text> - <rect - ry="0" - y="542.93781" - x="493.29343" - height="54.581161" - width="62.568695" - id="rect3235" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3237" - y="566.93835" - x="501.22308" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="566.93835" - x="501.22308" - id="tspan3239" - sodipodi:role="line">block</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3241" - y="588.23834" - x="513.68103" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3288" - x="513.68103" - y="588.23834">D3</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3245" - width="62.568695" - height="54.581161" - x="493.29343" - y="614.38141" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="501.22308" - y="638.38196" - id="text3247" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3249" - x="501.22308" - y="638.38196">block</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="513.68103" - y="659.68195" - id="text3251" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3293" - x="513.68103" - y="659.68195">D4</tspan></text> - <path - id="path3256" - d="M 466.66845,296.213 L 466.66845,326.83172" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3258" - d="M 477.31844,388.06915 C 472.23556,403.37176 482.21444,411.5033 491.96218,424.01286" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3260" - d="M 469.33095,389.4004 C 464.2127,441.79407 468.59539,464.47336 490.63093,495.90028" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3262" - d="M 458.68096,389.4004 C 449.10974,464.27336 453.38899,538.86154 491.96218,573.1127" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <path - sodipodi:nodetypes="cc" - id="path3264" - d="M 446.69972,384.0754 C 417.6268,497.98462 460.07431,611.91471 491.96218,643.66887" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> - <rect - style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3831" - width="516.80328" - height="103.59095" - x="66.758537" - y="604.61957" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="80.570648" - y="700.15332" - id="text3833" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3835" - x="80.570648" - y="700.15332">share4</tspan></text> - <rect - style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3837" - width="95.533775" - height="81.721664" - x="631.90411" - y="640.30084" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="650.27539" - y="660.8269" - id="text3839" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3841" - x="650.27539" - y="660.8269">peer 4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 582.41071,673.68012 C 631.90411,677.13315 631.90411,677.13315 631.90411,677.13315" - id="path3843" /> - </g> -</svg> diff --git a/docs/file-encoding3.svg b/docs/file-encoding3.svg deleted file mode 100644 index fb5fd4c0..00000000 --- a/docs/file-encoding3.svg +++ /dev/null @@ -1,484 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/warner/work/tahoe-misc" - sodipodi:docname="file-encoding3.svg"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.523584" - inkscape:cx="372.04724" - inkscape:cy="526.18109" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="900" - inkscape:window-height="756" - inkscape:window-x="778" - inkscape:window-y="96" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g3308" - transform="translate(-492.4404,-287.9192)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3297" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3299" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3306" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-361.8975,-287.9192)" - id="g3313"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3315" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3317" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3319" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - id="g3321" - transform="translate(-427.1689,-180.8987)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3323" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3325" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3327" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-298.6406,-78.23132)" - id="g3329"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3331" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3333" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3335" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - transform="translate(-234.578,-287.9192)" - id="g3345"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3347" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3349" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3351" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - id="g3353" - transform="translate(-170.1124,-180.8987)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3355" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3357" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3359" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-105.6468,-287.9192)" - id="g3361"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3363" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3365" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3367" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <rect - ry="0" - y="47.720215" - x="76.855522" - height="54.581161" - width="62.568695" - id="rect2984" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text2988" - y="71.720772" - x="84.785179" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="71.720772" - x="84.785179" - id="tspan2990" - sodipodi:role="line">share</tspan></text> - <text - sodipodi:linespacing="100%" - id="text2992" - y="93.020752" - x="97.243141" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3042" - x="97.243141" - y="93.020752">A4</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3128" - width="62.568695" - height="54.581161" - x="207.39835" - y="47.720215" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="215.328" - y="71.720772" - id="text3130" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3132" - x="215.328" - y="71.720772">share</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="227.78596" - y="93.020752" - id="text3134" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3272" - x="227.78596" - y="93.020752">B4</tspan></text> - <rect - ry="0" - y="47.720215" - x="334.7179" - height="54.581161" - width="62.568695" - id="rect3186" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3188" - y="71.720772" - x="342.64755" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="71.720772" - x="342.64755" - id="tspan3190" - sodipodi:role="line">share</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3192" - y="93.020752" - x="355.10553" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3282" - x="355.10553" - y="93.020752">C4</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3245" - width="62.568695" - height="54.581161" - x="463.64905" - y="47.720215" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="471.5787" - y="71.720772" - id="text3247" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3249" - x="471.5787" - y="71.720772">share</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="484.03665" - y="93.020752" - id="text3251" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3293" - x="484.03665" - y="93.020752">D4</tspan></text> - <rect - style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3831" - width="516.80328" - height="491.99808" - x="37.114162" - y="37.958374" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="44.343109" - y="521.89929" - id="text3833" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3835" - x="44.343109" - y="521.89929">share4</tspan></text> - <rect - style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3837" - width="95.533775" - height="81.721664" - x="602.25977" - y="73.639648" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="620.63104" - y="94.16571" - id="text3839" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3841" - x="620.63104" - y="94.16571">peer 4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 552.76635,107.01893 C 602.25975,110.47196 602.25975,110.47196 602.25975,110.47196" - id="path3843" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 106.27121,102.50451 L 108.15211,173.97895" - id="path2431" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 238.8751,102.50451 L 237.93464,173.03849" - id="path2433" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 366.77673,103.44496 L 366.77673,172.09804" - id="path2435" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 495.61881,103.44496 L 495.61881,173.03849" - id="path2437" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 489.97609,208.77571 L 438.25116,282.13106" - id="path2439" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 370.53854,207.83526 L 420.38255,282.13106" - id="path2441" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 236.05374,209.71617 L 183.38836,284.01197" - id="path2443" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 110.97347,207.83526 L 164.5793,282.13106" - id="path2445" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 178.6861,315.98737 L 289.65957,388.40226" - id="path2447" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 426.02527,315.98737 L 316.93271,389.34272" - id="path2449" /> - <rect - style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1" - id="rect3336" - width="474.92883" - height="334.80142" - x="61.129456" - y="140.12263" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="241.69646" - y="263.32199" - id="text3338" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3340" - x="241.69646" - y="263.32199">Merkle Tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="68.653069" - y="466.45987" - id="text3342" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3344" - x="68.653069" - y="466.45987">block hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="321.63498" - y="405.33044" - id="text3346" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3352" - x="321.63498" - y="405.33044">"block root hash"</tspan></text> - </g> -</svg> diff --git a/docs/file-encoding4.svg b/docs/file-encoding4.svg deleted file mode 100644 index f4b21d02..00000000 --- a/docs/file-encoding4.svg +++ /dev/null @@ -1,675 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/warner/work/tahoe-misc" - sodipodi:docname="file-encoding4.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective5442" /> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.0814091" - inkscape:cx="327.67132" - inkscape:cy="590.71497" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="1680" - inkscape:window-height="1050" - inkscape:window-x="0" - inkscape:window-y="0" - showgrid="false" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="212.25175" - y="109.45165" - id="text3632" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3634" - x="212.25175" - y="109.45165">block</tspan><tspan - sodipodi:role="line" - x="212.25175" - y="129.45165" - id="tspan3636">root hashes</tspan></text> - <g - id="g3642" - transform="translate(-226.712,-129.0765)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3644" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3646" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3648" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - id="g3675" - transform="translate(175.712,7.63966)"> - <path - transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3331" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3653" - y="160.03162" - x="68.92907" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="160.03162" - x="68.92907" - id="tspan3655" - sodipodi:role="line">s1</tspan></text> - </g> - <g - id="g3686" - transform="translate(175.712,2.282887)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3657" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="68.029869" - y="239.32857" - id="text3659" - sodipodi:linespacing="100%"><tspan - y="239.32857" - x="68.029869" - id="tspan3680" - sodipodi:role="line">s2</tspan></text> - </g> - <g - id="g3691" - transform="translate(175.712,0.186429)"> - <path - transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3663" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3665" - y="313.49518" - x="70.729767" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="313.49518" - x="70.729767" - id="tspan3682" - sodipodi:role="line">s3</tspan></text> - </g> - <g - id="g3696" - transform="translate(175.712,7.639653)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3669" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="72.669769" - y="377.16217" - id="text3671" - sodipodi:linespacing="100%"><tspan - y="377.16217" - x="72.669769" - id="tspan3684" - sodipodi:role="line">s4</tspan></text> - </g> - <g - transform="translate(-228.8541,-284.0256)" - id="g3701"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3703" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3705" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3707" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - transform="translate(-110.3217,-218.3329)" - id="g3709"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3711" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3713" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3715" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 270.6808,165.29588 L 353.51073,189.57362" - id="path3717" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 272.10891,234.55883 C 275.67916,233.13073 354.22478,203.14059 354.22478,203.14059" - id="path3719" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 274.96511,307.39204 L 356.36693,341.66649" - id="path3721" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 275.67916,379.51119 L 355.65288,358.80371" - id="path3723" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 390.64138,347.3789 L 473.4713,271.68949" - id="path3725" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 389.92733,198.14223 L 472.75725,253.12416" - id="path3727" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="82.126266" - y="105.04523" - id="text4615" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan4617" - x="82.126266" - y="105.04523">shares</tspan></text> - <g - id="g4662" - transform="translate(0,-7.629395e-6)"> - <rect - ry="0" - y="131.23222" - x="69.941055" - height="62.310936" - width="88.076958" - id="rect3245" - style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text4619" - y="167.66769" - x="84.927971" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="167.66769" - x="84.927971" - id="tspan4621" - sodipodi:role="line">share1</tspan></text> - </g> - <g - id="g4657" - transform="translate(-0.77298,-0.515305)"> - <rect - style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect4623" - width="88.076958" - height="62.310936" - x="70.714035" - y="203.11914" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="85.700951" - y="239.55461" - id="text4625" - sodipodi:linespacing="100%"><tspan - y="239.55461" - x="85.700951" - id="tspan4641" - sodipodi:role="line">share2</tspan></text> - </g> - <g - id="g4652" - transform="translate(-3.864891,1.288307)"> - <rect - ry="0" - y="272.68713" - x="73.805946" - height="62.310936" - width="88.076958" - id="rect4629" - style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text4631" - y="309.12259" - x="88.792862" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="309.12259" - x="88.792862" - id="tspan4643" - sodipodi:role="line">share3</tspan></text> - </g> - <g - id="g4647" - transform="translate(-4.637871,0)"> - <rect - style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect4635" - width="88.076958" - height="62.310936" - x="74.578926" - y="345.34702" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="89.565842" - y="381.78247" - id="text4637" - sodipodi:linespacing="100%"><tspan - y="381.78247" - x="89.565842" - id="tspan4645" - sodipodi:role="line">share4</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 159.23338,161.89201 L 234.98518,160.34605" - id="path4667" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 159.23338,233.77892 L 236.53114,233.00595" - id="path4669" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 160.77934,304.11988 L 239.62305,305.66584" - id="path4671" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 158.4604,374.46084 L 238.85007,377.55275" - id="path4673" /> - <rect - style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect5560" - width="451.25253" - height="376.15237" - x="201.65356" - y="75.152138" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="320.79318" - y="271.27441" - id="text3338" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3340" - x="320.79318" - y="271.27441">Merkle Tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="211.74399" - y="441.22202" - id="text3342" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan7495" - x="211.74399" - y="441.22202">share hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="495.05698" - y="240.97345" - id="text5566" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5568" - x="495.05698" - y="240.97345">"share root hash"</tspan></text> - <rect - style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect8042" - width="372.43307" - height="126.05428" - x="258.43817" - y="492.44629" /> - <text - xml:space="preserve" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="267.38785" - y="521.40631" - id="text8044" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan8046" - x="267.38785" - y="521.40631">URI Extension Block</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 491.09641,278.8051 L 505.57143,535.71157" - id="path8064" - sodipodi:nodetypes="cc" /> - <g - id="g5534"> - <text - sodipodi:linespacing="100%" - id="text8048" - y="560.19122" - x="296.70987" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="560.19122" - x="296.70987" - id="tspan8050" - sodipodi:role="line">file size</tspan></text> - <rect - y="538.7973" - x="291.02008" - height="31.027878" - width="84.953964" - id="rect8066" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - </g> - <g - id="g5539" - transform="translate(-21.380944,3.5634906)"> - <text - sodipodi:linespacing="100%" - id="text8052" - y="595.66229" - x="296.09039" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="595.66229" - x="296.09039" - id="tspan8054" - sodipodi:role="line">encoding parameters</tspan></text> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect8068" - width="205.77185" - height="29.795084" - x="291.02008" - y="576.24475" /> - </g> - <g - id="g5529"> - <text - sodipodi:linespacing="100%" - id="text8060" - y="557.45142" - x="430.06894" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="557.45142" - x="430.06894" - id="tspan8062" - sodipodi:role="line">share root hash</tspan></text> - <rect - y="536.65747" - x="420.48123" - height="31.027878" - width="162.62888" - id="rect8070" - style="fill:none;fill-opacity:1;stroke:black;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - </g> - <flowRoot - xml:space="preserve" - id="flowRoot5444" - style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"><flowRegion - id="flowRegion5446"><rect - id="rect5448" - width="440.86795" - height="206.59506" - x="212.52603" - y="478.04767" /></flowRegion><flowPara - id="flowPara5450"></flowPara></flowRoot> <flowRoot - style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%" - id="flowRoot5452" - xml:space="preserve"><flowRegion - id="flowRegion5454"><rect - y="478.04767" - x="212.52603" - height="206.59506" - width="440.86795" - id="rect5456" /></flowRegion><flowPara - id="flowPara5458"></flowPara></flowRoot> <rect - y="722.08801" - x="249.14307" - height="126.05428" - width="372.43307" - id="rect5460" - style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text5462" - y="750.73669" - x="264.42236" - style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="750.73669" - x="264.42236" - id="tspan5464" - sodipodi:role="line">URI / "file read-cap"</tspan></text> - <g - id="g5498"> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="471.72757" - y="789.75726" - id="text5478" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5480" - x="471.72757" - y="789.75726">UEB hash</tspan></text> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect5486" - width="109.25024" - height="31.027878" - x="461.99792" - y="768.95331" /> - </g> - <g - id="g5503"> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="275.49631" - y="792.89374" - id="text5474" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5476" - x="275.49631" - y="792.89374">encryption key</tspan></text> - <rect - y="770.815" - x="268.32343" - height="36.37751" - width="148.71983" - id="rect5488" - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - </g> - <g - transform="translate(-97.251286,198.1785)" - id="g5490"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path5492" - style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text5494" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan5496" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <path - id="path5508" - d="M 490.16032,618.22602 L 500.19251,660.16729" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - sodipodi:nodetypes="cc" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 506.13565,695.45603 L 516.96501,767.91304" - id="path5510" /> - <g - id="g5524" - transform="translate(-7.8396793,-5.701585)"> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect8072" - width="127.96149" - height="31.434599" - x="502.91043" - y="583.00134" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="507.92603" - y="603.99866" - id="text5520" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5522" - x="507.92603" - y="603.99866">other hashes</tspan></text> - </g> - </g> -</svg> diff --git a/docs/file-encoding5.svg b/docs/file-encoding5.svg deleted file mode 100644 index a20a1369..00000000 --- a/docs/file-encoding5.svg +++ /dev/null @@ -1,585 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/warner/work/tahoe-misc" - sodipodi:docname="file-encoding5.svg"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.79718499" - inkscape:cx="410.02658" - inkscape:cy="638.93685" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="900" - inkscape:window-height="756" - inkscape:window-x="699" - inkscape:window-y="165" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="93.755287" - y="98.537506" - id="text3632" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3634" - x="93.755287" - y="98.537506">block</tspan><tspan - sodipodi:role="line" - x="93.755287" - y="118.53751" - id="tspan3636">root hashes</tspan></text> - <g - id="g3642" - transform="translate(-279.7236,-129.0765)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3644" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3646" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3648" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - id="g3675" - transform="translate(63.82283,6.080481)"> - <path - transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3331" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3653" - y="160.03162" - x="68.92907" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="160.03162" - x="68.92907" - id="tspan3655" - sodipodi:role="line">s1</tspan></text> - </g> - <g - id="g3686" - transform="translate(61.28203,2.918364)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3657" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="68.029869" - y="239.32857" - id="text3659" - sodipodi:linespacing="100%"><tspan - y="239.32857" - x="68.029869" - id="tspan3680" - sodipodi:role="line">s2</tspan></text> - </g> - <g - id="g3691" - transform="translate(59.37213,3.016624)"> - <path - transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3663" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3665" - y="313.49518" - x="70.729767" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="313.49518" - x="70.729767" - id="tspan3682" - sodipodi:role="line">s3</tspan></text> - </g> - <g - id="g3696" - transform="translate(59.37213,12.6645)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3669" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="72.669769" - y="377.16217" - id="text3671" - sodipodi:linespacing="100%"><tspan - y="377.16217" - x="72.669769" - id="tspan3684" - sodipodi:role="line">s4</tspan></text> - </g> - <g - transform="translate(-281.8657,-284.0256)" - id="g3701"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3703" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3705" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3707" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - transform="translate(-104.085,-218.3329)" - id="g3709"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3711" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3713" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3715" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 158.42099,162.17755 L 300.49915,189.57362" - id="path3717" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 162.96742,234.55883 C 166.53767,233.13073 301.2132,203.14059 301.2132,203.14059" - id="path3719" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 162.7053,312.06953 L 303.35535,341.66649" - id="path3721" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 160.30102,384.18868 L 302.6413,358.80371" - id="path3723" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 340.74813,350.49723 L 479.70796,268.57116" - id="path3725" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 341.59324,198.14223 L 480.55307,259.36082" - id="path3727" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="387.9295" - y="82.614281" - id="text3342" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan7297" - x="387.9295" - y="82.614281">share hash tree</tspan></text> - <g - transform="translate(-277.1965,175.8469)" - id="g6278"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path6280" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text6282" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan6284" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - id="g6374" - transform="translate(0,-6.583939)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path6288" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-170.1473,365.3129)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="130.1619" - y="471.03552" - id="text6290" - sodipodi:linespacing="100%"><tspan - y="471.03552" - x="130.1619" - id="tspan6366" - sodipodi:role="line">s5</tspan></text> - </g> - <g - id="g6379" - transform="translate(0,-4.389282)"> - <path - transform="matrix(0.511994,0,0,0.511994,-170.1473,437.7031)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path6296" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text6298" - y="544.97565" - x="130.2619" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="544.97565" - x="130.2619" - id="tspan6368" - sodipodi:role="line">s6</tspan></text> - </g> - <g - id="g6384" - transform="translate(0,-2.194656)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path6304" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-170.1473,510.0933)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="132.1519" - y="617.0459" - id="text6306" - sodipodi:linespacing="100%"><tspan - y="617.0459" - x="132.1519" - id="tspan6370" - sodipodi:role="line">s7</tspan></text> - </g> - <g - id="g6389"> - <path - transform="matrix(0.511994,0,0,0.511994,-170.1473,582.4835)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path6312" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text6314" - y="688.16608" - x="130.03189" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="688.16608" - x="130.03189" - id="tspan6372" - sodipodi:role="line">s8</tspan></text> - </g> - <g - id="g6318" - transform="translate(-279.3386,20.89783)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path6320" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text6322" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan6324" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - id="g6326" - transform="translate(-101.5579,86.59053)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path6328" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text6330" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan6332" - sodipodi:role="line">SHA</tspan></text> - </g> - <path - id="path6334" - d="M 160.94817,457.746 L 303.02633,494.49705" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - id="path6336" - d="M 162.37628,533.2456 C 165.94653,531.8175 303.74038,508.06402 303.74038,508.06402" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - id="path6338" - d="M 162.11415,609.19714 L 305.88253,646.58992" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - id="path6340" - d="M 162.8282,682.87546 L 305.16848,663.72714" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - id="path6342" - d="M 343.27531,653.86149 L 482.23514,575.05376" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - id="path6344" - d="M 341.0021,499.94733 L 481.52109,562.72508" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <text - sodipodi:linespacing="100%" - id="text6346" - y="424.95895" - x="480.79593" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="424.95895" - x="480.79593" - id="tspan6348" - sodipodi:role="line">Merkle Tree</tspan></text> - <text - sodipodi:linespacing="100%" - id="text6350" - y="384.32007" - x="593.30579" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="384.32007" - x="593.30579" - id="tspan6352" - sodipodi:role="line">"share root hash"</tspan></text> - <g - id="g6396" - transform="translate(65.86388,-62.41649)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path6398" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text6400" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan6402" - sodipodi:role="line">SHA</tspan></text> - </g> - <path - id="path6404" - d="M 516.21962,265.18629 L 653.62028,407.4814" - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 516.21962,558.30913 L 653.62028,429.30971" - id="path6406" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 88.872351,202.61777 L 183.98136,204.17694 L 352.37108,321.11424 L 570.65404,564.34383 L 498.9325,650.09786 L 291.56368,394.39495 L 162.15306,280.57598 L 79.517367,263.42517 L 88.872351,202.61777 z " - id="path6408" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="430.70282" - y="734.79639" - id="text7299" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan7301" - x="430.70282" - y="734.79639">merkle hash chain</tspan><tspan - sodipodi:role="line" - x="430.70282" - y="754.79639" - id="tspan7303">to validate s1</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 519.99961,716.92402 C 528.23607,699.12899 558.20121,653.69346 528.55661,615.79625" - id="path7305" - sodipodi:nodetypes="cc" /> - </g> -</svg> diff --git a/docs/file-encoding6.svg b/docs/file-encoding6.svg deleted file mode 100644 index 09ced3fe..00000000 --- a/docs/file-encoding6.svg +++ /dev/null @@ -1,760 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/warner/work/tahoe-misc" - sodipodi:docname="file-encoding6.svg"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;"> - <path - id="path2976" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.60354902" - inkscape:cx="367.4898" - inkscape:cy="564.16839" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="900" - inkscape:window-height="756" - inkscape:window-x="732" - inkscape:window-y="176" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <g - id="g3308" - transform="translate(-492.4404,-287.9192)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3297" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3299" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3306" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-361.8975,-287.9192)" - id="g3313"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3315" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3317" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3319" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - id="g3321" - transform="translate(-427.1689,-180.8987)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3323" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3325" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3327" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-234.578,-287.9192)" - id="g3345"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3347" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3349" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3351" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - id="g3353" - transform="translate(-170.1124,-180.8987)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3355" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3357" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3359" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - transform="translate(-105.6468,-287.9192)" - id="g3361"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3363" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3365" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3367" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <rect - ry="0" - y="47.720215" - x="76.855522" - height="54.581161" - width="62.568695" - id="rect2984" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text2988" - y="71.720772" - x="84.785179" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="71.720772" - x="84.785179" - id="tspan2990" - sodipodi:role="line">share</tspan></text> - <text - sodipodi:linespacing="100%" - id="text2992" - y="93.020752" - x="97.243141" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3042" - x="97.243141" - y="93.020752">A4</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3128" - width="62.568695" - height="54.581161" - x="207.39835" - y="47.720215" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="215.328" - y="71.720772" - id="text3130" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3132" - x="215.328" - y="71.720772">share</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="227.78596" - y="93.020752" - id="text3134" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3272" - x="227.78596" - y="93.020752">B4</tspan></text> - <rect - ry="0" - y="47.720215" - x="334.7179" - height="54.581161" - width="62.568695" - id="rect3186" - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> - <text - sodipodi:linespacing="100%" - id="text3188" - y="71.720772" - x="342.64755" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="71.720772" - x="342.64755" - id="tspan3190" - sodipodi:role="line">share</tspan></text> - <text - sodipodi:linespacing="100%" - id="text3192" - y="93.020752" - x="355.10553" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3282" - x="355.10553" - y="93.020752">C4</tspan></text> - <rect - style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3245" - width="62.568695" - height="54.581161" - x="463.64905" - y="47.720215" - ry="0" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="471.5787" - y="71.720772" - id="text3247" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3249" - x="471.5787" - y="71.720772">share</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="484.03665" - y="93.020752" - id="text3251" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3293" - x="484.03665" - y="93.020752">D4</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="479.80331" - y="521.89929" - id="text3833" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3835" - x="479.80331" - y="521.89929">share4</tspan></text> - <rect - style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" - id="rect3837" - width="95.533775" - height="81.721664" - x="608.88721" - y="272.46359" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="627.25848" - y="292.98965" - id="text3839" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3841" - x="627.25848" - y="292.98965">peer 4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 559.39381,305.84288 C 608.88721,309.29591 608.88721,309.29591 608.88721,309.29591" - id="path3843" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 106.27121,102.50451 L 108.15211,173.97895" - id="path2431" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 238.8751,102.50451 L 237.93464,173.03849" - id="path2433" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 366.77673,103.44496 L 366.77673,172.09804" - id="path2435" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 495.61881,103.44496 L 495.61881,173.03849" - id="path2437" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 489.97609,208.77571 L 438.25116,282.13106" - id="path2439" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 370.53854,207.83526 L 420.38255,282.13106" - id="path2441" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 236.05374,209.71617 L 183.38836,284.01197" - id="path2443" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 110.97347,207.83526 L 164.5793,282.13106" - id="path2445" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 178.6861,315.98737 L 289.65957,388.40226" - id="path2447" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 426.02527,315.98737 L 316.93271,389.34272" - id="path2449" /> - <rect - style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1" - id="rect3336" - width="474.92883" - height="334.80142" - x="61.129456" - y="140.12263" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="241.69646" - y="263.32199" - id="text3338" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3340" - x="241.69646" - y="263.32199">Merkle Tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="68.653069" - y="466.45987" - id="text3342" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3344" - x="68.653069" - y="466.45987">block hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="321.63498" - y="405.33044" - id="text3346" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3352" - x="321.63498" - y="405.33044">"block root hash"</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="88.648125" - y="598.72913" - id="text3632" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan3634" - x="88.648125" - y="598.72913">block</tspan><tspan - sodipodi:role="line" - x="88.648125" - y="618.72913" - id="tspan3636">root hashes</tspan></text> - <g - id="g3642" - transform="translate(-350.3156,360.201)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3644" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text3646" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan3648" - sodipodi:role="line">SHA</tspan></text> - </g> - <g - id="g3675" - transform="translate(52.10837,496.9171)"> - <path - transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path5669" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3653" - y="160.03162" - x="68.92907" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="160.03162" - x="68.92907" - id="tspan3655" - sodipodi:role="line">s1</tspan></text> - </g> - <g - id="g3686" - transform="translate(52.10837,491.5603)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3657" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="68.029869" - y="239.32857" - id="text3659" - sodipodi:linespacing="100%"><tspan - y="239.32857" - x="68.029869" - id="tspan3680" - sodipodi:role="line">s2</tspan></text> - </g> - <g - id="g3691" - transform="translate(52.10837,489.4639)"> - <path - transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3663" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3665" - y="313.49518" - x="70.729767" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - y="313.49518" - x="70.729767" - id="tspan3682" - sodipodi:role="line">s3</tspan></text> - </g> - <g - id="g3696" - transform="translate(52.10837,496.9171)"> - <path - sodipodi:type="arc" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - id="path3669" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="72.669769" - y="377.16217" - id="text3671" - sodipodi:linespacing="100%"><tspan - y="377.16217" - x="72.669769" - id="tspan3684" - sodipodi:role="line">s4</tspan></text> - </g> - <g - transform="translate(-352.4577,205.2519)" - id="g3701"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3703" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3705" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3707" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <g - transform="translate(-233.9253,270.9446)" - id="g3709"> - <path - transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path3711" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text3713" - y="483.09396" - x="591.47559" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan3715" - x="591.47559" - y="483.09396">SHA</tspan></text> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 147.07717,654.57336 L 229.9071,678.8511" - id="path3717" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 148.50528,723.83631 C 152.07553,722.40821 230.62115,692.41807 230.62115,692.41807" - id="path3719" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 151.36148,796.66952 L 232.7633,830.94397" - id="path3721" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 152.07553,868.78867 L 232.04925,848.08119" - id="path3723" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 267.03775,836.65638 L 349.86767,760.96697" - id="path3725" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" - d="M 266.3237,687.41971 L 349.15362,742.40164" - id="path3727" /> - <rect - style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect5560" - width="484.38986" - height="374.49551" - x="78.049934" - y="564.42963" /> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="358.2843" - y="865.40643" - id="text5700" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5702" - x="358.2843" - y="865.40643">Merkle Tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="88.140358" - y="930.49945" - id="text5704" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan7497" - x="88.140358" - y="930.49945">share hash tree</tspan></text> - <text - xml:space="preserve" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="356.4744" - y="786.95703" - id="text5566" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan5568" - x="356.4744" - y="786.95703">"share root hash"</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" - d="M 290.30681,720.03728 L 108.29659,845.9841 L 74.309836,804.80832 L 190.42285,712.9661 L 239.36655,641.22131 L 299.69,669.98266 L 290.30681,720.03728 z " - id="path5949" - sodipodi:nodetypes="ccccccc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="M 32.468525,28.648698 L 557.69466,30.558611 L 561.51449,540.50544 L 374.34299,540.50544 L 296.03655,725.76702 L 80.216355,869.01051 L 30.558611,817.44286 L 164.25254,727.67694 L 234.91933,590.16318 L 219.64002,534.7757 L 36.288351,534.7757 L 32.468525,28.648698 z " - id="path5951" /> - <text - xml:space="preserve" - style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - x="370.89407" - y="630.30597" - id="text7307" - sodipodi:linespacing="100%"><tspan - sodipodi:role="line" - id="tspan7499" - x="370.89407" - y="630.30597">merkle hash chain</tspan><tspan - sodipodi:role="line" - id="tspan7501" - x="370.89407" - y="650.30597">to validate s4</tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" - d="M 444.20214,656.77444 C 435.69736,681.11928 360.49372,712.77648 296.54955,691.10088" - id="path7317" - sodipodi:nodetypes="cc" /> - <g - transform="translate(221.2501,29.91837)" - id="g7322"> - <path - transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" - d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" - sodipodi:ry="34.073441" - sodipodi:rx="34.958466" - sodipodi:cy="196.10106" - sodipodi:cx="607.56927" - id="path7324" - style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" - sodipodi:type="arc" /> - <text - sodipodi:linespacing="100%" - id="text7326" - y="377.16217" - x="72.669769" - style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan7328" - x="72.669769" - y="377.16217">s4</tspan></text> - </g> - </g> -</svg> diff --git a/docs/mut.svg b/docs/mut.svg deleted file mode 100644 index 3db01b8e..00000000 --- a/docs/mut.svg +++ /dev/null @@ -1,1602 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="278.36371" - height="295.09766" - id="svg2841" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docname="mut.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - version="1.0"> - <defs - id="defs2843"> - <marker - inkscape:stockid="Arrow1Send" - orient="auto" - refY="0" - refX="0" - id="Arrow1Send" - style="overflow:visible"> - <path - id="path7680" - d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" - transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /> - </marker> - <linearGradient - inkscape:collect="always" - id="linearGradient7760"> - <stop - style="stop-color:#ca1818;stop-opacity:1;" - offset="0" - id="stop7762" /> - <stop - style="stop-color:#ca1818;stop-opacity:0;" - offset="1" - id="stop7764" /> - </linearGradient> - <marker - inkscape:stockid="Arrow1Mend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Mend" - style="overflow:visible"> - <path - id="path3751" - d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" - transform="matrix(-0.4,0,0,-0.4,-4,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend" - style="overflow:visible"> - <path - id="path3745" - d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" - transform="matrix(-0.8,0,0,-0.8,-10,0)" /> - </marker> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective2849" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7760" - id="linearGradient7766" - x1="-0.41100001" - y1="412.36218" - x2="160.411" - y2="412.36218" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7760" - id="linearGradient7788" - gradientUnits="userSpaceOnUse" - x1="-0.41100001" - y1="412.36218" - x2="160.411" - y2="412.36218" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7760" - id="linearGradient7793" - gradientUnits="userSpaceOnUse" - x1="-0.41100001" - y1="412.36218" - x2="160.411" - y2="412.36218" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="3.3332515" - inkscape:cx="210.25878" - inkscape:cy="123.41841" - inkscape:document-units="px" - inkscape:current-layer="layer2" - showgrid="true" - inkscape:window-width="1598" - inkscape:window-height="1198" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:snap-global="false"> - <inkscape:grid - type="xygrid" - id="grid2883" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata2846"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-217.17997,-198.38081)"> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.61650002;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect2885" - width="7.5" - height="0" - x="314.88028" - y="111.80756" /> - <flowRoot - xml:space="preserve" - id="flowRoot7772" - style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion - id="flowRegion7774"><rect - id="rect7776" - width="378.57144" - height="65.714287" - x="-35.714287" - y="384.50504" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara - id="flowPara7778" /></flowRoot> <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path8437" - sodipodi:cx="420" - sodipodi:cy="212.36218" - sodipodi:rx="80" - sodipodi:ry="20" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - transform="matrix(0.3375,0,0,0.3375,257.2117,137.23422)" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2919375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 438.13856,269.91499 C 446.63381,280.47335 453.38314,289.63578 453.38314,289.63578" - id="path9557" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 463.64994,293.69223 C 463.64994,297.55233 463.64994,302.1186 463.64994,302.1186" - id="path11208" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="467.92987" - y="288.97491" - id="text16751"><tspan - sodipodi:role="line" - id="tspan16753" - x="467.92987" - y="288.97491" /></text> - <text - xml:space="preserve" - style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="464.14178" - y="291.24774" - id="text16755"><tspan - sodipodi:role="line" - id="tspan16757" - x="464.14178" - y="291.24774" /></text> - <text - transform="scale(0.8196045,1.2201006)" - xml:space="preserve" - style="font-size:13.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="589.64325" - y="218.94211" - id="text16759" - sodipodi:linespacing="100%"><tspan - y="218.94211" - x="589.64325" - id="tspan16761" - sodipodi:role="line" /></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32201561px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 372.25866,281.18125 C 391.14052,275.94279 412.5754,263.5215 412.5754,263.5215" - id="path21360" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 467.95624,303.64299 C 465.78336,307.89979 463.10818,312.90038 463.10818,312.90038" - id="path4716" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="445.04538" - y="385.5498" - id="text4926"><tspan - sodipodi:role="line" - id="tspan4928" - x="445.04538" - y="385.5498">shares</tspan></text> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path4938" - sodipodi:cx="420" - sodipodi:cy="212.36218" - sodipodi:rx="80" - sodipodi:ry="20" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - transform="matrix(0,0.1683097,-0.3399575,0,508.99378,294.48202)" /> - <path - transform="matrix(0,0.1683097,-0.3399575,0,517.99378,294.48202)" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - sodipodi:ry="20" - sodipodi:rx="80" - sodipodi:cy="212.36218" - sodipodi:cx="420" - id="path4940" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - sodipodi:type="arc" /> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path4942" - sodipodi:cx="420" - sodipodi:cy="212.36218" - sodipodi:rx="80" - sodipodi:ry="20" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - transform="matrix(0,0.1683097,-0.3399575,0,526.99378,294.48202)" /> - <path - transform="matrix(0,0.1683097,-0.3399575,0,535.99378,294.48202)" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - sodipodi:ry="20" - sodipodi:rx="80" - sodipodi:cy="212.36218" - sodipodi:cx="420" - id="path4944" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - sodipodi:type="arc" /> - <path - transform="matrix(0,0.1683097,-0.3399575,0,542.80003,294.65787)" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - sodipodi:ry="20" - sodipodi:rx="80" - sodipodi:cy="212.36218" - sodipodi:cx="420" - id="path4946" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - sodipodi:type="arc" /> - <path - transform="matrix(0,0.1683097,-0.3399575,0,551.80003,294.58742)" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - sodipodi:ry="20" - sodipodi:rx="80" - sodipodi:cy="212.36218" - sodipodi:cx="420" - id="path4948" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - sodipodi:type="arc" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect4950" - width="60.860748" - height="2.1464994" - x="427.86215" - y="376.78323" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 436.85592,349.56271 C 436.85592,349.56271 434.60592,329.31271 461.60592,329.31271 C 445.85592,333.81271 445.85592,349.56271 445.85592,349.56271" - id="path4952" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 461.60592,329.31271 C 454.85592,336.06271 454.85592,349.56271 454.85592,349.56271" - id="path4954" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 461.60592,329.31271 C 463.85592,329.31271 463.85592,349.56271 463.85592,349.56271" - id="path4956" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 461.60592,329.31271 C 470.60592,329.31271 470.60592,349.56271 470.60592,349.56271" - id="path4958" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 461.60592,329.31271 C 479.60592,329.31271 479.60592,349.56271 479.60592,349.56271" - id="path4960" /> - <rect - y="372.16623" - x="427.74518" - height="2.1464994" - width="60.860748" - id="rect4962" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect4964" - width="60.860748" - height="2.1464994" - x="427.74518" - y="367.66623" /> - <rect - y="363.16623" - x="427.74518" - height="2.1464994" - width="60.860748" - id="rect4966" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect4968" - width="60.860748" - height="2.1464994" - x="427.74518" - y="358.66623" /> - <rect - y="354.16623" - x="427.74518" - height="2.1464994" - width="60.860748" - id="rect4970" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect4972" - width="60.860748" - height="2.1464994" - x="427.74518" - y="354.16623" /> - <g - transform="matrix(0,0.2054517,-0.1664743,0,467.60988,354.01332)" - id="g4974" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M -0.53492796,252.21639 C -5.5179181,262.28794 39.328998,262.28794 39.328998,262.28794 C 59.260953,262.28794 59.260953,292.50259 59.260953,292.50259" - id="path4976" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 120.64913,252.36218 C 125.63212,262.43373 80.7852,262.43373 80.7852,262.43373 C 60.85325,262.43373 60.85325,292.64838 60.85325,292.64838" - id="path4978" /> - </g> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 407.29684,407.56445 L 411.94948,419.32947" - id="path4998" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:6.50278425px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="468.50412" - y="382.92706" - id="text5004" - sodipodi:linespacing="100%" - transform="scale(0.9062658,1.1034291)"><tspan - sodipodi:role="line" - id="tspan5006" - x="468.50412" - y="382.92706" - style="font-size:8.10000038px">Merkle Tree</tspan></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16140337px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 418.04929,366.13921 C 402.75501,384.90072 405.78989,392.50491 405.78989,392.50491 L 405.78989,392.50491" - id="path5008" /> - <g - id="g9174" - transform="matrix(0.7985291,0,0,0.5813416,-172.4015,-45.31981)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9176" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9178" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9180" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9182" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9184" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="297.6908" - y="233.17752" - id="text9186"><tspan - sodipodi:role="line" - x="297.6908" - y="233.17752" - style="font-size:5px" - id="tspan9188">AES-CTR</tspan></text> - <g - id="g9877" - transform="matrix(0.7985291,0,0,0.5813416,-65.298876,150.88501)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9879" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9881" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9883" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9885" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9887" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="404.19336" - y="429.98233" - id="text9889"><tspan - sodipodi:role="line" - x="404.19336" - y="429.98233" - style="font-size:5px" - id="tspan9891">SHA256d</tspan></text> - <g - id="g9893" - transform="matrix(0.7985291,0,0,0.5813416,-7.0974465,151.48502)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9895" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9897" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9899" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9901" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9903" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="462.39481" - y="430.58234" - id="text9905"><tspan - sodipodi:role="line" - x="462.39481" - y="430.58234" - style="font-size:5px" - id="tspan9907">SHA256d</tspan></text> - <g - id="g9909" - transform="matrix(0.7985291,0,0,0.5813416,-37.39819,179.0857)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9911" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9913" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9915" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9917" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9919" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="432.09406" - y="458.18301" - id="text9921"><tspan - sodipodi:role="line" - x="432.09406" - y="458.18301" - style="font-size:5px" - id="tspan9923">SHA256d</tspan></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 424.55591,436.29471 L 429.20855,448.05973" - id="path9925" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 463.55687,407.19399 L 468.20951,418.95901" - id="path9927" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 484.06352,407.70392 L 479.41088,419.46894" - id="path9929" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 425.60846,407.49401 L 420.95582,419.25903" - id="path9931" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 458.90929,435.99471 L 454.25665,447.75973" - id="path9933" - sodipodi:nodetypes="cc" /> - <g - id="g9935" - transform="matrix(0.7985291,0,0,0.5813416,-17.597704,43.482372)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9937" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9939" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9941" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9943" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9945" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="456.99469" - y="322.27969" - id="text9947"><tspan - sodipodi:role="line" - x="456.99469" - y="322.27969" - style="font-size:5px" - id="tspan9949">FEC</tspan></text> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z" - id="path9993" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" - id="path9995" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 26.114257,76.71179 L 26.114257,75.211753 L 53.11492,75.211753 L 80.115583,75.211753 L 80.115583,76.71179 L 80.115583,78.211827 L 53.11492,78.211827 L 26.114257,78.211827 L 26.114257,76.71179 z" - id="path9997" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 26.414265,133.7148 L 26.414265,132.21315 L 53.431371,132.21315 L 80.44846,132.21315 L 80.357032,133.63819 L 80.265587,135.06322 L 53.339926,135.13984 L 26.414265,135.21643 L 26.414265,133.7148 z" - id="path9999" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z" - id="path10001" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" - id="path10003" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 26.414265,133.72419 L 26.414265,132.21315 L 53.432178,132.21315 L 80.450089,132.21315 L 80.357839,133.48818 L 80.265587,134.76322 L 73.515421,134.91631 C 69.80283,135.00052 57.686283,135.10673 46.58976,135.15233 L 26.414265,135.23524 L 26.414265,133.72419 z" - id="path10045" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" - id="path10047" - transform="translate(216.27706,196.47119)" /> - </g> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="text" - transform="translate(-217.17997,-198.38081)"> - <path - transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - sodipodi:ry="20" - sodipodi:rx="80" - sodipodi:cy="212.36218" - sodipodi:cx="420" - id="path12528" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - sodipodi:type="arc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 398.91941,217.38625 C 397.86315,236.37897 412.97295,261.62455 412.97295,261.62455" - id="path8489" - sodipodi:nodetypes="cc" /> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path10092" - sodipodi:cx="420" - sodipodi:cy="212.36218" - sodipodi:rx="80" - sodipodi:ry="20" - d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" - transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" /> - <text - xml:space="preserve" - style="font-size:8.09999943px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="556.67358" - y="169.5114" - id="text10094" - transform="scale(0.8252145,1.2118062)"><tspan - sodipodi:role="line" - id="tspan10096" - x="556.67358" - y="169.5114" /></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect13628" - width="7.5" - height="0" - x="524.88025" - y="299.30756" /> - <g - id="g16785" - transform="matrix(0.364293,0,0,0.4974358,-16.906009,-38.001986)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <g - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="g16787" - transform="translate(-210,240)" /> - <text - transform="scale(1.0714114,0.9333483)" - id="text16789" - y="325.48486" - x="362.67249" - style="font-size:32.76525116px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - id="tspan16791" - y="325.48486" - x="362.67249" - sodipodi:role="line" /></text> - </g> - <text - transform="scale(0.9161476,1.0915272)" - id="text16795" - y="124.86931" - x="159.02403" - style="font-size:13.94785595px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="124.86931" - x="159.02403" - id="tspan16797" - sodipodi:role="line" /></text> - <text - xml:space="preserve" - style="font-size:13.947855px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="247.0589" - y="116.87234" - id="text16801" - transform="scale(0.7061936,1.4160423)"><tspan - sodipodi:role="line" - id="tspan16803" - x="247.0589" - y="116.87234" /></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect20335" - width="4.5456867" - height="0" - x="206.55289" - y="326.09802" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.27742502;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect7836" - width="54" - height="3.375" - x="346.5321" - y="342.79144" /> - <text - transform="scale(1.0705538,0.934096)" - id="text7838" - y="377.70102" - x="341.13809" - style="font-size:6.07499981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="377.70102" - x="341.13809" - id="tspan7840" - sodipodi:role="line" - style="font-size:8.10000038px">salt</tspan></text> - <g - transform="matrix(0.3375,0,0,0.3375,168.46227,275.21496)" - id="g8416" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.82200003;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect8418" - width="160" - height="10" - x="535" - y="22.362183" /> - </g> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="332.31949" - y="313.88254" - id="text8424" - transform="scale(1.0714114,0.9333483)"><tspan - sodipodi:role="line" - id="tspan8426" - x="332.31949" - y="313.88254" - style="font-size:8.10000038px">encryption</tspan><tspan - sodipodi:role="line" - x="332.31949" - y="324.00754" - id="tspan8428" - style="font-size:8.10000038px"> key</tspan></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 298.98227,329.83819 C 326.42371,330.53571 348.95266,320.06453 348.95266,320.06453" - id="path21352" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 362.28379,341.51001 C 341.45603,329.97307 346.83916,321.99552 346.83916,321.99552" - id="path21354" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2438544px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 355.39701,305.53135 L 360.98003,293.64584" - id="path21358" - sodipodi:nodetypes="cc" /> - <text - xml:space="preserve" - style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="487.03278" - y="411.55334" - id="text3034"><tspan - sodipodi:role="line" - id="tspan3036" - x="487.03278" - y="411.55334" /></text> - <flowRoot - xml:space="preserve" - id="flowRoot3254" - style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion - id="flowRegion3256"><rect - id="rect3258" - width="18.039574" - height="36.830799" - x="-31.569254" - y="-50.306789" - style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara - id="flowPara3260" /></flowRoot> <rect - y="198.60286" - x="219.6953" - height="24.165203" - width="107.25604" - id="rect3282" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect5573" - width="54.139946" - height="3.3068728" - x="242.37775" - y="271.45877" /> - <text - xml:space="preserve" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="235.36351" - y="301.57739" - id="text7107" - transform="scale(1.0705539,0.9340959)"><tspan - sodipodi:role="line" - id="tspan7109" - x="235.36351" - y="301.57739" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text> - <text - transform="scale(1.0705539,0.9340959)" - id="text7768" - y="362.28162" - x="234.52074" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="362.28162" - x="234.52074" - id="tspan7770" - sodipodi:role="line" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text> - <rect - y="356.53317" - x="230.62067" - height="24.165203" - width="107.25604" - id="rect3291" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="248.95004" - y="370.59125" - id="text3246"><tspan - sodipodi:role="line" - id="tspan3248" - x="248.95004" - y="370.59125" - style="font-size:8.10000038px">verifying (public) key</tspan></text> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="239.46277" - y="213.58257" - id="text3328"><tspan - sodipodi:role="line" - x="239.46277" - y="213.58257" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="tspan3021">signing (private) key</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect4024" - width="54.139946" - height="3.3068728" - x="242.55493" - y="328.39029" /> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="381.61792" - y="386.57251" - id="text4229"><tspan - sodipodi:role="line" - id="tspan4231" - x="381.61792" - y="386.57251" /></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 234.50363,224.362 L 234.50363,354.01202" - id="path4243" - inkscape:connector-type="polyline" /> - <rect - y="241.14568" - x="288.69962" - height="24.165203" - width="107.25604" - id="rect5564" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="306.05878" - y="255.20375" - id="text5566"><tspan - sodipodi:role="line" - id="tspan5568" - x="306.05878" - y="255.20375" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">encrypted signing key</tspan></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 279.02164,269.72178 C 281.56206,241.33051 292.24088,235.15181 292.24088,235.15181" - id="path5574" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 285.08543,222.90932 L 291.78123,230.87533" - id="path6618" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 322.35949,233.1782 L 335.48526,239.16028" - id="path8979" - sodipodi:nodetypes="cc" /> - <text - transform="scale(1.0705539,0.9340959)" - id="text9528" - y="462.90314" - x="245.50374" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="462.90314" - x="245.50374" - id="tspan9530" - sodipodi:role="line" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9554" - width="108.27989" - height="3.3068728" - x="222.74568" - y="419.13055" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect16799" - width="171.15405" - height="13.22591" - x="222.05762" - y="440.96823" /> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="279.37097" - y="462.55542" - id="text3313"><tspan - sodipodi:role="line" - x="279.37097" - y="462.55542" - id="tspan3317" - style="font-size:8.10000038px">read-write cap</tspan></text> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 222.87392,420.82386 L 222.87392,419.36856 L 276.84166,419.36856 L 330.8094,419.36856 L 330.8094,420.82386 L 330.8094,422.27917 L 276.84166,422.27917 L 222.87392,422.27917 L 222.87392,420.82386 z" - id="path9564" /> - <text - transform="scale(1.0705539,0.9340959)" - id="text9566" - y="483.10208" - x="304.77203" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="483.10208" - x="304.77203" - id="tspan9568" - sodipodi:role="line" - style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9570" - width="108.27989" - height="3.3068728" - x="281.14557" - y="443.04819" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 281.27383,444.74153 L 281.27383,443.28622 L 335.24158,443.28622 L 389.20931,443.28622 L 389.20931,444.74153 L 389.20931,446.19684 L 335.24158,446.19684 L 281.27383,446.19684 L 281.27383,444.74153 z" - id="path9572" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9574" - width="54.139946" - height="3.3068728" - x="225.99055" - y="442.97894" /> - <text - xml:space="preserve" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="223.80324" - y="483.19937" - id="text9576" - transform="scale(1.0705539,0.9340959)"><tspan - sodipodi:role="line" - id="tspan9578" - x="223.80324" - y="483.19937" - style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text> - <text - xml:space="preserve" - style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="279.37097" - y="490.32758" - id="text9582"><tspan - sodipodi:role="line" - x="279.37097" - y="490.32758" - id="tspan9584" - style="font-size:8.10000038px">read-only cap</tspan></text> - <text - transform="scale(1.0705539,0.9340959)" - id="text9586" - y="512.94104" - x="305.00543" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - xml:space="preserve"><tspan - y="512.94104" - x="305.00543" - id="tspan9588" - sodipodi:role="line" - style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9590" - width="108.27989" - height="3.3068728" - x="281.14554" - y="470.82034" /> - <path - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - d="M 281.27383,472.51368 L 281.27383,471.05837 L 335.24157,471.05837 L 389.2093,471.05837 L 389.2093,472.51368 L 389.2093,473.96898 L 335.24157,473.96898 L 281.27383,473.96898 L 281.27383,472.51368 z" - id="path9592" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9594" - width="54.139946" - height="3.3068728" - x="225.99054" - y="470.7511" /> - <text - xml:space="preserve" - style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="224.83044" - y="512.93097" - id="text9596" - transform="scale(1.0705539,0.9340959)"><tspan - sodipodi:role="line" - id="tspan9598" - x="224.83044" - y="512.93097" - style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text> - <text - xml:space="preserve" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="384.58023" - y="210.64319" - id="text3025"><tspan - sodipodi:role="line" - id="tspan3027" - x="384.58023" - y="210.64319">plaintext</tspan></text> - <text - xml:space="preserve" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="451.8754" - y="298.79443" - id="text3029"><tspan - sodipodi:role="line" - id="tspan3031" - x="451.8754" - y="298.79443">ciphertext</tspan></text> - <text - xml:space="preserve" - style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="102.84189" - y="100.84377" - id="text3459" - transform="translate(218.99833,196.47119)"><tspan - sodipodi:role="line" - id="tspan3461" - x="102.84189" - y="100.84377" /></text> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 48.719461,27.732616 L 48.719461,41.723846" - id="path3512" - transform="translate(218.99833,196.47119)" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 267.71779,255.74642 L 267.71779,269.73765" - id="path4829" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 266.96826,282.47967 L 266.96826,296.4709" - id="path4831" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 266.96826,312.96055 L 266.96826,326.95178" - id="path4833" - inkscape:connector-type="polyline" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.14901878px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect5110" - width="113.09831" - height="7.6182923" - x="221.60002" - y="417.24417" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 49.877177,187.22739 L 50.127816,194.49593" - id="path5112" - transform="translate(218.99833,196.47119)" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" - d="M 50.127816,212.04066 L 50.127816,219.3092" - id="path5641" - transform="translate(218.99833,196.47119)" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" - d="M 22.500552,81.301996 C 3.3317037,108.63786 -8.6943462,156.11861 6.9001691,245.40603" - id="path7224" - transform="translate(218.99833,196.47119)" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" - d="M 240.57714,332.04074 C 221.40829,359.37661 207.8822,408.95742 225.87678,470.34415" - id="path7753" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" - d="M 90.602225,227.40558 L 105.30258,246.00604" - id="path7755" - transform="translate(218.99833,196.47119)" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" - d="M 367.86051,447.5929 L 367.5605,469.79345" - id="path8286" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - <g - id="g9190" - transform="matrix(0.7985291,0,0,0.5813416,-211.70247,-29.719429)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9192" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9194" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9196" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9198" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9200" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="257.18979" - y="245.77785" - id="text9202"><tspan - sodipodi:role="line" - x="257.18979" - y="245.77785" - id="tspan9204" - style="font-size:5px">SHA256d</tspan><tspan - sodipodi:role="line" - x="257.18979" - y="252.02785" - style="font-size:5px" - id="tspan9206">truncated</tspan></text> - <g - id="g9208" - transform="matrix(0.7985291,0,0,0.5813416,-211.70247,28.482004)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9210" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9212" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9214" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9216" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9218" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="257.18979" - y="303.97925" - id="text9220"><tspan - sodipodi:role="line" - x="257.18979" - y="303.97925" - id="tspan9222" - style="font-size:5px">SHA256d</tspan><tspan - sodipodi:role="line" - x="257.18979" - y="310.22925" - style="font-size:5px" - id="tspan9224">truncated</tspan></text> - <g - id="g9226" - transform="matrix(0.7985291,0,0,0.5813416,-127.4004,35.982184)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9228" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9230" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9232" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9234" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9236" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="341.49188" - y="311.47946" - id="text9238"><tspan - sodipodi:role="line" - x="341.49188" - y="311.47946" - id="tspan9240" - style="font-size:5px">SHA256d</tspan><tspan - sodipodi:role="line" - x="341.49188" - y="317.72946" - style="font-size:5px" - id="tspan9242">truncated</tspan></text> - <g - id="g9244" - transform="matrix(0.7985291,0,0,0.5813416,-210.80245,122.98432)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9246" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9248" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9250" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9252" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9254" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="258.08981" - y="398.4816" - id="text9256"><tspan - sodipodi:role="line" - x="258.08981" - y="398.4816" - id="tspan9258" - style="font-size:5px">SHA256d</tspan><tspan - sodipodi:role="line" - x="258.08981" - y="404.7316" - style="font-size:5px" - id="tspan9260">truncated</tspan></text> - <g - id="g9262" - transform="matrix(0.7985291,0,0,0.5813416,-52.098552,-13.519031)" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> - <path - sodipodi:type="arc" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="path9264" - sodipodi:cx="607.56927" - sodipodi:cy="196.10106" - sodipodi:rx="34.958466" - sodipodi:ry="34.073441" - d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" - transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="591.47559" - y="483.09396" - id="text9266" - sodipodi:linespacing="100%"><tspan - y="483.09396" - x="591.47559" - id="tspan9268" - sodipodi:role="line" /><tspan - y="493.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9270" /><tspan - y="503.09396" - x="591.47559" - sodipodi:role="line" - id="tspan9272" /></text> - </g> - <text - xml:space="preserve" - style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="417.99377" - y="264.97833" - id="text9274"><tspan - sodipodi:role="line" - x="417.99377" - y="264.97833" - style="font-size:5px" - id="tspan9276">AES-CTR</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9845" - width="20.741352" - height="9.1972332" - x="395.21106" - y="396.4776" - inkscape:transform-center-y="4.6611973" - inkscape:transform-center-x="1.720467e-05" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 395.27984,401.04002 L 395.27984,396.56484 L 405.56868,396.56484 L 415.85752,396.56484 L 415.85752,401.04002 L 415.85752,405.51519 L 405.56868,405.51519 L 395.27984,405.51519 L 395.27984,401.04002 z" - id="path9847" - inkscape:transform-center-x="0.013044945" - inkscape:transform-center-y="4.6250009" /> - <text - xml:space="preserve" - style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="397.93158" - y="402.57623" - id="text9849"><tspan - sodipodi:role="line" - id="tspan9851" - x="397.93158" - y="402.57623">share 1</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9853" - width="20.741352" - height="9.1972332" - x="421.31168" - y="396.4776" - inkscape:transform-center-y="4.6611973" - inkscape:transform-center-x="1.720467e-05" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 421.38048,401.04003 L 421.38048,396.56485 L 431.66932,396.56485 L 441.95816,396.56485 L 441.95816,401.04003 L 441.95816,405.5152 L 431.66932,405.5152 L 421.38048,405.5152 L 421.38048,401.04003 z" - id="path9855" - inkscape:transform-center-x="0.013044945" - inkscape:transform-center-y="4.6250009" /> - <text - xml:space="preserve" - style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="424.0322" - y="402.57623" - id="text9857"><tspan - sodipodi:role="line" - id="tspan9859" - x="424.0322" - y="402.57623">share 2</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9861" - width="20.741352" - height="9.1972332" - x="446.81232" - y="396.4776" - inkscape:transform-center-y="4.6611973" - inkscape:transform-center-x="1.720467e-05" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 446.88111,401.04003 L 446.88111,396.56485 L 457.16995,396.56485 L 467.45879,396.56485 L 467.45879,401.04003 L 467.45879,405.5152 L 457.16995,405.5152 L 446.88111,405.5152 L 446.88111,401.04003 z" - id="path9863" - inkscape:transform-center-x="0.013044945" - inkscape:transform-center-y="4.6250009" /> - <text - xml:space="preserve" - style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="449.53284" - y="402.57623" - id="text9865"><tspan - sodipodi:role="line" - id="tspan9867" - x="449.53284" - y="402.57623">share 3</tspan></text> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect9869" - width="20.741352" - height="9.1972332" - x="473.81299" - y="396.77759" - inkscape:transform-center-y="4.6611973" - inkscape:transform-center-x="1.720467e-05" /> - <path - style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 473.88178,401.34003 L 473.88178,396.86485 L 484.17062,396.86485 L 494.45946,396.86485 L 494.45946,401.34003 L 494.45946,405.8152 L 484.17062,405.8152 L 473.88178,405.8152 L 473.88178,401.34003 z" - id="path9871" - inkscape:transform-center-x="0.013044945" - inkscape:transform-center-y="4.6250009" /> - <text - xml:space="preserve" - style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - x="476.53351" - y="402.87622" - id="text9873"><tspan - sodipodi:role="line" - id="tspan9875" - x="476.53351" - y="402.87622">share 4</tspan></text> - <path - style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 26.414265,133.71319 L 26.414265,132.21315 L 53.414928,132.21315 L 80.415591,132.21315 L 80.415591,133.51519 L 80.415591,134.81725 L 73.166834,135.01523 C 69.180018,135.12413 57.02972,135.21323 46.166171,135.21323 L 26.414265,135.21323 L 26.414265,133.71319 z" - id="path10049" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 9.9138595,248.166 L 9.9138595,246.51596 L 36.764519,246.51596 L 63.615178,246.51596 L 63.615178,248.166 L 63.615178,249.81604 L 36.764519,249.81604 L 9.9138595,249.81604 L 9.9138595,248.166 z" - id="path10051" - transform="translate(216.27706,196.47119)" /> - <path - style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 9.9138595,275.91668 L 9.9138595,274.41665 L 36.764519,274.41665 L 63.615178,274.41665 L 63.615178,275.91668 L 63.615178,277.41672 L 36.764519,277.41672 L 9.9138595,277.41672 L 9.9138595,275.91668 z" - id="path10055" - transform="translate(216.27706,196.47119)" /> - <rect - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" - id="rect2971" - width="171.15405" - height="13.22591" - x="222.20229" - y="469.1651" /> - </g> -</svg> diff --git a/docs/mutable.txt b/docs/mutable.txt deleted file mode 100644 index 40a5374b..00000000 --- a/docs/mutable.txt +++ /dev/null @@ -1,648 +0,0 @@ - -This describes the "RSA-based mutable files" which were shipped in Tahoe v0.8.0. - -= Mutable Files = - -Mutable File Slots are places with a stable identifier that can hold data -that changes over time. In contrast to CHK slots, for which the -URI/identifier is derived from the contents themselves, the Mutable File Slot -URI remains fixed for the life of the slot, regardless of what data is placed -inside it. - -Each mutable slot is referenced by two different URIs. The "read-write" URI -grants read-write access to its holder, allowing them to put whatever -contents they like into the slot. The "read-only" URI is less powerful, only -granting read access, and not enabling modification of the data. The -read-write URI can be turned into the read-only URI, but not the other way -around. - -The data in these slots is distributed over a number of servers, using the -same erasure coding that CHK files use, with 3-of-10 being a typical choice -of encoding parameters. The data is encrypted and signed in such a way that -only the holders of the read-write URI will be able to set the contents of -the slot, and only the holders of the read-only URI will be able to read -those contents. Holders of either URI will be able to validate the contents -as being written by someone with the read-write URI. The servers who hold the -shares cannot read or modify them: the worst they can do is deny service (by -deleting or corrupting the shares), or attempt a rollback attack (which can -only succeed with the cooperation of at least k servers). - -== Consistency vs Availability == - -There is an age-old battle between consistency and availability. Epic papers -have been written, elaborate proofs have been established, and generations of -theorists have learned that you cannot simultaneously achieve guaranteed -consistency with guaranteed reliability. In addition, the closer to 0 you get -on either axis, the cost and complexity of the design goes up. - -Tahoe's design goals are to largely favor design simplicity, then slightly -favor read availability, over the other criteria. - -As we develop more sophisticated mutable slots, the API may expose multiple -read versions to the application layer. The tahoe philosophy is to defer most -consistency recovery logic to the higher layers. Some applications have -effective ways to merge multiple versions, so inconsistency is not -necessarily a problem (i.e. directory nodes can usually merge multiple "add -child" operations). - -== The Prime Coordination Directive: "Don't Do That" == - -The current rule for applications which run on top of Tahoe is "do not -perform simultaneous uncoordinated writes". That means you need non-tahoe -means to make sure that two parties are not trying to modify the same mutable -slot at the same time. For example: - - * don't give the read-write URI to anyone else. Dirnodes in a private - directory generally satisfy this case, as long as you don't use two - clients on the same account at the same time - * if you give a read-write URI to someone else, stop using it yourself. An - inbox would be a good example of this. - * if you give a read-write URI to someone else, call them on the phone - before you write into it - * build an automated mechanism to have your agents coordinate writes. - For example, we expect a future release to include a FURL for a - "coordination server" in the dirnodes. The rule can be that you must - contact the coordination server and obtain a lock/lease on the file - before you're allowed to modify it. - -If you do not follow this rule, Bad Things will happen. The worst-case Bad -Thing is that the entire file will be lost. A less-bad Bad Thing is that one -or more of the simultaneous writers will lose their changes. An observer of -the file may not see monotonically-increasing changes to the file, i.e. they -may see version 1, then version 2, then 3, then 2 again. - -Tahoe takes some amount of care to reduce the badness of these Bad Things. -One way you can help nudge it from the "lose your file" case into the "lose -some changes" case is to reduce the number of competing versions: multiple -versions of the file that different parties are trying to establish as the -one true current contents. Each simultaneous writer counts as a "competing -version", as does the previous version of the file. If the count "S" of these -competing versions is larger than N/k, then the file runs the risk of being -lost completely. [TODO] If at least one of the writers remains running after -the collision is detected, it will attempt to recover, but if S>(N/k) and all -writers crash after writing a few shares, the file will be lost. - -Note that Tahoe uses serialization internally to make sure that a single -Tahoe node will not perform simultaneous modifications to a mutable file. It -accomplishes this by using a weakref cache of the MutableFileNode (so that -there will never be two distinct MutableFileNodes for the same file), and by -forcing all mutable file operations to obtain a per-node lock before they -run. The Prime Coordination Directive therefore applies to inter-node -conflicts, not intra-node ones. - - -== Small Distributed Mutable Files == - -SDMF slots are suitable for small (<1MB) files that are editing by rewriting -the entire file. The three operations are: - - * allocate (with initial contents) - * set (with new contents) - * get (old contents) - -The first use of SDMF slots will be to hold directories (dirnodes), which map -encrypted child names to rw-URI/ro-URI pairs. - -=== SDMF slots overview === - -Each SDMF slot is created with a public/private key pair. The public key is -known as the "verification key", while the private key is called the -"signature key". The private key is hashed and truncated to 16 bytes to form -the "write key" (an AES symmetric key). The write key is then hashed and -truncated to form the "read key". The read key is hashed and truncated to -form the 16-byte "storage index" (a unique string used as an index to locate -stored data). - -The public key is hashed by itself to form the "verification key hash". - -The write key is hashed a different way to form the "write enabler master". -For each storage server on which a share is kept, the write enabler master is -concatenated with the server's nodeid and hashed, and the result is called -the "write enabler" for that particular server. Note that multiple shares of -the same slot stored on the same server will all get the same write enabler, -i.e. the write enabler is associated with the "bucket", rather than the -individual shares. - -The private key is encrypted (using AES in counter mode) by the write key, -and the resulting crypttext is stored on the servers. so it will be -retrievable by anyone who knows the write key. The write key is not used to -encrypt anything else, and the private key never changes, so we do not need -an IV for this purpose. - -The actual data is encrypted (using AES in counter mode) with a key derived -by concatenating the readkey with the IV, the hashing the results and -truncating to 16 bytes. The IV is randomly generated each time the slot is -updated, and stored next to the encrypted data. - -The read-write URI consists of the write key and the verification key hash. -The read-only URI contains the read key and the verification key hash. The -verify-only URI contains the storage index and the verification key hash. - - URI:SSK-RW:b2a(writekey):b2a(verification_key_hash) - URI:SSK-RO:b2a(readkey):b2a(verification_key_hash) - URI:SSK-Verify:b2a(storage_index):b2a(verification_key_hash) - -Note that this allows the read-only and verify-only URIs to be derived from -the read-write URI without actually retrieving the public keys. Also note -that it means the read-write agent must validate both the private key and the -public key when they are first fetched. All users validate the public key in -exactly the same way. - -The SDMF slot is allocated by sending a request to the storage server with a -desired size, the storage index, and the write enabler for that server's -nodeid. If granted, the write enabler is stashed inside the slot's backing -store file. All further write requests must be accompanied by the write -enabler or they will not be honored. The storage server does not share the -write enabler with anyone else. - -The SDMF slot structure will be described in more detail below. The important -pieces are: - - * a sequence number - * a root hash "R" - * the encoding parameters (including k, N, file size, segment size) - * a signed copy of [seqnum,R,encoding_params], using the signature key - * the verification key (not encrypted) - * the share hash chain (part of a Merkle tree over the share hashes) - * the block hash tree (Merkle tree over blocks of share data) - * the share data itself (erasure-coding of read-key-encrypted file data) - * the signature key, encrypted with the write key - -The access pattern for read is: - * hash read-key to get storage index - * use storage index to locate 'k' shares with identical 'R' values - * either get one share, read 'k' from it, then read k-1 shares - * or read, say, 5 shares, discover k, either get more or be finished - * or copy k into the URIs - * read verification key - * hash verification key, compare against verification key hash - * read seqnum, R, encoding parameters, signature - * verify signature against verification key - * read share data, compute block-hash Merkle tree and root "r" - * read share hash chain (leading from "r" to "R") - * validate share hash chain up to the root "R" - * submit share data to erasure decoding - * decrypt decoded data with read-key - * submit plaintext to application - -The access pattern for write is: - * hash write-key to get read-key, hash read-key to get storage index - * use the storage index to locate at least one share - * read verification key and encrypted signature key - * decrypt signature key using write-key - * hash signature key, compare against write-key - * hash verification key, compare against verification key hash - * encrypt plaintext from application with read-key - * application can encrypt some data with the write-key to make it only - available to writers (use this for transitive read-onlyness of dirnodes) - * erasure-code crypttext to form shares - * split shares into blocks - * compute Merkle tree of blocks, giving root "r" for each share - * compute Merkle tree of shares, find root "R" for the file as a whole - * create share data structures, one per server: - * use seqnum which is one higher than the old version - * share hash chain has log(N) hashes, different for each server - * signed data is the same for each server - * now we have N shares and need homes for them - * walk through peers - * if share is not already present, allocate-and-set - * otherwise, try to modify existing share: - * send testv_and_writev operation to each one - * testv says to accept share if their(seqnum+R) <= our(seqnum+R) - * count how many servers wind up with which versions (histogram over R) - * keep going until N servers have the same version, or we run out of servers - * if any servers wound up with a different version, report error to - application - * if we ran out of servers, initiate recovery process (described below) - -=== Server Storage Protocol === - -The storage servers will provide a mutable slot container which is oblivious -to the details of the data being contained inside it. Each storage index -refers to a "bucket", and each bucket has one or more shares inside it. (In a -well-provisioned network, each bucket will have only one share). The bucket -is stored as a directory, using the base32-encoded storage index as the -directory name. Each share is stored in a single file, using the share number -as the filename. - -The container holds space for a container magic number (for versioning), the -write enabler, the nodeid which accepted the write enabler (used for share -migration, described below), a small number of lease structures, the embedded -data itself, and expansion space for additional lease structures. - - # offset size name - 1 0 32 magic verstr "tahoe mutable container v1" plus binary - 2 32 20 write enabler's nodeid - 3 52 32 write enabler - 4 84 8 data size (actual share data present) (a) - 5 92 8 offset of (8) count of extra leases (after data) - 6 100 368 four leases, 92 bytes each - 0 4 ownerid (0 means "no lease here") - 4 4 expiration timestamp - 8 32 renewal token - 40 32 cancel token - 72 20 nodeid which accepted the tokens - 7 468 (a) data - 8 ?? 4 count of extra leases - 9 ?? n*92 extra leases - -The "extra leases" field must be copied and rewritten each time the size of -the enclosed data changes. The hope is that most buckets will have four or -fewer leases and this extra copying will not usually be necessary. - -The (4) "data size" field contains the actual number of bytes of data present -in field (7), such that a client request to read beyond 504+(a) will result -in an error. This allows the client to (one day) read relative to the end of -the file. The container size (that is, (8)-(7)) might be larger, especially -if extra size was pre-allocated in anticipation of filling the container with -a lot of data. - -The offset in (5) points at the *count* of extra leases, at (8). The actual -leases (at (9)) begin 4 bytes later. If the container size changes, both (8) -and (9) must be relocated by copying. - -The server will honor any write commands that provide the write token and do -not exceed the server-wide storage size limitations. Read and write commands -MUST be restricted to the 'data' portion of the container: the implementation -of those commands MUST perform correct bounds-checking to make sure other -portions of the container are inaccessible to the clients. - -The two methods provided by the storage server on these "MutableSlot" share -objects are: - - * readv(ListOf(offset=int, length=int)) - * returns a list of bytestrings, of the various requested lengths - * offset < 0 is interpreted relative to the end of the data - * spans which hit the end of the data will return truncated data - - * testv_and_writev(write_enabler, test_vector, write_vector) - * this is a test-and-set operation which performs the given tests and only - applies the desired writes if all tests succeed. This is used to detect - simultaneous writers, and to reduce the chance that an update will lose - data recently written by some other party (written after the last time - this slot was read). - * test_vector=ListOf(TupleOf(offset, length, opcode, specimen)) - * the opcode is a string, from the set [gt, ge, eq, le, lt, ne] - * each element of the test vector is read from the slot's data and - compared against the specimen using the desired (in)equality. If all - tests evaluate True, the write is performed - * write_vector=ListOf(TupleOf(offset, newdata)) - * offset < 0 is not yet defined, it probably means relative to the - end of the data, which probably means append, but we haven't nailed - it down quite yet - * write vectors are executed in order, which specifies the results of - overlapping writes - * return value: - * error: OutOfSpace - * error: something else (io error, out of memory, whatever) - * (True, old_test_data): the write was accepted (test_vector passed) - * (False, old_test_data): the write was rejected (test_vector failed) - * both 'accepted' and 'rejected' return the old data that was used - for the test_vector comparison. This can be used by the client - to detect write collisions, including collisions for which the - desired behavior was to overwrite the old version. - -In addition, the storage server provides several methods to access these -share objects: - - * allocate_mutable_slot(storage_index, sharenums=SetOf(int)) - * returns DictOf(int, MutableSlot) - * get_mutable_slot(storage_index) - * returns DictOf(int, MutableSlot) - * or raises KeyError - -We intend to add an interface which allows small slots to allocate-and-write -in a single call, as well as do update or read in a single call. The goal is -to allow a reasonably-sized dirnode to be created (or updated, or read) in -just one round trip (to all N shareholders in parallel). - -==== migrating shares ==== - -If a share must be migrated from one server to another, two values become -invalid: the write enabler (since it was computed for the old server), and -the lease renew/cancel tokens. - -Suppose that a slot was first created on nodeA, and was thus initialized with -WE(nodeA) (= H(WEM+nodeA)). Later, for provisioning reasons, the share is -moved from nodeA to nodeB. - -Readers may still be able to find the share in its new home, depending upon -how many servers are present in the grid, where the new nodeid lands in the -permuted index for this particular storage index, and how many servers the -reading client is willing to contact. - -When a client attempts to write to this migrated share, it will get a "bad -write enabler" error, since the WE it computes for nodeB will not match the -WE(nodeA) that was embedded in the share. When this occurs, the "bad write -enabler" message must include the old nodeid (e.g. nodeA) that was in the -share. - -The client then computes H(nodeB+H(WEM+nodeA)), which is the same as -H(nodeB+WE(nodeA)). The client sends this along with the new WE(nodeB), which -is H(WEM+nodeB). Note that the client only sends WE(nodeB) to nodeB, never to -anyone else. Also note that the client does not send a value to nodeB that -would allow the node to impersonate the client to a third node: everything -sent to nodeB will include something specific to nodeB in it. - -The server locally computes H(nodeB+WE(nodeA)), using its own node id and the -old write enabler from the share. It compares this against the value supplied -by the client. If they match, this serves as proof that the client was able -to compute the old write enabler. The server then accepts the client's new -WE(nodeB) and writes it into the container. - -This WE-fixup process requires an extra round trip, and requires the error -message to include the old nodeid, but does not require any public key -operations on either client or server. - -Migrating the leases will require a similar protocol. This protocol will be -defined concretely at a later date. - -=== Code Details === - -The MutableFileNode class is used to manipulate mutable files (as opposed to -ImmutableFileNodes). These are initially generated with -client.create_mutable_file(), and later recreated from URIs with -client.create_node_from_uri(). Instances of this class will contain a URI and -a reference to the client (for peer selection and connection). - -NOTE: this section is out of date. Please see src/allmydata/interfaces.py -(the section on IMutableFilesystemNode) for more accurate information. - -The methods of MutableFileNode are: - - * download_to_data() -> [deferred] newdata, NotEnoughSharesError - * if there are multiple retrieveable versions in the grid, get() returns - the first version it can reconstruct, and silently ignores the others. - In the future, a more advanced API will signal and provide access to - the multiple heads. - * update(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError - * overwrite(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError - -download_to_data() causes a new retrieval to occur, pulling the current -contents from the grid and returning them to the caller. At the same time, -this call caches information about the current version of the file. This -information will be used in a subsequent call to update(), and if another -change has occured between the two, this information will be out of date, -triggering the UncoordinatedWriteError. - -update() is therefore intended to be used just after a download_to_data(), in -the following pattern: - - d = mfn.download_to_data() - d.addCallback(apply_delta) - d.addCallback(mfn.update) - -If the update() call raises UCW, then the application can simply return an -error to the user ("you violated the Prime Coordination Directive"), and they -can try again later. Alternatively, the application can attempt to retry on -its own. To accomplish this, the app needs to pause, download the new -(post-collision and post-recovery) form of the file, reapply their delta, -then submit the update request again. A randomized pause is necessary to -reduce the chances of colliding a second time with another client that is -doing exactly the same thing: - - d = mfn.download_to_data() - d.addCallback(apply_delta) - d.addCallback(mfn.update) - def _retry(f): - f.trap(UncoordinatedWriteError) - d1 = pause(random.uniform(5, 20)) - d1.addCallback(lambda res: mfn.download_to_data()) - d1.addCallback(apply_delta) - d1.addCallback(mfn.update) - return d1 - d.addErrback(_retry) - -Enthusiastic applications can retry multiple times, using a randomized -exponential backoff between each. A particularly enthusiastic application can -retry forever, but such apps are encouraged to provide a means to the user of -giving up after a while. - -UCW does not mean that the update was not applied, so it is also a good idea -to skip the retry-update step if the delta was already applied: - - d = mfn.download_to_data() - d.addCallback(apply_delta) - d.addCallback(mfn.update) - def _retry(f): - f.trap(UncoordinatedWriteError) - d1 = pause(random.uniform(5, 20)) - d1.addCallback(lambda res: mfn.download_to_data()) - def _maybe_apply_delta(contents): - new_contents = apply_delta(contents) - if new_contents != contents: - return mfn.update(new_contents) - d1.addCallback(_maybe_apply_delta) - return d1 - d.addErrback(_retry) - -update() is the right interface to use for delta-application situations, like -directory nodes (in which apply_delta might be adding or removing child -entries from a serialized table). - -Note that any uncoordinated write has the potential to lose data. We must do -more analysis to be sure, but it appears that two clients who write to the -same mutable file at the same time (even if both eventually retry) will, with -high probability, result in one client observing UCW and the other silently -losing their changes. It is also possible for both clients to observe UCW. -The moral of the story is that the Prime Coordination Directive is there for -a reason, and that recovery/UCW/retry is not a subsitute for write -coordination. - -overwrite() tells the client to ignore this cached version information, and -to unconditionally replace the mutable file's contents with the new data. -This should not be used in delta application, but rather in situations where -you want to replace the file's contents with completely unrelated ones. When -raw files are uploaded into a mutable slot through the tahoe webapi (using -POST and the ?mutable=true argument), they are put in place with overwrite(). - - - -The peer-selection and data-structure manipulation (and signing/verification) -steps will be implemented in a separate class in allmydata/mutable.py . - -=== SMDF Slot Format === - -This SMDF data lives inside a server-side MutableSlot container. The server -is oblivious to this format. - -This data is tightly packed. In particular, the share data is defined to run -all the way to the beginning of the encrypted private key (the encprivkey -offset is used both to terminate the share data and to begin the encprivkey). - - # offset size name - 1 0 1 version byte, \x00 for this format - 2 1 8 sequence number. 2^64-1 must be handled specially, TBD - 3 9 32 "R" (root of share hash Merkle tree) - 4 41 16 IV (share data is AES(H(readkey+IV)) ) - 5 57 18 encoding parameters: - 57 1 k - 58 1 N - 59 8 segment size - 67 8 data length (of original plaintext) - 6 75 32 offset table: - 75 4 (8) signature - 79 4 (9) share hash chain - 83 4 (10) block hash tree - 87 4 (11) share data - 91 8 (12) encrypted private key - 99 8 (13) EOF - 7 107 436ish verification key (2048 RSA key) - 8 543ish 256ish signature=RSAenc(sigkey, H(version+seqnum+r+IV+encparm)) - 9 799ish (a) share hash chain, encoded as: - "".join([pack(">H32s", shnum, hash) - for (shnum,hash) in needed_hashes]) -10 (927ish) (b) block hash tree, encoded as: - "".join([pack(">32s",hash) for hash in block_hash_tree]) -11 (935ish) LEN share data (no gap between this and encprivkey) -12 ?? 1216ish encrypted private key= AESenc(write-key, RSA-key) -13 ?? -- EOF - -(a) The share hash chain contains ceil(log(N)) hashes, each 32 bytes long. - This is the set of hashes necessary to validate this share's leaf in the - share Merkle tree. For N=10, this is 4 hashes, i.e. 128 bytes. -(b) The block hash tree contains ceil(length/segsize) hashes, each 32 bytes - long. This is the set of hashes necessary to validate any given block of - share data up to the per-share root "r". Each "r" is a leaf of the share - has tree (with root "R"), from which a minimal subset of hashes is put in - the share hash chain in (8). - -=== Recovery === - -The first line of defense against damage caused by colliding writes is the -Prime Coordination Directive: "Don't Do That". - -The second line of defense is to keep "S" (the number of competing versions) -lower than N/k. If this holds true, at least one competing version will have -k shares and thus be recoverable. Note that server unavailability counts -against us here: the old version stored on the unavailable server must be -included in the value of S. - -The third line of defense is our use of testv_and_writev() (described below), -which increases the convergence of simultaneous writes: one of the writers -will be favored (the one with the highest "R"), and that version is more -likely to be accepted than the others. This defense is least effective in the -pathological situation where S simultaneous writers are active, the one with -the lowest "R" writes to N-k+1 of the shares and then dies, then the one with -the next-lowest "R" writes to N-2k+1 of the shares and dies, etc, until the -one with the highest "R" writes to k-1 shares and dies. Any other sequencing -will allow the highest "R" to write to at least k shares and establish a new -revision. - -The fourth line of defense is the fact that each client keeps writing until -at least one version has N shares. This uses additional servers, if -necessary, to make sure that either the client's version or some -newer/overriding version is highly available. - -The fifth line of defense is the recovery algorithm, which seeks to make sure -that at least *one* version is highly available, even if that version is -somebody else's. - -The write-shares-to-peers algorithm is as follows: - - * permute peers according to storage index - * walk through peers, trying to assign one share per peer - * for each peer: - * send testv_and_writev, using "old(seqnum+R) <= our(seqnum+R)" as the test - * this means that we will overwrite any old versions, and we will - overwrite simultaenous writers of the same version if our R is higher. - We will not overwrite writers using a higher seqnum. - * record the version that each share winds up with. If the write was - accepted, this is our own version. If it was rejected, read the - old_test_data to find out what version was retained. - * if old_test_data indicates the seqnum was equal or greater than our - own, mark the "Simultanous Writes Detected" flag, which will eventually - result in an error being reported to the writer (in their close() call). - * build a histogram of "R" values - * repeat until the histogram indicate that some version (possibly ours) - has N shares. Use new servers if necessary. - * If we run out of servers: - * if there are at least shares-of-happiness of any one version, we're - happy, so return. (the close() might still get an error) - * not happy, need to reinforce something, goto RECOVERY - -RECOVERY: - * read all shares, count the versions, identify the recoverable ones, - discard the unrecoverable ones. - * sort versions: locate max(seqnums), put all versions with that seqnum - in the list, sort by number of outstanding shares. Then put our own - version. (TODO: put versions with seqnum <max but >us ahead of us?). - * for each version: - * attempt to recover that version - * if not possible, remove it from the list, go to next one - * if recovered, start at beginning of peer list, push that version, - continue until N shares are placed - * if pushing our own version, bump up the seqnum to one higher than - the max seqnum we saw - * if we run out of servers: - * schedule retry and exponential backoff to repeat RECOVERY - * admit defeat after some period? presumeably the client will be shut down - eventually, maybe keep trying (once per hour?) until then. - - - - -== Medium Distributed Mutable Files == - -These are just like the SDMF case, but: - - * we actually take advantage of the Merkle hash tree over the blocks, by - reading a single segment of data at a time (and its necessary hashes), to - reduce the read-time alacrity - * we allow arbitrary writes to the file (i.e. seek() is provided, and - O_TRUNC is no longer required) - * we write more code on the client side (in the MutableFileNode class), to - first read each segment that a write must modify. This looks exactly like - the way a normal filesystem uses a block device, or how a CPU must perform - a cache-line fill before modifying a single word. - * we might implement some sort of copy-based atomic update server call, - to allow multiple writev() calls to appear atomic to any readers. - -MDMF slots provide fairly efficient in-place edits of very large files (a few -GB). Appending data is also fairly efficient, although each time a power of 2 -boundary is crossed, the entire file must effectively be re-uploaded (because -the size of the block hash tree changes), so if the filesize is known in -advance, that space ought to be pre-allocated (by leaving extra space between -the block hash tree and the actual data). - -MDMF1 uses the Merkle tree to enable low-alacrity random-access reads. MDMF2 -adds cache-line reads to allow random-access writes. - -== Large Distributed Mutable Files == - -LDMF slots use a fundamentally different way to store the file, inspired by -Mercurial's "revlog" format. They enable very efficient insert/remove/replace -editing of arbitrary spans. Multiple versions of the file can be retained, in -a revision graph that can have multiple heads. Each revision can be -referenced by a cryptographic identifier. There are two forms of the URI, one -that means "most recent version", and a longer one that points to a specific -revision. - -Metadata can be attached to the revisions, like timestamps, to enable rolling -back an entire tree to a specific point in history. - -LDMF1 provides deltas but tries to avoid dealing with multiple heads. LDMF2 -provides explicit support for revision identifiers and branching. - -== TODO == - -improve allocate-and-write or get-writer-buckets API to allow one-call (or -maybe two-call) updates. The challenge is in figuring out which shares are on -which machines. First cut will have lots of round trips. - -(eventually) define behavior when seqnum wraps. At the very least make sure -it can't cause a security problem. "the slot is worn out" is acceptable. - -(eventually) define share-migration lease update protocol. Including the -nodeid who accepted the lease is useful, we can use the same protocol as we -do for updating the write enabler. However we need to know which lease to -update.. maybe send back a list of all old nodeids that we find, then try all -of them when we accept the update? - - We now do this in a specially-formatted IndexError exception: - "UNABLE to renew non-existent lease. I have leases accepted by " + - "nodeids: '12345','abcde','44221' ." - -confirm that a repairer can regenerate shares without the private key. Hmm, -without the write-enabler they won't be able to write those shares to the -servers.. although they could add immutable new shares to new servers. diff --git a/docs/specifications/CHK-hashes.svg b/docs/specifications/CHK-hashes.svg new file mode 100644 index 00000000..22bd524f --- /dev/null +++ b/docs/specifications/CHK-hashes.svg @@ -0,0 +1,723 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45.1" + sodipodi:docbase="/home/warner/trees/tahoe/docs" + sodipodi:docname="chk-hashes.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3237" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path3391" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.58344932" + inkscape:cx="372.04724" + inkscape:cy="526.18109" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="791" + inkscape:window-height="827" + inkscape:window-x="591" + inkscape:window-y="150" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2168" + transform="translate(-8.75,0)"> + <rect + y="80.555412" + x="53.132294" + height="135.40164" + width="197.10367" + id="rect2160" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text2162" + y="108.97614" + x="151.88493" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="108.97614" + x="151.88493" + id="tspan2164" + sodipodi:role="line">data</tspan><tspan + id="tspan2166" + y="132.97614" + x="151.88493" + sodipodi:role="line">(plaintext)</tspan></text> + </g> + <g + id="g2190" + transform="translate(-0.25,0)"> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect2178" + width="197.10367" + height="135.40164" + x="44.632294" + y="324.55542" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="143.38493" + y="352.97614" + id="text2180" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan2182" + x="143.38493" + y="352.97614">data</tspan><tspan + sodipodi:role="line" + x="143.38493" + y="376.97614" + id="tspan2184">(crypttext)</tspan></text> + </g> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect2198" + width="197.10367" + height="135.40164" + x="44.382294" + y="583.55542" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="142.68532" + y="611.97614" + id="text2200" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + x="142.68532" + y="611.97614" + id="tspan2204">shares</tspan></text> + <g + id="g3193" + transform="translate(-10.413708,29.158381)"> + <path + transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + sodipodi:ry="20.567339" + sodipodi:rx="20.567339" + sodipodi:cy="133.6877" + sodipodi:cx="418.20258" + id="path2212" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3185" + sodipodi:cx="418.20258" + sodipodi:cy="133.6877" + sodipodi:rx="20.567339" + sodipodi:ry="20.567339" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" /> + <path + transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + sodipodi:ry="20.567339" + sodipodi:rx="20.567339" + sodipodi:cy="133.6877" + sodipodi:cx="418.20258" + id="path3187" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + id="path3189" + d="M 396.76226,145.32825 L 407.17597,134.91454" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path3191" + d="M 433.21024,147.41099 L 423.8379,134.91454" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g3200" + transform="translate(-9.3723369,269.71503)"> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3202" + sodipodi:cx="418.20258" + sodipodi:cy="133.6877" + sodipodi:rx="20.567339" + sodipodi:ry="20.567339" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" /> + <path + transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + sodipodi:ry="20.567339" + sodipodi:rx="20.567339" + sodipodi:cy="133.6877" + sodipodi:cx="418.20258" + id="path3204" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3206" + sodipodi:cx="418.20258" + sodipodi:cy="133.6877" + sodipodi:rx="20.567339" + sodipodi:ry="20.567339" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 396.76226,145.32825 L 407.17597,134.91454" + id="path3208" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 433.21024,147.41099 L 423.8379,134.91454" + id="path3210" /> + </g> + <g + transform="translate(-6.2482246,538.38869)" + id="g3212"> + <path + transform="matrix(0.6292707,0,0,0.6292707,151.39519,41.751672)" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + sodipodi:ry="20.567339" + sodipodi:rx="20.567339" + sodipodi:cy="133.6877" + sodipodi:cx="418.20258" + id="path3214" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3216" + sodipodi:cx="418.20258" + sodipodi:cy="133.6877" + sodipodi:rx="20.567339" + sodipodi:ry="20.567339" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + transform="matrix(0.6292707,0,0,0.6292707,125.3609,72.992795)" /> + <path + transform="matrix(0.6292707,0,0,0.6292707,177.42944,72.992795)" + d="M 438.76991 133.6877 A 20.567339 20.567339 0 1 1 397.63524,133.6877 A 20.567339 20.567339 0 1 1 438.76991 133.6877 z" + sodipodi:ry="20.567339" + sodipodi:rx="20.567339" + sodipodi:cy="133.6877" + sodipodi:cx="418.20258" + id="path3218" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.58914125;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + id="path3220" + d="M 396.76226,145.32825 L 407.17597,134.91454" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path3222" + d="M 433.21024,147.41099 L 423.8379,134.91454" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="399.88635" + y="110.96302" + id="text3224" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3226" + x="399.88635" + y="110.96302">plaintext</tspan><tspan + sodipodi:role="line" + x="399.88635" + y="130.96302" + id="tspan3228">hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="400.92773" + y="350.4783" + id="text3230" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3232" + x="400.92773" + y="350.4783">crypttext</tspan><tspan + sodipodi:role="line" + x="400.92773" + y="370.4783" + id="tspan3234">hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="405.09323" + y="618.1106" + id="text3236" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3238" + x="405.09323" + y="618.1106">share</tspan><tspan + sodipodi:role="line" + x="405.09323" + y="638.1106" + id="tspan3240">hash tree</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.05825377;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3242" + width="207.32907" + height="421.5722" + x="527.92419" + y="161.13995" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="536.46478" + y="183.39211" + id="text3244" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3246" + x="536.46478" + y="183.39211">URI Extension Block</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="536.95264" + y="245.09413" + id="text3248" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3250" + x="536.95264" + y="245.09413">plaintext root</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="536.95264" + y="281.08698" + id="text3252" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3254" + x="536.95264" + y="281.08698">plaintext (flat) hash</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="540.59265" + y="435.34201" + id="text3256" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3258" + x="540.59265" + y="435.34201">crypttext root</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="540.59265" + y="483.33246" + id="text3260" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3262" + x="540.59265" + y="483.33246">crypttext (flat) hash</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="539.89264" + y="558.74603" + id="text3264" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3266" + x="539.89264" + y="558.74603">share root</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" + d="M 239.95229,183.39211 L 363.35632,183.39211" + id="path3383" /> + <path + id="path3583" + d="M 239.95229,425.05834 L 363.35632,425.05834" + style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" + d="M 239.95229,692.43375 L 363.35632,692.43375" + id="path3585" /> + <path + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 417.58968,150.5351 C 470.69959,151.57647 472.62807,183.93923 479.03055,202.60364 C 487.14356,226.25457 499.85797,233.58442 529.01635,241.13436" + id="path3589" + sodipodi:nodetypes="csz" /> + <path + sodipodi:nodetypes="csz" + id="path3591" + d="M 421.75516,391.09175 C 449.87218,392.13312 454.33789,400.8898 470.69958,411.91917 C 496.5159,429.32187 494.65112,422.07253 523.8095,429.62247" + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" /> + <path + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 420.71379,662.88952 C 420.71379,662.88952 471.01868,647.53267 473.30302,607.17618 C 475.6461,565.78169 496.083,554.97747 525.89224,551.46284" + id="path3595" + sodipodi:nodetypes="czz" /> + <path + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 241.59802,201.56227 C 288.98039,203.12433 310.58883,210.67426 381.1417,228.63791 C 451.69457,246.60156 477.72883,273.67719 523.80949,273.41685" + id="path3599" + sodipodi:nodetypes="czz" /> + <path + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 243.68076,448.36714 C 296.26998,448.88782 323.60597,457.47913 393.63815,465.02907 C 463.67033,472.57901 487.62186,479.8686 523.80949,478.56689" + id="path3601" + sodipodi:nodetypes="czz" /> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3603" + width="611.87836" + height="109.69247" + x="54.846237" + y="807.26807" /> + <text + xml:space="preserve" + style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="329.71826" + y="910.10474" + id="text3605" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3607" + x="329.71826" + y="910.10474">URI</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="159.39687" + y="841.54694" + id="text3609" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3611" + x="159.39687" + y="841.54694">encryption</tspan><tspan + sodipodi:role="line" + x="159.39687" + y="861.54694" + id="tspan3613">key</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="359.92844" + y="842.72693" + id="text3615" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3617" + x="359.92844" + y="842.72693">storage</tspan><tspan + sodipodi:role="line" + x="359.92844" + y="862.72693" + id="tspan3619">index</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="570.74371" + y="844.42694" + id="text3621" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3623" + x="570.74371" + y="844.42694">UEB</tspan><tspan + sodipodi:role="line" + x="570.74371" + y="864.42694" + id="tspan3625">hash</tspan></text> + <path + style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:9,9;stroke-dashoffset:0;stroke-opacity:1" + d="M 267.37541,557.0321 L 315.36587,66.843852 L 740.4242,73.699632 L 740.4242,752.42182 L 418.20256,752.42182 L 416.48862,713.00109 L 356.50054,646.15724 L 310.22403,661.58274 L 190.24789,659.8688 L 191.96183,557.0321 L 267.37541,557.0321 z " + id="path3627" + sodipodi:nodetypes="ccccccccccc" /> + <path + style="fill:none;fill-opacity:1;stroke:#1bcc03;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 358.21449,824.40751 C 362.49935,783.27283 382.20972,758.84911 414.77467,740.42421" + id="path3629" + sodipodi:nodetypes="cz" /> + <path + style="fill:none;fill-opacity:1;stroke:#8a02b8;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 629.01779,582.74128 C 623.87595,661.15426 575.88549,723.71325 574.17154,814.12384" + id="path3631" + sodipodi:nodetypes="cz" /> + <g + id="g3434"> + <path + transform="translate(1.7139449,-5.1418348)" + d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1 101.12275,278.51605 A 36.849815 23.138256 0 1 1 174.82238 278.51605 z" + sodipodi:ry="23.138256" + sodipodi:rx="36.849815" + sodipodi:cy="278.51605" + sodipodi:cx="137.97256" + id="path3635" + style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3637" + y="281.24622" + x="115.93739" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="281.24622" + x="115.93739" + id="tspan3639" + sodipodi:role="line">AES</tspan></text> + </g> + <path + style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="M 133.6877,212.52917 L 135.40165,250.23596" + id="path3646" /> + <path + style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="M 138.82954,296.51247 L 138.82954,323.93559" + id="path3648" /> + <path + style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 147.39926,817.55173 C 123.40403,754.13577 56.155146,767.27832 30.851008,736.99632 C 4.7133492,705.71682 5.5877376,315.58243 32.564954,281.08697 C 58.702614,247.66504 65.129907,260.94812 101.12275,272.51724" + id="path3650" + sodipodi:nodetypes="czzz" /> + <g + id="g3426"> + <path + transform="translate(-1.7139449,243.38018)" + sodipodi:type="arc" + style="fill:#ffffff;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3219" + sodipodi:cx="137.97256" + sodipodi:cy="278.51605" + sodipodi:rx="36.849815" + sodipodi:ry="23.138256" + d="M 174.82238 278.51605 A 36.849815 23.138256 0 1 1 101.12275,278.51605 A 36.849815 23.138256 0 1 1 174.82238 278.51605 z" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#a10101;fill-opacity:1;stroke:#a10101;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="112.5095" + y="529.76825" + id="text3221" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3223" + x="112.5095" + y="529.76825">FEC</tspan></text> + </g> + <path + id="path3445" + d="M 195.38972,855.25852 L 318.79375,855.25852" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path3447" + d="M 133.68771,457.62329 L 133.68771,498.75797" + style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:1;stroke:#a10101;stroke-width:2;stroke-linecap:butt;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 133.68771,546.74843 L 133.68771,582.74127" + id="path3449" + sodipodi:nodetypes="cc" /> + <path + id="path3451" + d="M 99.408806,943.93737 L 147.39926,943.93737" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8a02b8;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="65.129906" + y="953.42938" + id="text3453" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3455" + x="65.129906" + y="953.42938">A</tspan></text> + <text + xml:space="preserve" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="164.53871" + y="952.95337" + id="text3457" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + x="164.53871" + y="952.95337" + id="tspan3461">B :</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="217.67101" + y="952.95337" + id="text3465" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3467" + x="217.67101" + y="952.95337">B is derived from A by hashing, therefore B validates A</tspan></text> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a10101;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 99.408806,969.64654 L 147.39926,969.64654" + id="path3469" /> + <text + sodipodi:linespacing="100%" + id="text3471" + y="979.13855" + x="65.129906" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="979.13855" + x="65.129906" + id="tspan3473" + sodipodi:role="line">A</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3475" + y="978.66254" + x="164.53871" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + id="tspan3477" + y="978.66254" + x="164.53871" + sodipodi:role="line">B :</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3479" + y="978.66254" + x="217.67101" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="978.66254" + x="217.67101" + id="tspan3481" + sodipodi:role="line">B is derived from A by encryption or erasure coding</tspan></text> + <path + id="path3483" + d="M 99.408806,997.06966 L 147.39926,997.06966" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1bcc03;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="65.129906" + y="1006.5616" + id="text3485" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3487" + x="65.129906" + y="1006.5616">A</tspan></text> + <text + xml:space="preserve" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="164.53871" + y="1006.0856" + id="text3489" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + x="164.53871" + y="1006.0856" + id="tspan3491">B :</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="217.67101" + y="1006.0856" + id="text3493" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3495" + x="217.67101" + y="1006.0856">A is used as an index to retrieve data B</tspan></text> + <text + xml:space="preserve" + style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#1bcc03;fill-opacity:1;stroke:#1bcc03;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="625.5899" + y="740.42419" + id="text3497" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3499" + x="625.5899" + y="740.42419">SHARE</tspan></text> + <text + xml:space="preserve" + style="font-size:32px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="249.20799" + y="30.851007" + id="text3501" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3503" + x="249.20799" + y="30.851007">CHK File Hashes</tspan></text> + </g> +</svg> diff --git a/docs/specifications/Makefile b/docs/specifications/Makefile new file mode 100644 index 00000000..2625e04d --- /dev/null +++ b/docs/specifications/Makefile @@ -0,0 +1,19 @@ +SOURCES = CHK-hashes.svg file-encoding1.svg file-encoding2.svg \ + file-encoding3.svg file-encoding4.svg file-encoding5.svg \ + file-encoding6.svg + +PNGS = $(patsubst %.svg,%.png,$(SOURCES)) +EPSS = $(patsubst %.svg,%.eps,$(SOURCES)) + +.PHONY: images-png images-eps +all: $(PNGS) $(EPSS) +images-png: $(PNGS) +images-eps: $(EPSS) + +%.png: %.svg + inkscape -b white -d 90 -D --export-png $@ $< +%.eps: %.svg + inkscape --export-eps $@ $< + +clean: + rm -f *.png *.eps diff --git a/docs/specifications/URI-extension.txt b/docs/specifications/URI-extension.txt new file mode 100644 index 00000000..8ec383e0 --- /dev/null +++ b/docs/specifications/URI-extension.txt @@ -0,0 +1,61 @@ + +"URI Extension Block" + +This block is a serialized dictionary with string keys and string values +(some of which represent numbers, some of which are SHA-256 hashes). All +buckets hold an identical copy. The hash of the serialized data is kept in +the URI. + +The download process must obtain a valid copy of this data before any +decoding can take place. The download process must also obtain other data +before incremental validation can be performed. Full-file validation (for +clients who do not wish to do incremental validation) can be performed solely +with the data from this block. + +At the moment, this data block contains the following keys (and an estimate +on their sizes): + + size 5 + segment_size 7 + num_segments 2 + needed_shares 2 + total_shares 3 + + codec_name 3 + codec_params 5+1+2+1+3=12 + tail_codec_params 12 + + share_root_hash 32 (binary) or 52 (base32-encoded) each + plaintext_hash + plaintext_root_hash + crypttext_hash + crypttext_root_hash + +Some pieces are needed elsewhere (size should be visible without pulling the +block, the Tahoe3 algorithm needs total_shares to find the right peers, all +peer selection algorithms need needed_shares to ask a minimal set of peers). +Some pieces are arguably redundant but are convenient to have present +(test_encode.py makes use of num_segments). + +The rule for this data block is that it should be a constant size for all +files, regardless of file size. Therefore hash trees (which have a size that +depends linearly upon the number of segments) are stored elsewhere in the +bucket, with only the hash tree root stored in this data block. + +This block will be serialized as follows: + + assert that all keys match ^[a-zA-z_\-]+$ + sort all the keys lexicographically + for k in keys: + write("%s:" % k) + write(netstring(data[k])) + + +Serialized size: + + dense binary (but decimal) packing: 160+46=206 + including 'key:' (185) and netstring (6*3+7*4=46) on values: 231 + including 'key:%d\n' (185+13=198) and printable values (46+5*52=306)=504 + +We'll go with the 231-sized block, and provide a tool to dump it as text if +we really want one. diff --git a/docs/specifications/dirnodes.txt b/docs/specifications/dirnodes.txt new file mode 100644 index 00000000..adc8fcab --- /dev/null +++ b/docs/specifications/dirnodes.txt @@ -0,0 +1,433 @@ + += Tahoe Directory Nodes = + +As explained in the architecture docs, Tahoe can be roughly viewed as a +collection of three layers. The lowest layer is the distributed filestore, or +DHT: it provides operations that accept files and upload them to the mesh, +creating a URI in the process which securely references the file's contents. +The middle layer is the filesystem, creating a structure of directories and +filenames resembling the traditional unix/windows filesystems. The top layer +is the application layer, which uses the lower layers to provide useful +services to users, like a backup application, or a way to share files with +friends. + +This document examines the middle layer, the "filesystem". + +== DHT Primitives == + +In the lowest layer (DHT), there are two operations that reference immutable +data (which we refer to as "CHK URIs" or "CHK read-capabilities" or "CHK +read-caps"). One puts data into the grid (but only if it doesn't exist +already), the other retrieves it: + + chk_uri = put(data) + data = get(chk_uri) + +We also have three operations which reference mutable data (which we refer to +as "mutable slots", or "mutable write-caps and read-caps", or sometimes "SSK +slots"). One creates a slot with some initial contents, a second replaces the +contents of a pre-existing slot, and the third retrieves the contents: + + mutable_uri = create(initial_data) + replace(mutable_uri, new_data) + data = get(mutable_uri) + +== Filesystem Goals == + +The main goal for the middle (filesystem) layer is to give users a way to +organize the data that they have uploaded into the mesh. The traditional way +to do this in computer filesystems is to put this data into files, give those +files names, and collect these names into directories. + +Each directory is a series of name-value pairs, which maps "child name" to an +object of some kind. Those child objects might be files, or they might be +other directories. + +The directory structure is therefore a directed graph of nodes, in which each +node might be a directory node or a file node. All file nodes are terminal +nodes. + +== Dirnode Goals == + +What properties might be desirable for these directory nodes? In no +particular order: + + 1: functional. Code which does not work doesn't count. + 2: easy to document, explain, and understand + 3: confidential: it should not be possible for others to see the contents of + a directory + 4: integrity: it should not be possible for others to modify the contents + of a directory + 5: available: directories should survive host failure, just like files do + 6: efficient: in storage, communication bandwidth, number of round-trips + 7: easy to delegate individual directories in a flexible way + 8: updateness: everybody looking at a directory should see the same contents + 9: monotonicity: everybody looking at a directory should see the same + sequence of updates + +Some of these goals are mutually exclusive. For example, availability and +consistency are opposing, so it is not possible to achieve #5 and #8 at the +same time. Moreover, it takes a more complex architecture to get close to the +available-and-consistent ideal, so #2/#6 is in opposition to #5/#8. + +Tahoe-0.7.0 introduced distributed mutable files, which use public key +cryptography for integrity, and erasure coding for availability. These +achieve roughly the same properties as immutable CHK files, but their +contents can be replaced without changing their identity. Dirnodes are then +just a special way of interpreting the contents of a specific mutable file. +Earlier releases used a "vdrive server": this server was abolished in the +0.7.0 release. + +For details of how mutable files work, please see "mutable.txt" in this +directory. + +For the current 0.7.0 release, we achieve most of our desired properties. The +integrity and availability of dirnodes is equivalent to that of regular +(immutable) files, with the exception that there are more simultaneous-update +failure modes for mutable slots. Delegation is quite strong: you can give +read-write or read-only access to any subtree, and the data format used for +dirnodes is such that read-only access is transitive: i.e. if you grant Bob +read-only access to a parent directory, then Bob will get read-only access +(and *not* read-write access) to its children. + +Relative to the previous "vdrive-server" based scheme, the current +distributed dirnode approach gives better availability, but cannot guarantee +updateness quite as well, and requires far more network traffic for each +retrieval and update. Mutable files are somewhat less available than +immutable files, simply because of the increased number of combinations +(shares of an immutable file are either present or not, whereas there are +multiple versions of each mutable file, and you might have some shares of +version 1 and other shares of version 2). In extreme cases of simultaneous +update, mutable files might suffer from non-monotonicity. + + +== Dirnode secret values == + +As mentioned before, dirnodes are simply a special way to interpret the +contents of a mutable file, so the secret keys and capability strings +described in "mutable.txt" are all the same. Each dirnode contains an RSA +public/private keypair, and the holder of the "write capability" will be able +to retrieve the private key (as well as the AES encryption key used for the +data itself). The holder of the "read capability" will be able to obtain the +public key and the AES data key, but not the RSA private key needed to modify +the data. + +The "write capability" for a dirnode grants read-write access to its +contents. This is expressed on concrete form as the "dirnode write cap": a +printable string which contains the necessary secrets to grant this access. +Likewise, the "read capability" grants read-only access to a dirnode, and can +be represented by a "dirnode read cap" string. + +For example, +URI:DIR2:swdi8ge1s7qko45d3ckkyw1aac%3Aar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o +is a write-capability URI, while +URI:DIR2-RO:buxjqykt637u61nnmjg7s8zkny:ar8r5j99a4mezdojejmsfp4fj1zeky9gjigyrid4urxdimego68o +is a read-capability URI, both for the same dirnode. + + +== Dirnode storage format == + +Each dirnode is stored in a single mutable file, distributed in the Tahoe +grid. The contents of this file are a serialized list of netstrings, one per +child. Each child is a list of four netstrings: (name, rocap, rwcap, +metadata). (remember that the contents of the mutable file are encrypted by +the read-cap, so this section describes the plaintext contents of the mutable +file, *after* it has been decrypted by the read-cap). + +The name is simple a UTF-8 -encoded child name. The 'rocap' is a read-only +capability URI to that child, either an immutable (CHK) file, a mutable file, +or a directory. The 'rwcap' is a read-write capability URI for that child, +encrypted with the dirnode's write-cap: this enables the "transitive +readonlyness" property, described further below. The 'metadata' is a +JSON-encoded dictionary of type,value metadata pairs. Some metadata keys are +pre-defined, the rest are left up to the application. + +Each rwcap is stored as IV + ciphertext + MAC. The IV is a 16-byte random +value. The ciphertext is obtained by using AES in CTR mode on the rwcap URI +string, using a key that is formed from a tagged hash of the IV and the +dirnode's writekey. The MAC is a 32-byte SHA-256 -based HMAC (using that same +AES key) over the (IV+ciphertext) pair. + +If Bob has read-only access to the 'bar' directory, and he adds it as a child +to the 'foo' directory, then he will put the read-only cap for 'bar' in both +the rwcap and rocap slots (encrypting the rwcap contents as described above). +If he has full read-write access to 'bar', then he will put the read-write +cap in the 'rwcap' slot, and the read-only cap in the 'rocap' slot. Since +other users who have read-only access to 'foo' will be unable to decrypt its +rwcap slot, this limits those users to read-only access to 'bar' as well, +thus providing the transitive readonlyness that we desire. + +=== Dirnode sizes, mutable-file initial read sizes === + +How big are dirnodes? When reading dirnode data out of mutable files, how +large should our initial read be? If we guess exactly, we can read a dirnode +in a single round-trip, and update one in two RTT. If we guess too high, +we'll waste some amount of bandwidth. If we guess low, we need to make a +second pass to get the data (or the encrypted privkey, for writes), which +will cost us at least another RTT. + +Assuming child names are between 10 and 99 characters long, how long are the +various pieces of a dirnode? + + netstring(name) ~= 4+len(name) + chk-cap = 97 (for 4-char filesizes) + dir-rw-cap = 88 + dir-ro-cap = 91 + netstring(cap) = 4+len(cap) + encrypted(cap) = 16+cap+32 + JSON({}) = 2 + JSON({ctime=float,mtime=float}): 57 + netstring(metadata) = 4+57 = 61 + +so a CHK entry is: + 5+ 4+len(name) + 4+97 + 5+16+97+32 + 4+57 +And a 15-byte filename gives a 336-byte entry. When the entry points at a +subdirectory instead of a file, the entry is a little bit smaller. So an +empty directory uses 0 bytes, a directory with one child uses about 336 +bytes, a directory with two children uses about 672, etc. + +When the dirnode data is encoding using our default 3-of-10, that means we +get 112ish bytes of data in each share per child. + +The pubkey, signature, and hashes form the first 935ish bytes of the +container, then comes our data, then about 1216 bytes of encprivkey. So if we +read the first: + + 1kB: we get 65bytes of dirnode data : only empty directories + 1kiB: 89bytes of dirnode data : maybe one short-named subdir + 2kB: 1065bytes: about 9 entries + 3kB: 2065bytes: about 18 entries, or 7.5 entries plus the encprivkey + 4kB: 3065bytes: about 27 entries, or about 16.5 plus the encprivkey + +So we've written the code to do an initial read of 2kB from each share when +we read the mutable file, which should give good performance (one RTT) for +small directories. + + +== Design Goals, redux == + +How well does this design meet the goals? + + #1 functional: YES: the code works and has extensive unit tests + #2 documentable: YES: this document is the existence proof + #3 confidential: YES: see below + #4 integrity: MOSTLY: a coalition of storage servers can rollback individual + mutable files, but not a single one. No server can + substitute fake data as genuine. + #5 availability: YES: as long as 'k' storage servers are present and have + the same version of the mutable file, the dirnode will + be available. + #6 efficient: MOSTLY: + network: single dirnode lookup is very efficient, since clients can + fetch specific keys rather than being required to get or set + the entire dirnode each time. Traversing many directories + takes a lot of roundtrips, and these can't be collapsed with + promise-pipelining because the intermediate values must only + be visible to the client. Modifying many dirnodes at once + (e.g. importing a large pre-existing directory tree) is pretty + slow, since each graph edge must be created independently. + storage: each child has a separate IV, which makes them larger than + if all children were aggregated into a single encrypted string + #7 delegation: VERY: each dirnode is a completely independent object, + to which clients can be granted separate read-write or + read-only access + #8 updateness: VERY: with only a single point of access, and no caching, + each client operation starts by fetching the current + value, so there are no opportunities for staleness + #9 monotonicity: VERY: the single point of access also protects against + retrograde motion + + + +=== Confidentiality leaks in the vdrive server === + +Dirnode (and the mutable files upon which they are based) are very private +against other clients: traffic between the client and the storage servers is +protected by the Foolscap SSL connection, so they can observe very little. +Storage index values are hashes of secrets and thus unguessable, and they are +not made public, so other clients cannot snoop through encrypted dirnodes +that they have not been told about. + +Storage servers can observe access patterns and see ciphertext, but they +cannot see the plaintext (of child names, metadata, or URIs). If an attacker +operates a significant number of storage servers, they can infer the shape of +the directory structure by assuming that directories are usually accessed +from root to leaf in rapid succession. Since filenames are usually much +shorter than read-caps and write-caps, the attacker can use the length of the +ciphertext to guess the number of children of each node, and might be able to +guess the length of the child names (or at least their sum). From this, the +attacker may be able to build up a graph with the same shape as the plaintext +filesystem, but with unlabeled edges and unknown file contents. + + +=== Integrity failures in the vdrive server === + +The mutable file's integrity mechanism (RSA signature on the hash of the file +contents) prevents the storage server from modifying the dirnode's contents +without detection. Therefore the storage servers can make the dirnode +unavailable, but not corrupt it. + +A sufficient number of colluding storage servers can perform a rollback +attack: replace all shares of the whole mutable file with an earlier version. +TODO: To prevent this, when retrieving the contents of a mutable file, the +client should query more servers than necessary and use the highest available +version number. This insures that one or two misbehaving storage servers +cannot cause this rollback on their own. + + +=== Improving the efficiency of dirnodes === + +The current mutable-file -based dirnode scheme suffers from certain +inefficiencies. A very large directory (with thousands or millions of +children) will take a significant time to extract any single entry, because +the whole file must be downloaded first, then parsed and searched to find the +desired child entry. Likewise, modifying a single child will require the +whole file to be re-uploaded. + +The current design assumes (and in some cases, requires) that dirnodes remain +small. The mutable files on which dirnodes are based are currently using +"SDMF" ("Small Distributed Mutable File") design rules, which state that the +size of the data shall remain below one megabyte. More advanced forms of +mutable files (MDMF and LDMF) are in the design phase to allow efficient +manipulation of larger mutable files. This would reduce the work needed to +modify a single entry in a large directory. + +Judicious caching may help improve the reading-large-directory case. Some +form of mutable index at the beginning of the dirnode might help as well. The +MDMF design rules allow for efficient random-access reads from the middle of +the file, which would give the index something useful to point at. + +The current SDMF design generates a new RSA public/private keypair for each +directory. This takes considerable time and CPU effort, generally one or two +seconds per directory. We have designed (but not yet built) a DSA-based +mutable file scheme which will use shared parameters to reduce the +directory-creation effort to a bare minimum (picking a random number instead +of generating two random primes). + + +When a backup program is run for the first time, it needs to copy a large +amount of data from a pre-existing filesystem into reliable storage. This +means that a large and complex directory structure needs to be duplicated in +the dirnode layer. With the one-object-per-dirnode approach described here, +this requires as many operations as there are edges in the imported +filesystem graph. + +Another approach would be to aggregate multiple directories into a single +storage object. This object would contain a serialized graph rather than a +single name-to-child dictionary. Most directory operations would fetch the +whole block of data (and presumeably cache it for a while to avoid lots of +re-fetches), and modification operations would need to replace the whole +thing at once. This "realm" approach would have the added benefit of +combining more data into a single encrypted bundle (perhaps hiding the shape +of the graph from a determined attacker), and would reduce round-trips when +performing deep directory traversals (assuming the realm was already cached). +It would also prevent fine-grained rollback attacks from working: a coalition +of storage servers could change the entire realm to look like an earlier +state, but it could not independently roll back individual directories. + +The drawbacks of this aggregation would be that small accesses (adding a +single child, looking up a single child) would require pulling or pushing a +lot of unrelated data, increasing network overhead (and necessitating +test-and-set semantics for the modification side, which increases the chances +that a user operation will fail, making it more challenging to provide +promises of atomicity to the user). + +It would also make it much more difficult to enable the delegation +("sharing") of specific directories. Since each aggregate "realm" provides +all-or-nothing access control, the act of delegating any directory from the +middle of the realm would require the realm first be split into the upper +piece that isn't being shared and the lower piece that is. This splitting +would have to be done in response to what is essentially a read operation, +which is not traditionally supposed to be a high-effort action. On the other +hand, it may be possible to aggregate the ciphertext, but use distinct +encryption keys for each component directory, to get the benefits of both +schemes at once. + + +=== Dirnode expiration and leases === + +Dirnodes are created any time a client wishes to add a new directory. How +long do they live? What's to keep them from sticking around forever, taking +up space that nobody can reach any longer? + +Mutable files are created with limited-time "leases", which keep the shares +alive until the last lease has expired or been cancelled. Clients which know +and care about specific dirnodes can ask to keep them alive for a while, by +renewing a lease on them (with a typical period of one month). Clients are +expected to assist in the deletion of dirnodes by canceling their leases as +soon as they are done with them. This means that when a client deletes a +directory, it should also cancel its lease on that directory. When the lease +count on a given share goes to zero, the storage server can delete the +related storage. Multiple clients may all have leases on the same dirnode: +the server may delete the shares only after all of the leases have gone away. + +We expect that clients will periodically create a "manifest": a list of +so-called "refresh capabilities" for all of the dirnodes and files that they +can reach. They will give this manifest to the "repairer", which is a service +that keeps files (and dirnodes) alive on behalf of clients who cannot take on +this responsibility for themselves. These refresh capabilities include the +storage index, but do *not* include the readkeys or writekeys, so the +repairer does not get to read the files or directories that it is helping to +keep alive. + +After each change to the user's vdrive, the client creates a manifest and +looks for differences from their previous version. Anything which was removed +prompts the client to send out lease-cancellation messages, allowing the data +to be deleted. + + +== Starting Points: root dirnodes == + +Any client can record the URI of a directory node in some external form (say, +in a local file) and use it as the starting point of later traversal. Each +Tahoe user is expected to create a new (unattached) dirnode when they first +start using the grid, and record its URI for later use. + +== Mounting and Sharing Directories == + +The biggest benefit of this dirnode approach is that sharing individual +directories is almost trivial. Alice creates a subdirectory that she wants to +use to share files with Bob. This subdirectory is attached to Alice's +filesystem at "~alice/share-with-bob". She asks her filesystem for the +read-write directory URI for that new directory, and emails it to Bob. When +Bob receives the URI, he asks his own local vdrive to attach the given URI, +perhaps at a place named "~bob/shared-with-alice". Every time either party +writes a file into this directory, the other will be able to read it. If +Alice prefers, she can give a read-only URI to Bob instead, and then Bob will +be able to read files but not change the contents of the directory. Neither +Alice nor Bob will get access to any files above the mounted directory: there +are no 'parent directory' pointers. If Alice creates a nested set of +directories, "~alice/share-with-bob/subdir2", and gives a read-only URI to +share-with-bob to Bob, then Bob will be unable to write to either +share-with-bob/ or subdir2/. + +A suitable UI needs to be created to allow users to easily perform this +sharing action: dragging a folder their vdrive to an IM or email user icon, +for example. The UI will need to give the sending user an opportunity to +indicate whether they want to grant read-write or read-only access to the +recipient. The recipient then needs an interface to drag the new folder into +their vdrive and give it a home. + +== Revocation == + +When Alice decides that she no longer wants Bob to be able to access the +shared directory, what should she do? Suppose she's shared this folder with +both Bob and Carol, and now she wants Carol to retain access to it but Bob to +be shut out. Ideally Carol should not have to do anything: her access should +continue unabated. + +The current plan is to have her client create a deep copy of the folder in +question, delegate access to the new folder to the remaining members of the +group (Carol), asking the lucky survivors to replace their old reference with +the new one. Bob may still have access to the old folder, but he is now the +only one who cares: everyone else has moved on, and he will no longer be able +to see their new changes. In a strict sense, this is the strongest form of +revocation that can be accomplished: there is no point trying to force Bob to +forget about the files that he read a moment before being kicked out. In +addition it must be noted that anyone who can access the directory can proxy +for Bob, reading files to him and accepting changes whenever he wants. +Preventing delegation between communication parties is just as pointless as +asking Bob to forget previously accessed files. However, there may be value +to configuring the UI to ask Carol to not share files with Bob, or to +removing all files from Bob's view at the same time his access is revoked. + diff --git a/docs/specifications/file-encoding.txt b/docs/specifications/file-encoding.txt new file mode 100644 index 00000000..23862ead --- /dev/null +++ b/docs/specifications/file-encoding.txt @@ -0,0 +1,148 @@ + +== FileEncoding == + +When the client wishes to upload an immutable file, the first step is to +decide upon an encryption key. There are two methods: convergent or random. +The goal of the convergent-key method is to make sure that multiple uploads +of the same file will result in only one copy on the grid, whereas the +random-key method does not provide this "convergence" feature. + +The convergent-key method computes the SHA-256d hash of a single-purpose tag, +the encoding parameters, a "convergence secret", and the contents of the +file. It uses a portion of the resulting hash as the AES encryption key. +There are security concerns with using convergence this approach (the +"partial-information guessing attack", please see ticket #365 for some +references), so Tahoe uses a separate (randomly-generated) "convergence +secret" for each node, stored in NODEDIR/private/convergence . The encoding +parameters (k, N, and the segment size) are included in the hash to make sure +that two different encodings of the same file will get different keys. This +method requires an extra IO pass over the file, to compute this key, and +encryption cannot be started until the pass is complete. This means that the +convergent-key method will require at least two total passes over the file. + +The random-key method simply chooses a random encryption key. Convergence is +disabled, however this method does not require a separate IO pass, so upload +can be done with a single pass. This mode makes it easier to perform +streaming upload. + +Regardless of which method is used to generate the key, the plaintext file is +encrypted (using AES in CTR mode) to produce a ciphertext. This ciphertext is +then erasure-coded and uploaded to the servers. Two hashes of the ciphertext +are generated as the encryption proceeds: a flat hash of the whole +ciphertext, and a Merkle tree. These are used to verify the correctness of +the erasure decoding step, and can be used by a "verifier" process to make +sure the file is intact without requiring the decryption key. + +The encryption key is hashed (with SHA-256d and a single-purpose tag) to +produce the "Storage Index". This Storage Index (or SI) is used to identify +the shares produced by the method described below. The grid can be thought of +as a large table that maps Storage Index to a ciphertext. Since the +ciphertext is stored as erasure-coded shares, it can also be thought of as a +table that maps SI to shares. + +Anybody who knows a Storage Index can retrieve the associated ciphertext: +ciphertexts are not secret. + + +[[Image(file-encoding1.png)]] + +The ciphertext file is then broken up into segments. The last segment is +likely to be shorter than the rest. Each segment is erasure-coded into a +number of "blocks". This takes place one segment at a time. (In fact, +encryption and erasure-coding take place at the same time, once per plaintext +segment). Larger segment sizes result in less overhead overall, but increase +both the memory footprint and the "alacrity" (the number of bytes we have to +receive before we can deliver validated plaintext to the user). The current +default segment size is 128KiB. + +One block from each segment is sent to each shareholder (aka leaseholder, +aka landlord, aka storage node, aka peer). The "share" held by each remote +shareholder is nominally just a collection of these blocks. The file will +be recoverable when a certain number of shares have been retrieved. + +[[Image(file-encoding2.png)]] + +The blocks are hashed as they are generated and transmitted. These +block hashes are put into a Merkle hash tree. When the last share has been +created, the merkle tree is completed and delivered to the peer. Later, when +we retrieve these blocks, the peer will send many of the merkle hash tree +nodes ahead of time, so we can validate each block independently. + +The root of this block hash tree is called the "block root hash" and +used in the next step. + +[[Image(file-encoding3.png)]] + +There is a higher-level Merkle tree called the "share hash tree". Its leaves +are the block root hashes from each share. The root of this tree is called +the "share root hash" and is included in the "URI Extension Block", aka UEB. +The ciphertext hash and Merkle tree are also put here, along with the +original file size, and the encoding parameters. The UEB contains all the +non-secret values that could be put in the URI, but would have made the URI +too big. So instead, the UEB is stored with the share, and the hash of the +UEB is put in the URI. + +The URI then contains the secret encryption key and the UEB hash. It also +contains the basic encoding parameters (k and N) and the file size, to make +download more efficient (by knowing the number of required shares ahead of +time, sufficient download queries can be generated in parallel). + +The URI (also known as the immutable-file read-cap, since possessing it +grants the holder the capability to read the file's plaintext) is then +represented as a (relatively) short printable string like so: + + URI:CHK:auxet66ynq55naiy2ay7cgrshm:6rudoctmbxsmbg7gwtjlimd6umtwrrsxkjzthuldsmo4nnfoc6fa:3:10:1000000 + +[[Image(file-encoding4.png)]] + +During download, when a peer begins to transmit a share, it first transmits +all of the parts of the share hash tree that are necessary to validate its +block root hash. Then it transmits the portions of the block hash tree +that are necessary to validate the first block. Then it transmits the +first block. It then continues this loop: transmitting any portions of the +block hash tree to validate block#N, then sending block#N. + +[[Image(file-encoding5.png)]] + +So the "share" that is sent to the remote peer actually consists of three +pieces, sent in a specific order as they become available, and retrieved +during download in a different order according to when they are needed. + +The first piece is the blocks themselves, one per segment. The last +block will likely be shorter than the rest, because the last segment is +probably shorter than the rest. The second piece is the block hash tree, +consisting of a total of two SHA-1 hashes per block. The third piece is a +hash chain from the share hash tree, consisting of log2(numshares) hashes. + +During upload, all blocks are sent first, followed by the block hash +tree, followed by the share hash chain. During download, the share hash chain +is delivered first, followed by the block root hash. The client then uses +the hash chain to validate the block root hash. Then the peer delivers +enough of the block hash tree to validate the first block, followed by +the first block itself. The block hash chain is used to validate the +block, then it is passed (along with the first block from several other +peers) into decoding, to produce the first segment of crypttext, which is +then decrypted to produce the first segment of plaintext, which is finally +delivered to the user. + +[[Image(file-encoding6.png)]] + +== Hashes == + +All hashes use SHA-256d, as defined in Practical Cryptography (by Ferguson +and Schneier). All hashes use a single-purpose tag, e.g. the hash that +converts an encryption key into a storage index is defined as follows: + + SI = SHA256d(netstring("allmydata_immutable_key_to_storage_index_v1") + key) + +When two separate values need to be combined together in a hash, we wrap each +in a netstring. + +Using SHA-256d (instead of plain SHA-256) guards against length-extension +attacks. Using the tag protects our Merkle trees against attacks in which the +hash of a leaf is confused with a hash of two children (allowing an attacker +to generate corrupted data that nevertheless appears to be valid), and is +simply good "cryptograhic hygiene". The "Chosen Protocol Attack" by Kelsey, +Schneier, and Wagner (http://www.schneier.com/paper-chosen-protocol.html) is +relevant. Putting the tag in a netstring guards against attacks that seek to +confuse the end of the tag with the beginning of the subsequent value. diff --git a/docs/specifications/file-encoding1.svg b/docs/specifications/file-encoding1.svg new file mode 100644 index 00000000..06b702a2 --- /dev/null +++ b/docs/specifications/file-encoding1.svg @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + sodipodi:docbase="/home/warner/trees/tahoe/docs" + sodipodi:docname="file-encoding1.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3252" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective81" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.0395661" + inkscape:cx="631.22458" + inkscape:cy="706.27996" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1680" + inkscape:window-height="1050" + inkscape:window-x="0" + inkscape:window-y="0" + showgrid="false" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3081" + transform="translate(-198.1596,-0.9619396)"> + <rect + y="17.505058" + x="210.76614" + height="78.85553" + width="305.95944" + id="rect1872" + style="fill:#e3f4d7;stroke:#000000;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text1874" + y="44.315933" + x="258.83313" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="44.315933" + x="258.83313" + id="tspan3079" + sodipodi:role="line">FILE (plaintext)</tspan></text> + </g> + <g + id="g4629" + transform="translate(-8.6574585,46.173112)"> + <rect + style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect3033" + width="116.35974" + height="73.956482" + x="442.19803" + y="243.98456" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="501.92212" + y="264.25281" + id="text3035" + sodipodi:linespacing="100%"><tspan + y="264.25281" + x="501.92212" + id="tspan3047" + sodipodi:role="line">convergent</tspan><tspan + id="tspan4627" + y="284.25281" + x="501.92212" + sodipodi:role="line">encryption</tspan><tspan + y="304.25281" + x="501.92212" + sodipodi:role="line" + id="tspan4604">key</tspan></text> + </g> + <g + id="g3139" + transform="translate(-122.35224,48.551816)"> + <path + transform="matrix(0.923205,0,0,0.923205,-231.4625,247.6493)" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3128" + style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3130" + y="434.10446" + x="299.26846" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="434.10446" + x="299.26846" + id="tspan3137" + sodipodi:role="line">AES-CTR</tspan></text> + </g> + <g + id="g3201" + transform="translate(-129.86188,50.020871)"> + <rect + style="fill:#d5e5ff;stroke:#000000;stroke-width:0.96806562;stroke-opacity:1" + id="rect3154" + width="286.73019" + height="78.85553" + x="196.96533" + y="521.95709" /> + <text + transform="scale(0.968066,1.032988)" + xml:space="preserve" + style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="249.83606" + y="531.24384" + id="text3156" + sodipodi:linespacing="100%"><tspan + y="531.24384" + x="249.83606" + id="tspan3163" + sodipodi:role="line">FILE (crypttext)</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 208.10132,509.1107 L 208.10132,568.80529" + id="path3170" + sodipodi:nodetypes="cc" /> + <g + id="g4640" + transform="translate(447.30202,-236.63721)"> + <rect + y="755.01099" + x="24.107248" + height="28.084265" + width="36.708984" + id="rect3195" + style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3197" + y="771.30011" + x="32.327164" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="771.30011" + x="32.327164" + id="tspan3246" + sodipodi:role="line">tag</tspan></text> + </g> + <g + id="g4661" + transform="translate(1.9238797,4.8096992)"> + <rect + y="702.01349" + x="514.47058" + height="55.723186" + width="100.84161" + id="rect3237" + style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3239" + y="724.94507" + x="564.60577" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="724.94507" + x="564.60577" + id="tspan3253" + sodipodi:role="line">storage</tspan><tspan + id="tspan4659" + y="744.94507" + x="564.60577" + sodipodi:role="line">index</tspan></text> + </g> + <g + id="g3212" + transform="translate(-96.193983,-7.2527756)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="path3214" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" /> + <text + xml:space="preserve" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="548.34637" + y="181.94142" + id="text3216" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3218" + x="548.34637" + y="181.94142">SHA-256</tspan></text> + </g> + <g + transform="translate(-9.1639282,440.10771)" + id="g3220"> + <path + transform="matrix(0.923205,0,0,0.923205,16.499579,-4.4109378)" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3222" + style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3224" + y="181.94142" + x="548.34637" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="181.94142" + x="548.34637" + id="tspan3226" + sodipodi:role="line">SHA-256</tspan></text> + </g> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 320.32596,46.173119 C 407.86248,54.830577 448.26397,96.193988 468.4647,138.51934" + id="path2462" + sodipodi:nodetypes="cz" /> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 200.08348,97.15593 C 198.48026,294.3536 195.91508,353.03192 205.85512,444.41621" + id="path4024" + sodipodi:nodetypes="cs" /> + <g + id="g4558" + transform="translate(141.40516,-11.543278)"> + <rect + y="125.18694" + x="220.07802" + height="36.436913" + width="55.42865" + id="rect4549" + style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text4551" + y="145.6524" + x="237.65776" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan4553" + x="237.65776" + y="145.6524">tag</tspan></text> + </g> + <path + sodipodi:nodetypes="cz" + id="path4563" + d="M 416.51994,129.86189 C 429.9871,127.93801 436.72069,133.70964 452.11173,151.9865" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <g + id="g4576" + transform="translate(12.505218,-12.505218)"> + <rect + style="fill:#e3f4d7;stroke:#000000;stroke-width:1.19514322;stroke-opacity:1" + id="rect4567" + width="161.24203" + height="40.284672" + x="481.72565" + y="69.394432" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="498.39401" + y="92.476768" + id="text4569" + sodipodi:linespacing="100%"><tspan + y="92.476768" + x="498.39401" + id="tspan4571" + sodipodi:role="line">encoding parameters</tspan></text> + </g> + <path + sodipodi:nodetypes="cz" + id="path4581" + d="M 564.65868,98.11787 C 565.62061,128.89994 533.87661,132.7477 507.90423,147.1768" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 479.04603,201.04543 C 487.70348,234.71332 489.62738,252.99018 491.55126,288.58195" + id="path4583" + sodipodi:nodetypes="cz" /> + <g + id="g4616" + transform="translate(16.352977,64.449968)"> + <rect + y="227.63158" + x="583.60315" + height="71.070618" + width="119.24558" + id="rect4587" + style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text4589" + y="246.66689" + x="644.2406" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan4591" + x="644.2406" + y="246.66689">random</tspan><tspan + id="tspan4600" + sodipodi:role="line" + x="644.2406" + y="266.66687">encryption</tspan><tspan + id="tspan4602" + sodipodi:role="line" + x="644.2406" + y="286.66687">key</tspan></text> + </g> + <path + sodipodi:nodetypes="cz" + id="path4593" + d="M 486.74156,365.53714 C 480.96991,415.55801 289.54389,464.61694 241.4469,469.42664" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 654.1191,362.65133 C 625.26089,454.03561 275.1148,476.16022 241.4469,480.00798" + id="path4595" + sodipodi:nodetypes="cz" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier 10 Pitch" + x="561.77289" + y="335.71701" + id="text4636" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan4638" + x="561.77289" + y="335.71701">or</tspan></text> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 485.77962,367.46102 C 496.36095,429.98711 582.93553,528.10497 576.20196,584.85942" + id="path4645" + sodipodi:nodetypes="cz" /> + <path + sodipodi:nodetypes="cz" + id="path4647" + d="M 654.1191,364.57521 C 642.57581,418.44383 597.36465,548.3057 582.93554,585.82136" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 507.90424,532.91467 C 534.83855,543.49601 533.87661,566.58256 548.30571,589.66912" + id="path4649" + sodipodi:nodetypes="cz" /> + <path + sodipodi:nodetypes="cz" + id="path4651" + d="M 564.65869,648.34745 C 568.50644,671.43401 569.46838,687.78698 569.46838,704.13996" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + </g> +</svg> diff --git a/docs/specifications/file-encoding2.svg b/docs/specifications/file-encoding2.svg new file mode 100644 index 00000000..6db3de37 --- /dev/null +++ b/docs/specifications/file-encoding2.svg @@ -0,0 +1,922 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/warner/trees/tahoe/docs" + sodipodi:docname="file-encoding2.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.51978303" + inkscape:cx="372.04724" + inkscape:cy="526.18109" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="900" + inkscape:window-height="756" + inkscape:window-x="779" + inkscape:window-y="153" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3201" + transform="translate(-5.78221,-477.996)"> + <rect + style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" + id="rect3154" + width="286.73019" + height="78.85553" + x="196.96533" + y="521.95709" /> + <text + transform="scale(0.968066,1.032988)" + xml:space="preserve" + style="font-size:27.10585976px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="249.83606" + y="531.24384" + id="text3156" + sodipodi:linespacing="100%"><tspan + y="531.24384" + x="249.83606" + id="tspan3163" + sodipodi:role="line">FILE (crypttext)</tspan></text> + </g> + <g + id="g2022"> + <rect + y="214.548" + x="40.845631" + height="80.782936" + width="80.498047" + id="rect3273" + style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3275" + y="255.87878" + x="56.581703" + style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve" + transform="scale(0.968066,1.032988)"><tspan + y="255.87878" + x="56.581703" + id="tspan1993" + sodipodi:role="line">segA</tspan></text> + </g> + <g + id="g2017"> + <rect + style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" + id="rect3284" + width="80.498047" + height="80.782936" + x="161.45784" + y="214.548" /> + <text + transform="scale(0.968066,1.032988)" + xml:space="preserve" + style="font-size:28;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="184.53419" + y="251.69087" + id="text3286" + sodipodi:linespacing="100%"><tspan + y="251.69087" + x="184.53419" + id="tspan1995" + sodipodi:role="line">segB</tspan></text> + </g> + <g + id="g2012"> + <rect + y="214.548" + x="282.07007" + height="80.782936" + width="80.498047" + id="rect3290" + style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3292" + y="253.62892" + x="304.44913" + style="font-size:27.99999214;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve" + transform="scale(0.968066,1.032988)"><tspan + y="253.62892" + x="304.44913" + id="tspan1997" + sodipodi:role="line">segC</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 223.51231,125.60384 L 88.587195,212.82815" + id="path4243" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 297.10782,124.24096 L 205.79487,215.55391" + id="path4245" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 373.4291,122.87808 L 325.7283,212.82816" + id="path4247" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 458.9333,124.24096 L 443.56317,216.05143" + id="path4249" + sodipodi:nodetypes="cc" /> + <rect + y="214.548" + x="422.02194" + height="80.782951" + width="61.22403" + id="rect3296" + style="fill:#d5e5ff;stroke:black;stroke-width:0.96806562;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3298" + y="253.42572" + x="440.45892" + style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve" + transform="scale(0.968066,1.032988)"><tspan + sodipodi:role="line" + id="tspan1999" + x="440.45892" + y="253.42572">segD</tspan></text> + <rect + style="fill:white;fill-opacity:1;stroke:black;stroke-width:0.96806562;stroke-opacity:1" + id="rect3308" + width="32.312965" + height="80.782936" + x="484.21405" + y="214.548" /> + <g + id="g2040" + transform="translate(-16.41804,-13.31249)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path2029" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" /> + <text + xml:space="preserve" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="84.763" + y="377.10425" + id="text2031" + sodipodi:linespacing="100%"><tspan + y="377.10425" + x="84.763" + id="tspan2038" + sodipodi:role="line">FEC</tspan></text> + </g> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect2045" + width="62.568695" + height="54.581161" + x="106.49989" + y="400.05042" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="114.42955" + y="424.05099" + id="text2932" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan2934" + x="114.42955" + y="424.05099">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="126.88751" + y="445.35098" + id="text2936" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan2938" + x="126.88751" + y="445.35098">A1</tspan></text> + <rect + ry="0" + y="471.49408" + x="106.49989" + height="54.581161" + width="62.568695" + id="rect2956" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text2960" + y="495.49466" + x="114.42955" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3869" + x="114.42955" + y="495.49466">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text2964" + y="516.79468" + x="126.88751" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3018" + x="126.88751" + y="516.79468">A2</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect2970" + width="62.568695" + height="54.581161" + x="106.49989" + y="542.93781" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="114.42955" + y="566.93835" + id="text2974" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan2976" + x="114.42955" + y="566.93835">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="126.88751" + y="588.23834" + id="text2978" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3040" + x="126.88751" + y="588.23834">A3</tspan></text> + <rect + ry="0" + y="614.38141" + x="106.49989" + height="54.581161" + width="62.568695" + id="rect2984" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text2988" + y="638.38196" + x="114.42955" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="638.38196" + x="114.42955" + id="tspan2990" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text2992" + y="659.68195" + x="126.88751" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3042" + x="126.88751" + y="659.68195">A4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 79.874914,296.213 L 79.874914,326.83172" + id="path2996" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 90.524902,388.06915 C 85.442028,403.37176 95.420905,411.5033 105.16864,424.01286" + id="path3000" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 82.537411,389.4004 C 77.419162,441.79407 81.801856,464.47336 103.83739,495.90028" + id="path3002" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 71.887422,389.4004 C 62.3162,464.27336 66.595451,538.86154 105.16864,573.1127" + id="path3004" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 59.906185,384.0754 C 30.833264,497.98462 73.280777,611.91471 105.16864,643.66887" + id="path3006" + sodipodi:nodetypes="cc" /> + <g + transform="translate(114.1248,-13.31249)" + id="g3090"> + <path + transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3092" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3094" + y="377.10425" + x="84.763" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3096" + x="84.763" + y="377.10425">FEC</tspan></text> + </g> + <rect + ry="0" + y="400.05042" + x="237.04271" + height="54.581161" + width="62.568695" + id="rect3098" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3100" + y="424.05099" + x="244.97237" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="424.05099" + x="244.97237" + id="tspan3102" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3104" + y="445.35098" + x="257.43033" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3266" + x="257.43033" + y="445.35098">B1</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3108" + width="62.568695" + height="54.581161" + x="237.04271" + y="471.49408" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="244.97237" + y="495.49466" + id="text3110" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3112" + x="244.97237" + y="495.49466">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="257.43033" + y="516.79468" + id="text3114" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3268" + x="257.43033" + y="516.79468">B2</tspan></text> + <rect + ry="0" + y="542.93781" + x="237.04271" + height="54.581161" + width="62.568695" + id="rect3118" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3120" + y="566.93835" + x="244.97237" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="566.93835" + x="244.97237" + id="tspan3122" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3124" + y="588.23834" + x="257.43033" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3270" + x="257.43033" + y="588.23834">B3</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3128" + width="62.568695" + height="54.581161" + x="237.04271" + y="614.38141" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="244.97237" + y="638.38196" + id="text3130" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3132" + x="244.97237" + y="638.38196">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="257.43033" + y="659.68195" + id="text3134" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3272" + x="257.43033" + y="659.68195">B4</tspan></text> + <path + id="path3138" + d="M 210.41773,296.213 L 210.41773,326.83172" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3140" + d="M 221.06772,388.06915 C 215.98484,403.37176 225.96372,411.5033 235.71146,424.01286" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3142" + d="M 213.08023,389.4004 C 207.96198,441.79407 212.34467,464.47336 234.38021,495.90028" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3144" + d="M 202.43024,389.4004 C 192.85902,464.27336 197.13827,538.86154 235.71146,573.1127" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3146" + d="M 190.449,384.0754 C 161.37608,497.98462 203.82359,611.91471 235.71146,643.66887" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <g + id="g3148" + transform="translate(241.4443,-13.31249)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3150" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" /> + <text + xml:space="preserve" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="84.763" + y="377.10425" + id="text3152" + sodipodi:linespacing="100%"><tspan + y="377.10425" + x="84.763" + id="tspan3154" + sodipodi:role="line">FEC</tspan></text> + </g> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3156" + width="62.568695" + height="54.581161" + x="364.36224" + y="400.05042" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="372.2919" + y="424.05099" + id="text3158" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3160" + x="372.2919" + y="424.05099">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="384.74988" + y="445.35098" + id="text3162" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3274" + x="384.74988" + y="445.35098">C1</tspan></text> + <rect + ry="0" + y="471.49408" + x="364.36224" + height="54.581161" + width="62.568695" + id="rect3166" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3168" + y="495.49466" + x="372.2919" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="495.49466" + x="372.2919" + id="tspan3170" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3172" + y="516.79468" + x="384.74988" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3278" + x="384.74988" + y="516.79468">C2</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3176" + width="62.568695" + height="54.581161" + x="364.36224" + y="542.93781" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="372.2919" + y="566.93835" + id="text3178" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3180" + x="372.2919" + y="566.93835">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="384.74988" + y="588.23834" + id="text3182" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3280" + x="384.74988" + y="588.23834">C3</tspan></text> + <rect + ry="0" + y="614.38141" + x="364.36224" + height="54.581161" + width="62.568695" + id="rect3186" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3188" + y="638.38196" + x="372.2919" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="638.38196" + x="372.2919" + id="tspan3190" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3192" + y="659.68195" + x="384.74988" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3282" + x="384.74988" + y="659.68195">C4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 337.73727,296.213 L 337.73727,326.83172" + id="path3196" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 348.38726,388.06915 C 343.30438,403.37176 353.28326,411.5033 363.031,424.01286" + id="path3198" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 340.39977,389.4004 C 335.28152,441.79407 339.66421,464.47336 361.69975,495.90028" + id="path3200" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 329.74978,389.4004 C 320.17856,464.27336 324.45781,538.86154 363.031,573.1127" + id="path3202" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 317.76854,384.0754 C 288.69562,497.98462 331.14313,611.91471 363.031,643.66887" + id="path3204" + sodipodi:nodetypes="cc" /> + <g + transform="translate(370.3755,-13.31249)" + id="g3207"> + <path + transform="matrix(0.923205,0,0,0.923205,-463.3983,190.6491)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3209" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3211" + y="377.10425" + x="84.763" + style="font-size:14.77128029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3213" + x="84.763" + y="377.10425">FEC</tspan></text> + </g> + <rect + ry="0" + y="400.05042" + x="493.29343" + height="54.581161" + width="62.568695" + id="rect3215" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3217" + y="424.05099" + x="501.22308" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="424.05099" + x="501.22308" + id="tspan3219" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3221" + y="445.35098" + x="513.68103" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3284" + x="513.68103" + y="445.35098">D1</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3225" + width="62.568695" + height="54.581161" + x="493.29343" + y="471.49408" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="501.22308" + y="495.49466" + id="text3227" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3229" + x="501.22308" + y="495.49466">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="513.68103" + y="516.79468" + id="text3231" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3286" + x="513.68103" + y="516.79468">D2</tspan></text> + <rect + ry="0" + y="542.93781" + x="493.29343" + height="54.581161" + width="62.568695" + id="rect3235" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3237" + y="566.93835" + x="501.22308" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="566.93835" + x="501.22308" + id="tspan3239" + sodipodi:role="line">block</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3241" + y="588.23834" + x="513.68103" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3288" + x="513.68103" + y="588.23834">D3</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3245" + width="62.568695" + height="54.581161" + x="493.29343" + y="614.38141" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="501.22308" + y="638.38196" + id="text3247" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3249" + x="501.22308" + y="638.38196">block</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="513.68103" + y="659.68195" + id="text3251" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3293" + x="513.68103" + y="659.68195">D4</tspan></text> + <path + id="path3256" + d="M 466.66845,296.213 L 466.66845,326.83172" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3258" + d="M 477.31844,388.06915 C 472.23556,403.37176 482.21444,411.5033 491.96218,424.01286" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3260" + d="M 469.33095,389.4004 C 464.2127,441.79407 468.59539,464.47336 490.63093,495.90028" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3262" + d="M 458.68096,389.4004 C 449.10974,464.27336 453.38899,538.86154 491.96218,573.1127" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path3264" + d="M 446.69972,384.0754 C 417.6268,497.98462 460.07431,611.91471 491.96218,643.66887" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" /> + <rect + style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3831" + width="516.80328" + height="103.59095" + x="66.758537" + y="604.61957" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="80.570648" + y="700.15332" + id="text3833" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3835" + x="80.570648" + y="700.15332">share4</tspan></text> + <rect + style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3837" + width="95.533775" + height="81.721664" + x="631.90411" + y="640.30084" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="650.27539" + y="660.8269" + id="text3839" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3841" + x="650.27539" + y="660.8269">peer 4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 582.41071,673.68012 C 631.90411,677.13315 631.90411,677.13315 631.90411,677.13315" + id="path3843" /> + </g> +</svg> diff --git a/docs/specifications/file-encoding3.svg b/docs/specifications/file-encoding3.svg new file mode 100644 index 00000000..fb5fd4c0 --- /dev/null +++ b/docs/specifications/file-encoding3.svg @@ -0,0 +1,484 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/warner/work/tahoe-misc" + sodipodi:docname="file-encoding3.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.523584" + inkscape:cx="372.04724" + inkscape:cy="526.18109" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="900" + inkscape:window-height="756" + inkscape:window-x="778" + inkscape:window-y="96" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3308" + transform="translate(-492.4404,-287.9192)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3297" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3299" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3306" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-361.8975,-287.9192)" + id="g3313"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3315" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3317" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3319" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + id="g3321" + transform="translate(-427.1689,-180.8987)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3323" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3325" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3327" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-298.6406,-78.23132)" + id="g3329"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3331" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3333" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3335" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + transform="translate(-234.578,-287.9192)" + id="g3345"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3347" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3349" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3351" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + id="g3353" + transform="translate(-170.1124,-180.8987)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3355" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3357" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3359" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-105.6468,-287.9192)" + id="g3361"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3363" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3365" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3367" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <rect + ry="0" + y="47.720215" + x="76.855522" + height="54.581161" + width="62.568695" + id="rect2984" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text2988" + y="71.720772" + x="84.785179" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="71.720772" + x="84.785179" + id="tspan2990" + sodipodi:role="line">share</tspan></text> + <text + sodipodi:linespacing="100%" + id="text2992" + y="93.020752" + x="97.243141" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3042" + x="97.243141" + y="93.020752">A4</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3128" + width="62.568695" + height="54.581161" + x="207.39835" + y="47.720215" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="215.328" + y="71.720772" + id="text3130" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3132" + x="215.328" + y="71.720772">share</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="227.78596" + y="93.020752" + id="text3134" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3272" + x="227.78596" + y="93.020752">B4</tspan></text> + <rect + ry="0" + y="47.720215" + x="334.7179" + height="54.581161" + width="62.568695" + id="rect3186" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3188" + y="71.720772" + x="342.64755" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="71.720772" + x="342.64755" + id="tspan3190" + sodipodi:role="line">share</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3192" + y="93.020752" + x="355.10553" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3282" + x="355.10553" + y="93.020752">C4</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3245" + width="62.568695" + height="54.581161" + x="463.64905" + y="47.720215" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="471.5787" + y="71.720772" + id="text3247" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3249" + x="471.5787" + y="71.720772">share</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="484.03665" + y="93.020752" + id="text3251" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3293" + x="484.03665" + y="93.020752">D4</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3831" + width="516.80328" + height="491.99808" + x="37.114162" + y="37.958374" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="44.343109" + y="521.89929" + id="text3833" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3835" + x="44.343109" + y="521.89929">share4</tspan></text> + <rect + style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3837" + width="95.533775" + height="81.721664" + x="602.25977" + y="73.639648" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="620.63104" + y="94.16571" + id="text3839" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3841" + x="620.63104" + y="94.16571">peer 4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 552.76635,107.01893 C 602.25975,110.47196 602.25975,110.47196 602.25975,110.47196" + id="path3843" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 106.27121,102.50451 L 108.15211,173.97895" + id="path2431" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 238.8751,102.50451 L 237.93464,173.03849" + id="path2433" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 366.77673,103.44496 L 366.77673,172.09804" + id="path2435" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 495.61881,103.44496 L 495.61881,173.03849" + id="path2437" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 489.97609,208.77571 L 438.25116,282.13106" + id="path2439" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 370.53854,207.83526 L 420.38255,282.13106" + id="path2441" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 236.05374,209.71617 L 183.38836,284.01197" + id="path2443" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 110.97347,207.83526 L 164.5793,282.13106" + id="path2445" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 178.6861,315.98737 L 289.65957,388.40226" + id="path2447" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 426.02527,315.98737 L 316.93271,389.34272" + id="path2449" /> + <rect + style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1" + id="rect3336" + width="474.92883" + height="334.80142" + x="61.129456" + y="140.12263" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="241.69646" + y="263.32199" + id="text3338" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3340" + x="241.69646" + y="263.32199">Merkle Tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="68.653069" + y="466.45987" + id="text3342" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3344" + x="68.653069" + y="466.45987">block hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="321.63498" + y="405.33044" + id="text3346" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3352" + x="321.63498" + y="405.33044">"block root hash"</tspan></text> + </g> +</svg> diff --git a/docs/specifications/file-encoding4.svg b/docs/specifications/file-encoding4.svg new file mode 100644 index 00000000..f4b21d02 --- /dev/null +++ b/docs/specifications/file-encoding4.svg @@ -0,0 +1,675 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + sodipodi:docbase="/home/warner/work/tahoe-misc" + sodipodi:docname="file-encoding4.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective5442" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.0814091" + inkscape:cx="327.67132" + inkscape:cy="590.71497" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1680" + inkscape:window-height="1050" + inkscape:window-x="0" + inkscape:window-y="0" + showgrid="false" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="212.25175" + y="109.45165" + id="text3632" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3634" + x="212.25175" + y="109.45165">block</tspan><tspan + sodipodi:role="line" + x="212.25175" + y="129.45165" + id="tspan3636">root hashes</tspan></text> + <g + id="g3642" + transform="translate(-226.712,-129.0765)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3644" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3646" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3648" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + id="g3675" + transform="translate(175.712,7.63966)"> + <path + transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3331" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3653" + y="160.03162" + x="68.92907" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="160.03162" + x="68.92907" + id="tspan3655" + sodipodi:role="line">s1</tspan></text> + </g> + <g + id="g3686" + transform="translate(175.712,2.282887)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3657" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="68.029869" + y="239.32857" + id="text3659" + sodipodi:linespacing="100%"><tspan + y="239.32857" + x="68.029869" + id="tspan3680" + sodipodi:role="line">s2</tspan></text> + </g> + <g + id="g3691" + transform="translate(175.712,0.186429)"> + <path + transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3663" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3665" + y="313.49518" + x="70.729767" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="313.49518" + x="70.729767" + id="tspan3682" + sodipodi:role="line">s3</tspan></text> + </g> + <g + id="g3696" + transform="translate(175.712,7.639653)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3669" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="72.669769" + y="377.16217" + id="text3671" + sodipodi:linespacing="100%"><tspan + y="377.16217" + x="72.669769" + id="tspan3684" + sodipodi:role="line">s4</tspan></text> + </g> + <g + transform="translate(-228.8541,-284.0256)" + id="g3701"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3703" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3705" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3707" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + transform="translate(-110.3217,-218.3329)" + id="g3709"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3711" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3713" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3715" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 270.6808,165.29588 L 353.51073,189.57362" + id="path3717" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 272.10891,234.55883 C 275.67916,233.13073 354.22478,203.14059 354.22478,203.14059" + id="path3719" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 274.96511,307.39204 L 356.36693,341.66649" + id="path3721" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 275.67916,379.51119 L 355.65288,358.80371" + id="path3723" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 390.64138,347.3789 L 473.4713,271.68949" + id="path3725" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 389.92733,198.14223 L 472.75725,253.12416" + id="path3727" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="82.126266" + y="105.04523" + id="text4615" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan4617" + x="82.126266" + y="105.04523">shares</tspan></text> + <g + id="g4662" + transform="translate(0,-7.629395e-6)"> + <rect + ry="0" + y="131.23222" + x="69.941055" + height="62.310936" + width="88.076958" + id="rect3245" + style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text4619" + y="167.66769" + x="84.927971" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="167.66769" + x="84.927971" + id="tspan4621" + sodipodi:role="line">share1</tspan></text> + </g> + <g + id="g4657" + transform="translate(-0.77298,-0.515305)"> + <rect + style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect4623" + width="88.076958" + height="62.310936" + x="70.714035" + y="203.11914" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="85.700951" + y="239.55461" + id="text4625" + sodipodi:linespacing="100%"><tspan + y="239.55461" + x="85.700951" + id="tspan4641" + sodipodi:role="line">share2</tspan></text> + </g> + <g + id="g4652" + transform="translate(-3.864891,1.288307)"> + <rect + ry="0" + y="272.68713" + x="73.805946" + height="62.310936" + width="88.076958" + id="rect4629" + style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text4631" + y="309.12259" + x="88.792862" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="309.12259" + x="88.792862" + id="tspan4643" + sodipodi:role="line">share3</tspan></text> + </g> + <g + id="g4647" + transform="translate(-4.637871,0)"> + <rect + style="fill:#aa87de;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect4635" + width="88.076958" + height="62.310936" + x="74.578926" + y="345.34702" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="89.565842" + y="381.78247" + id="text4637" + sodipodi:linespacing="100%"><tspan + y="381.78247" + x="89.565842" + id="tspan4645" + sodipodi:role="line">share4</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 159.23338,161.89201 L 234.98518,160.34605" + id="path4667" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 159.23338,233.77892 L 236.53114,233.00595" + id="path4669" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 160.77934,304.11988 L 239.62305,305.66584" + id="path4671" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 158.4604,374.46084 L 238.85007,377.55275" + id="path4673" /> + <rect + style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5560" + width="451.25253" + height="376.15237" + x="201.65356" + y="75.152138" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="320.79318" + y="271.27441" + id="text3338" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3340" + x="320.79318" + y="271.27441">Merkle Tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="211.74399" + y="441.22202" + id="text3342" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan7495" + x="211.74399" + y="441.22202">share hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="495.05698" + y="240.97345" + id="text5566" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5568" + x="495.05698" + y="240.97345">"share root hash"</tspan></text> + <rect + style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect8042" + width="372.43307" + height="126.05428" + x="258.43817" + y="492.44629" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="267.38785" + y="521.40631" + id="text8044" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan8046" + x="267.38785" + y="521.40631">URI Extension Block</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 491.09641,278.8051 L 505.57143,535.71157" + id="path8064" + sodipodi:nodetypes="cc" /> + <g + id="g5534"> + <text + sodipodi:linespacing="100%" + id="text8048" + y="560.19122" + x="296.70987" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="560.19122" + x="296.70987" + id="tspan8050" + sodipodi:role="line">file size</tspan></text> + <rect + y="538.7973" + x="291.02008" + height="31.027878" + width="84.953964" + id="rect8066" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <g + id="g5539" + transform="translate(-21.380944,3.5634906)"> + <text + sodipodi:linespacing="100%" + id="text8052" + y="595.66229" + x="296.09039" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="595.66229" + x="296.09039" + id="tspan8054" + sodipodi:role="line">encoding parameters</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect8068" + width="205.77185" + height="29.795084" + x="291.02008" + y="576.24475" /> + </g> + <g + id="g5529"> + <text + sodipodi:linespacing="100%" + id="text8060" + y="557.45142" + x="430.06894" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="557.45142" + x="430.06894" + id="tspan8062" + sodipodi:role="line">share root hash</tspan></text> + <rect + y="536.65747" + x="420.48123" + height="31.027878" + width="162.62888" + id="rect8070" + style="fill:none;fill-opacity:1;stroke:black;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <flowRoot + xml:space="preserve" + id="flowRoot5444" + style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%"><flowRegion + id="flowRegion5446"><rect + id="rect5448" + width="440.86795" + height="206.59506" + x="212.52603" + y="478.04767" /></flowRegion><flowPara + id="flowPara5450"></flowPara></flowRoot> <flowRoot + style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Courier 10 Pitch;font-style:normal;font-weight:normal;font-size:18px;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:100%" + id="flowRoot5452" + xml:space="preserve"><flowRegion + id="flowRegion5454"><rect + y="478.04767" + x="212.52603" + height="206.59506" + width="440.86795" + id="rect5456" /></flowRegion><flowPara + id="flowPara5458"></flowPara></flowRoot> <rect + y="722.08801" + x="249.14307" + height="126.05428" + width="372.43307" + id="rect5460" + style="fill:#d5f6ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text5462" + y="750.73669" + x="264.42236" + style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="750.73669" + x="264.42236" + id="tspan5464" + sodipodi:role="line">URI / "file read-cap"</tspan></text> + <g + id="g5498"> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="471.72757" + y="789.75726" + id="text5478" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5480" + x="471.72757" + y="789.75726">UEB hash</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5486" + width="109.25024" + height="31.027878" + x="461.99792" + y="768.95331" /> + </g> + <g + id="g5503"> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="275.49631" + y="792.89374" + id="text5474" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5476" + x="275.49631" + y="792.89374">encryption key</tspan></text> + <rect + y="770.815" + x="268.32343" + height="36.37751" + width="148.71983" + id="rect5488" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <g + transform="translate(-97.251286,198.1785)" + id="g5490"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path5492" + style="fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text5494" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan5496" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <path + id="path5508" + d="M 490.16032,618.22602 L 500.19251,660.16729" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 506.13565,695.45603 L 516.96501,767.91304" + id="path5510" /> + <g + id="g5524" + transform="translate(-7.8396793,-5.701585)"> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect8072" + width="127.96149" + height="31.434599" + x="502.91043" + y="583.00134" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="507.92603" + y="603.99866" + id="text5520" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5522" + x="507.92603" + y="603.99866">other hashes</tspan></text> + </g> + </g> +</svg> diff --git a/docs/specifications/file-encoding5.svg b/docs/specifications/file-encoding5.svg new file mode 100644 index 00000000..a20a1369 --- /dev/null +++ b/docs/specifications/file-encoding5.svg @@ -0,0 +1,585 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/warner/work/tahoe-misc" + sodipodi:docname="file-encoding5.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.79718499" + inkscape:cx="410.02658" + inkscape:cy="638.93685" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="900" + inkscape:window-height="756" + inkscape:window-x="699" + inkscape:window-y="165" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="93.755287" + y="98.537506" + id="text3632" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3634" + x="93.755287" + y="98.537506">block</tspan><tspan + sodipodi:role="line" + x="93.755287" + y="118.53751" + id="tspan3636">root hashes</tspan></text> + <g + id="g3642" + transform="translate(-279.7236,-129.0765)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3644" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3646" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3648" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + id="g3675" + transform="translate(63.82283,6.080481)"> + <path + transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3331" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3653" + y="160.03162" + x="68.92907" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="160.03162" + x="68.92907" + id="tspan3655" + sodipodi:role="line">s1</tspan></text> + </g> + <g + id="g3686" + transform="translate(61.28203,2.918364)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3657" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="68.029869" + y="239.32857" + id="text3659" + sodipodi:linespacing="100%"><tspan + y="239.32857" + x="68.029869" + id="tspan3680" + sodipodi:role="line">s2</tspan></text> + </g> + <g + id="g3691" + transform="translate(59.37213,3.016624)"> + <path + transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3663" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3665" + y="313.49518" + x="70.729767" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="313.49518" + x="70.729767" + id="tspan3682" + sodipodi:role="line">s3</tspan></text> + </g> + <g + id="g3696" + transform="translate(59.37213,12.6645)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3669" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="72.669769" + y="377.16217" + id="text3671" + sodipodi:linespacing="100%"><tspan + y="377.16217" + x="72.669769" + id="tspan3684" + sodipodi:role="line">s4</tspan></text> + </g> + <g + transform="translate(-281.8657,-284.0256)" + id="g3701"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3703" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3705" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3707" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + transform="translate(-104.085,-218.3329)" + id="g3709"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3711" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3713" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3715" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 158.42099,162.17755 L 300.49915,189.57362" + id="path3717" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 162.96742,234.55883 C 166.53767,233.13073 301.2132,203.14059 301.2132,203.14059" + id="path3719" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 162.7053,312.06953 L 303.35535,341.66649" + id="path3721" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 160.30102,384.18868 L 302.6413,358.80371" + id="path3723" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 340.74813,350.49723 L 479.70796,268.57116" + id="path3725" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 341.59324,198.14223 L 480.55307,259.36082" + id="path3727" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="387.9295" + y="82.614281" + id="text3342" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan7297" + x="387.9295" + y="82.614281">share hash tree</tspan></text> + <g + transform="translate(-277.1965,175.8469)" + id="g6278"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path6280" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text6282" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan6284" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + id="g6374" + transform="translate(0,-6.583939)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path6288" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-170.1473,365.3129)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="130.1619" + y="471.03552" + id="text6290" + sodipodi:linespacing="100%"><tspan + y="471.03552" + x="130.1619" + id="tspan6366" + sodipodi:role="line">s5</tspan></text> + </g> + <g + id="g6379" + transform="translate(0,-4.389282)"> + <path + transform="matrix(0.511994,0,0,0.511994,-170.1473,437.7031)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path6296" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text6298" + y="544.97565" + x="130.2619" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="544.97565" + x="130.2619" + id="tspan6368" + sodipodi:role="line">s6</tspan></text> + </g> + <g + id="g6384" + transform="translate(0,-2.194656)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path6304" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-170.1473,510.0933)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="132.1519" + y="617.0459" + id="text6306" + sodipodi:linespacing="100%"><tspan + y="617.0459" + x="132.1519" + id="tspan6370" + sodipodi:role="line">s7</tspan></text> + </g> + <g + id="g6389"> + <path + transform="matrix(0.511994,0,0,0.511994,-170.1473,582.4835)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path6312" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text6314" + y="688.16608" + x="130.03189" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="688.16608" + x="130.03189" + id="tspan6372" + sodipodi:role="line">s8</tspan></text> + </g> + <g + id="g6318" + transform="translate(-279.3386,20.89783)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path6320" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text6322" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan6324" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + id="g6326" + transform="translate(-101.5579,86.59053)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path6328" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text6330" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan6332" + sodipodi:role="line">SHA</tspan></text> + </g> + <path + id="path6334" + d="M 160.94817,457.746 L 303.02633,494.49705" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + id="path6336" + d="M 162.37628,533.2456 C 165.94653,531.8175 303.74038,508.06402 303.74038,508.06402" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + id="path6338" + d="M 162.11415,609.19714 L 305.88253,646.58992" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + id="path6340" + d="M 162.8282,682.87546 L 305.16848,663.72714" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + id="path6342" + d="M 343.27531,653.86149 L 482.23514,575.05376" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + id="path6344" + d="M 341.0021,499.94733 L 481.52109,562.72508" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <text + sodipodi:linespacing="100%" + id="text6346" + y="424.95895" + x="480.79593" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="424.95895" + x="480.79593" + id="tspan6348" + sodipodi:role="line">Merkle Tree</tspan></text> + <text + sodipodi:linespacing="100%" + id="text6350" + y="384.32007" + x="593.30579" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="384.32007" + x="593.30579" + id="tspan6352" + sodipodi:role="line">"share root hash"</tspan></text> + <g + id="g6396" + transform="translate(65.86388,-62.41649)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path6398" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text6400" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan6402" + sodipodi:role="line">SHA</tspan></text> + </g> + <path + id="path6404" + d="M 516.21962,265.18629 L 653.62028,407.4814" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 516.21962,558.30913 L 653.62028,429.30971" + id="path6406" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 88.872351,202.61777 L 183.98136,204.17694 L 352.37108,321.11424 L 570.65404,564.34383 L 498.9325,650.09786 L 291.56368,394.39495 L 162.15306,280.57598 L 79.517367,263.42517 L 88.872351,202.61777 z " + id="path6408" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="430.70282" + y="734.79639" + id="text7299" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan7301" + x="430.70282" + y="734.79639">merkle hash chain</tspan><tspan + sodipodi:role="line" + x="430.70282" + y="754.79639" + id="tspan7303">to validate s1</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 519.99961,716.92402 C 528.23607,699.12899 558.20121,653.69346 528.55661,615.79625" + id="path7305" + sodipodi:nodetypes="cc" /> + </g> +</svg> diff --git a/docs/specifications/file-encoding6.svg b/docs/specifications/file-encoding6.svg new file mode 100644 index 00000000..09ced3fe --- /dev/null +++ b/docs/specifications/file-encoding6.svg @@ -0,0 +1,760 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/warner/work/tahoe-misc" + sodipodi:docname="file-encoding6.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path2976" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.60354902" + inkscape:cx="367.4898" + inkscape:cy="564.16839" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="900" + inkscape:window-height="756" + inkscape:window-x="732" + inkscape:window-y="176" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3308" + transform="translate(-492.4404,-287.9192)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3297" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3299" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3306" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-361.8975,-287.9192)" + id="g3313"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3315" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3317" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3319" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + id="g3321" + transform="translate(-427.1689,-180.8987)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3323" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3325" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3327" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-234.578,-287.9192)" + id="g3345"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3347" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3349" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3351" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + id="g3353" + transform="translate(-170.1124,-180.8987)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3355" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3357" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3359" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + transform="translate(-105.6468,-287.9192)" + id="g3361"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3363" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3365" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3367" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <rect + ry="0" + y="47.720215" + x="76.855522" + height="54.581161" + width="62.568695" + id="rect2984" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text2988" + y="71.720772" + x="84.785179" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="71.720772" + x="84.785179" + id="tspan2990" + sodipodi:role="line">share</tspan></text> + <text + sodipodi:linespacing="100%" + id="text2992" + y="93.020752" + x="97.243141" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3042" + x="97.243141" + y="93.020752">A4</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3128" + width="62.568695" + height="54.581161" + x="207.39835" + y="47.720215" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="215.328" + y="71.720772" + id="text3130" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3132" + x="215.328" + y="71.720772">share</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="227.78596" + y="93.020752" + id="text3134" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3272" + x="227.78596" + y="93.020752">B4</tspan></text> + <rect + ry="0" + y="47.720215" + x="334.7179" + height="54.581161" + width="62.568695" + id="rect3186" + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" /> + <text + sodipodi:linespacing="100%" + id="text3188" + y="71.720772" + x="342.64755" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="71.720772" + x="342.64755" + id="tspan3190" + sodipodi:role="line">share</tspan></text> + <text + sodipodi:linespacing="100%" + id="text3192" + y="93.020752" + x="355.10553" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3282" + x="355.10553" + y="93.020752">C4</tspan></text> + <rect + style="fill:#e3d7f4;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3245" + width="62.568695" + height="54.581161" + x="463.64905" + y="47.720215" + ry="0" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="471.5787" + y="71.720772" + id="text3247" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3249" + x="471.5787" + y="71.720772">share</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="484.03665" + y="93.020752" + id="text3251" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3293" + x="484.03665" + y="93.020752">D4</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="479.80331" + y="521.89929" + id="text3833" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3835" + x="479.80331" + y="521.89929">share4</tspan></text> + <rect + style="fill:#ffd5f6;fill-opacity:1;stroke:black;stroke-opacity:1" + id="rect3837" + width="95.533775" + height="81.721664" + x="608.88721" + y="272.46359" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="627.25848" + y="292.98965" + id="text3839" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3841" + x="627.25848" + y="292.98965">peer 4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 559.39381,305.84288 C 608.88721,309.29591 608.88721,309.29591 608.88721,309.29591" + id="path3843" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 106.27121,102.50451 L 108.15211,173.97895" + id="path2431" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 238.8751,102.50451 L 237.93464,173.03849" + id="path2433" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 366.77673,103.44496 L 366.77673,172.09804" + id="path2435" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 495.61881,103.44496 L 495.61881,173.03849" + id="path2437" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 489.97609,208.77571 L 438.25116,282.13106" + id="path2439" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 370.53854,207.83526 L 420.38255,282.13106" + id="path2441" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 236.05374,209.71617 L 183.38836,284.01197" + id="path2443" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 110.97347,207.83526 L 164.5793,282.13106" + id="path2445" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 178.6861,315.98737 L 289.65957,388.40226" + id="path2447" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 426.02527,315.98737 L 316.93271,389.34272" + id="path2449" /> + <rect + style="fill:none;fill-opacity:1;stroke:blue;stroke-opacity:1" + id="rect3336" + width="474.92883" + height="334.80142" + x="61.129456" + y="140.12263" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="241.69646" + y="263.32199" + id="text3338" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3340" + x="241.69646" + y="263.32199">Merkle Tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="68.653069" + y="466.45987" + id="text3342" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3344" + x="68.653069" + y="466.45987">block hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="321.63498" + y="405.33044" + id="text3346" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3352" + x="321.63498" + y="405.33044">"block root hash"</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="88.648125" + y="598.72913" + id="text3632" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3634" + x="88.648125" + y="598.72913">block</tspan><tspan + sodipodi:role="line" + x="88.648125" + y="618.72913" + id="tspan3636">root hashes</tspan></text> + <g + id="g3642" + transform="translate(-350.3156,360.201)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3644" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text3646" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan3648" + sodipodi:role="line">SHA</tspan></text> + </g> + <g + id="g3675" + transform="translate(52.10837,496.9171)"> + <path + transform="matrix(0.511994,0,0,0.511994,-233.9701,54.30905)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path5669" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3653" + y="160.03162" + x="68.92907" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="160.03162" + x="68.92907" + id="tspan3655" + sodipodi:role="line">s1</tspan></text> + </g> + <g + id="g3686" + transform="translate(52.10837,491.5603)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3657" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-231.4293,132.056)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="68.029869" + y="239.32857" + id="text3659" + sodipodi:linespacing="100%"><tspan + y="239.32857" + x="68.029869" + id="tspan3680" + sodipodi:role="line">s2</tspan></text> + </g> + <g + id="g3691" + transform="translate(52.10837,489.4639)"> + <path + transform="matrix(0.511994,0,0,0.511994,-229.5194,206.5426)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3663" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3665" + y="313.49518" + x="70.729767" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + y="313.49518" + x="70.729767" + id="tspan3682" + sodipodi:role="line">s3</tspan></text> + </g> + <g + id="g3696" + transform="translate(52.10837,496.9171)"> + <path + sodipodi:type="arc" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + id="path3669" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="72.669769" + y="377.16217" + id="text3671" + sodipodi:linespacing="100%"><tspan + y="377.16217" + x="72.669769" + id="tspan3684" + sodipodi:role="line">s4</tspan></text> + </g> + <g + transform="translate(-352.4577,205.2519)" + id="g3701"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3703" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3705" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3707" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <g + transform="translate(-233.9253,270.9446)" + id="g3709"> + <path + transform="matrix(0.511994,0,0,0.511994,289.5084,379.3664)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path3711" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text3713" + y="483.09396" + x="591.47559" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan3715" + x="591.47559" + y="483.09396">SHA</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 147.07717,654.57336 L 229.9071,678.8511" + id="path3717" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 148.50528,723.83631 C 152.07553,722.40821 230.62115,692.41807 230.62115,692.41807" + id="path3719" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 151.36148,796.66952 L 232.7633,830.94397" + id="path3721" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 152.07553,868.78867 L 232.04925,848.08119" + id="path3723" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 267.03775,836.65638 L 349.86767,760.96697" + id="path3725" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1" + d="M 266.3237,687.41971 L 349.15362,742.40164" + id="path3727" /> + <rect + style="fill:none;fill-opacity:1;stroke:blue;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5560" + width="484.38986" + height="374.49551" + x="78.049934" + y="564.42963" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="358.2843" + y="865.40643" + id="text5700" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5702" + x="358.2843" + y="865.40643">Merkle Tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:blue;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="88.140358" + y="930.49945" + id="text5704" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan7497" + x="88.140358" + y="930.49945">share hash tree</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="356.4744" + y="786.95703" + id="text5566" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5568" + x="356.4744" + y="786.95703">"share root hash"</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:3,3;stroke-dashoffset:0" + d="M 290.30681,720.03728 L 108.29659,845.9841 L 74.309836,804.80832 L 190.42285,712.9661 L 239.36655,641.22131 L 299.69,669.98266 L 290.30681,720.03728 z " + id="path5949" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 32.468525,28.648698 L 557.69466,30.558611 L 561.51449,540.50544 L 374.34299,540.50544 L 296.03655,725.76702 L 80.216355,869.01051 L 30.558611,817.44286 L 164.25254,727.67694 L 234.91933,590.16318 L 219.64002,534.7757 L 36.288351,534.7757 L 32.468525,28.648698 z " + id="path5951" /> + <text + xml:space="preserve" + style="font-size:20;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + x="370.89407" + y="630.30597" + id="text7307" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan7499" + x="370.89407" + y="630.30597">merkle hash chain</tspan><tspan + sodipodi:role="line" + id="tspan7501" + x="370.89407" + y="650.30597">to validate s4</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 444.20214,656.77444 C 435.69736,681.11928 360.49372,712.77648 296.54955,691.10088" + id="path7317" + sodipodi:nodetypes="cc" /> + <g + transform="translate(221.2501,29.91837)" + id="g7322"> + <path + transform="matrix(0.511994,0,0,0.511994,-229.5194,271.4796)" + d="M 642.52774 196.10106 A 34.958466 34.073441 0 1 1 572.61081,196.10106 A 34.958466 34.073441 0 1 1 642.52774 196.10106 z" + sodipodi:ry="34.073441" + sodipodi:rx="34.958466" + sodipodi:cy="196.10106" + sodipodi:cx="607.56927" + id="path7324" + style="fill:#ffe6d5;fill-opacity:1;stroke:black;stroke-opacity:1" + sodipodi:type="arc" /> + <text + sodipodi:linespacing="100%" + id="text7326" + y="377.16217" + x="72.669769" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter" + xml:space="preserve"><tspan + sodipodi:role="line" + id="tspan7328" + x="72.669769" + y="377.16217">s4</tspan></text> + </g> + </g> +</svg> diff --git a/docs/specifications/mut.svg b/docs/specifications/mut.svg new file mode 100644 index 00000000..3db01b8e --- /dev/null +++ b/docs/specifications/mut.svg @@ -0,0 +1,1602 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="278.36371" + height="295.09766" + id="svg2841" + sodipodi:version="0.32" + inkscape:version="0.46" + sodipodi:docname="mut.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + version="1.0"> + <defs + id="defs2843"> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible"> + <path + id="path7680" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /> + </marker> + <linearGradient + inkscape:collect="always" + id="linearGradient7760"> + <stop + style="stop-color:#ca1818;stop-opacity:1;" + offset="0" + id="stop7762" /> + <stop + style="stop-color:#ca1818;stop-opacity:0;" + offset="1" + id="stop7764" /> + </linearGradient> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path3751" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3745" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective2849" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7760" + id="linearGradient7766" + x1="-0.41100001" + y1="412.36218" + x2="160.411" + y2="412.36218" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7760" + id="linearGradient7788" + gradientUnits="userSpaceOnUse" + x1="-0.41100001" + y1="412.36218" + x2="160.411" + y2="412.36218" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7760" + id="linearGradient7793" + gradientUnits="userSpaceOnUse" + x1="-0.41100001" + y1="412.36218" + x2="160.411" + y2="412.36218" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.3332515" + inkscape:cx="210.25878" + inkscape:cy="123.41841" + inkscape:document-units="px" + inkscape:current-layer="layer2" + showgrid="true" + inkscape:window-width="1598" + inkscape:window-height="1198" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:snap-global="false"> + <inkscape:grid + type="xygrid" + id="grid2883" + visible="true" + enabled="true" /> + </sodipodi:namedview> + <metadata + id="metadata2846"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-217.17997,-198.38081)"> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.61650002;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect2885" + width="7.5" + height="0" + x="314.88028" + y="111.80756" /> + <flowRoot + xml:space="preserve" + id="flowRoot7772" + style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion + id="flowRegion7774"><rect + id="rect7776" + width="378.57144" + height="65.714287" + x="-35.714287" + y="384.50504" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara + id="flowPara7778" /></flowRoot> <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path8437" + sodipodi:cx="420" + sodipodi:cy="212.36218" + sodipodi:rx="80" + sodipodi:ry="20" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + transform="matrix(0.3375,0,0,0.3375,257.2117,137.23422)" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2919375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 438.13856,269.91499 C 446.63381,280.47335 453.38314,289.63578 453.38314,289.63578" + id="path9557" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 463.64994,293.69223 C 463.64994,297.55233 463.64994,302.1186 463.64994,302.1186" + id="path11208" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="467.92987" + y="288.97491" + id="text16751"><tspan + sodipodi:role="line" + id="tspan16753" + x="467.92987" + y="288.97491" /></text> + <text + xml:space="preserve" + style="font-size:30px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="464.14178" + y="291.24774" + id="text16755"><tspan + sodipodi:role="line" + id="tspan16757" + x="464.14178" + y="291.24774" /></text> + <text + transform="scale(0.8196045,1.2201006)" + xml:space="preserve" + style="font-size:13.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="589.64325" + y="218.94211" + id="text16759" + sodipodi:linespacing="100%"><tspan + y="218.94211" + x="589.64325" + id="tspan16761" + sodipodi:role="line" /></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32201561px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 372.25866,281.18125 C 391.14052,275.94279 412.5754,263.5215 412.5754,263.5215" + id="path21360" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 467.95624,303.64299 C 465.78336,307.89979 463.10818,312.90038 463.10818,312.90038" + id="path4716" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="445.04538" + y="385.5498" + id="text4926"><tspan + sodipodi:role="line" + id="tspan4928" + x="445.04538" + y="385.5498">shares</tspan></text> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path4938" + sodipodi:cx="420" + sodipodi:cy="212.36218" + sodipodi:rx="80" + sodipodi:ry="20" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + transform="matrix(0,0.1683097,-0.3399575,0,508.99378,294.48202)" /> + <path + transform="matrix(0,0.1683097,-0.3399575,0,517.99378,294.48202)" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + sodipodi:ry="20" + sodipodi:rx="80" + sodipodi:cy="212.36218" + sodipodi:cx="420" + id="path4940" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path4942" + sodipodi:cx="420" + sodipodi:cy="212.36218" + sodipodi:rx="80" + sodipodi:ry="20" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + transform="matrix(0,0.1683097,-0.3399575,0,526.99378,294.48202)" /> + <path + transform="matrix(0,0.1683097,-0.3399575,0,535.99378,294.48202)" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + sodipodi:ry="20" + sodipodi:rx="80" + sodipodi:cy="212.36218" + sodipodi:cx="420" + id="path4944" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + sodipodi:type="arc" /> + <path + transform="matrix(0,0.1683097,-0.3399575,0,542.80003,294.65787)" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + sodipodi:ry="20" + sodipodi:rx="80" + sodipodi:cy="212.36218" + sodipodi:cx="420" + id="path4946" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + sodipodi:type="arc" /> + <path + transform="matrix(0,0.1683097,-0.3399575,0,551.80003,294.58742)" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + sodipodi:ry="20" + sodipodi:rx="80" + sodipodi:cy="212.36218" + sodipodi:cx="420" + id="path4948" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + sodipodi:type="arc" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect4950" + width="60.860748" + height="2.1464994" + x="427.86215" + y="376.78323" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 436.85592,349.56271 C 436.85592,349.56271 434.60592,329.31271 461.60592,329.31271 C 445.85592,333.81271 445.85592,349.56271 445.85592,349.56271" + id="path4952" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 461.60592,329.31271 C 454.85592,336.06271 454.85592,349.56271 454.85592,349.56271" + id="path4954" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 461.60592,329.31271 C 463.85592,329.31271 463.85592,349.56271 463.85592,349.56271" + id="path4956" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 461.60592,329.31271 C 470.60592,329.31271 470.60592,349.56271 470.60592,349.56271" + id="path4958" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.44999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 461.60592,329.31271 C 479.60592,329.31271 479.60592,349.56271 479.60592,349.56271" + id="path4960" /> + <rect + y="372.16623" + x="427.74518" + height="2.1464994" + width="60.860748" + id="rect4962" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect4964" + width="60.860748" + height="2.1464994" + x="427.74518" + y="367.66623" /> + <rect + y="363.16623" + x="427.74518" + height="2.1464994" + width="60.860748" + id="rect4966" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect4968" + width="60.860748" + height="2.1464994" + x="427.74518" + y="358.66623" /> + <rect + y="354.16623" + x="427.74518" + height="2.1464994" + width="60.860748" + id="rect4970" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.21600063px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect4972" + width="60.860748" + height="2.1464994" + x="427.74518" + y="354.16623" /> + <g + transform="matrix(0,0.2054517,-0.1664743,0,467.60988,354.01332)" + id="g4974" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M -0.53492796,252.21639 C -5.5179181,262.28794 39.328998,262.28794 39.328998,262.28794 C 59.260953,262.28794 59.260953,292.50259 59.260953,292.50259" + id="path4976" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70842391px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 120.64913,252.36218 C 125.63212,262.43373 80.7852,262.43373 80.7852,262.43373 C 60.85325,262.43373 60.85325,292.64838 60.85325,292.64838" + id="path4978" /> + </g> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 407.29684,407.56445 L 411.94948,419.32947" + id="path4998" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:6.50278425px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="468.50412" + y="382.92706" + id="text5004" + sodipodi:linespacing="100%" + transform="scale(0.9062658,1.1034291)"><tspan + sodipodi:role="line" + id="tspan5006" + x="468.50412" + y="382.92706" + style="font-size:8.10000038px">Merkle Tree</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16140337px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 418.04929,366.13921 C 402.75501,384.90072 405.78989,392.50491 405.78989,392.50491 L 405.78989,392.50491" + id="path5008" /> + <g + id="g9174" + transform="matrix(0.7985291,0,0,0.5813416,-172.4015,-45.31981)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9176" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9178" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9180" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9182" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9184" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="297.6908" + y="233.17752" + id="text9186"><tspan + sodipodi:role="line" + x="297.6908" + y="233.17752" + style="font-size:5px" + id="tspan9188">AES-CTR</tspan></text> + <g + id="g9877" + transform="matrix(0.7985291,0,0,0.5813416,-65.298876,150.88501)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9879" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9881" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9883" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9885" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9887" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="404.19336" + y="429.98233" + id="text9889"><tspan + sodipodi:role="line" + x="404.19336" + y="429.98233" + style="font-size:5px" + id="tspan9891">SHA256d</tspan></text> + <g + id="g9893" + transform="matrix(0.7985291,0,0,0.5813416,-7.0974465,151.48502)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9895" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9897" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9899" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9901" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9903" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="462.39481" + y="430.58234" + id="text9905"><tspan + sodipodi:role="line" + x="462.39481" + y="430.58234" + style="font-size:5px" + id="tspan9907">SHA256d</tspan></text> + <g + id="g9909" + transform="matrix(0.7985291,0,0,0.5813416,-37.39819,179.0857)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9911" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9913" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9915" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9917" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9919" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="432.09406" + y="458.18301" + id="text9921"><tspan + sodipodi:role="line" + x="432.09406" + y="458.18301" + style="font-size:5px" + id="tspan9923">SHA256d</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 424.55591,436.29471 L 429.20855,448.05973" + id="path9925" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 463.55687,407.19399 L 468.20951,418.95901" + id="path9927" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 484.06352,407.70392 L 479.41088,419.46894" + id="path9929" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 425.60846,407.49401 L 420.95582,419.25903" + id="path9931" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.32513919px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 458.90929,435.99471 L 454.25665,447.75973" + id="path9933" + sodipodi:nodetypes="cc" /> + <g + id="g9935" + transform="matrix(0.7985291,0,0,0.5813416,-17.597704,43.482372)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9937" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9939" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9941" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9943" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9945" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="456.99469" + y="322.27969" + id="text9947"><tspan + sodipodi:role="line" + x="456.99469" + y="322.27969" + style="font-size:5px" + id="tspan9949">FEC</tspan></text> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z" + id="path9993" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" + id="path9995" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 26.114257,76.71179 L 26.114257,75.211753 L 53.11492,75.211753 L 80.115583,75.211753 L 80.115583,76.71179 L 80.115583,78.211827 L 53.11492,78.211827 L 26.114257,78.211827 L 26.114257,76.71179 z" + id="path9997" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 26.414265,133.7148 L 26.414265,132.21315 L 53.431371,132.21315 L 80.44846,132.21315 L 80.357032,133.63819 L 80.265587,135.06322 L 53.339926,135.13984 L 26.414265,135.21643 L 26.414265,133.7148 z" + id="path9999" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 132.91688,87.962066 L 132.91688,86.612033 L 159.76754,86.612033 L 186.6182,86.612033 L 186.6182,87.962066 L 186.6182,89.3121 L 159.76754,89.3121 L 132.91688,89.3121 L 132.91688,87.962066 z" + id="path10001" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" + id="path10003" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 26.414265,133.72419 L 26.414265,132.21315 L 53.432178,132.21315 L 80.450089,132.21315 L 80.357839,133.48818 L 80.265587,134.76322 L 73.515421,134.91631 C 69.80283,135.00052 57.686283,135.10673 46.58976,135.15233 L 26.414265,135.23524 L 26.414265,133.72419 z" + id="path10045" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 130.51682,147.96354 L 130.51682,146.61351 L 157.21748,146.61351 L 183.91813,146.61351 L 183.91813,147.96354 L 183.91813,149.31357 L 157.21748,149.31357 L 130.51682,149.31357 L 130.51682,147.96354 z" + id="path10047" + transform="translate(216.27706,196.47119)" /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="text" + transform="translate(-217.17997,-198.38081)"> + <path + transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + sodipodi:ry="20" + sodipodi:rx="80" + sodipodi:cy="212.36218" + sodipodi:cx="420" + id="path12528" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + sodipodi:type="arc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 398.91941,217.38625 C 397.86315,236.37897 412.97295,261.62455 412.97295,261.62455" + id="path8489" + sodipodi:nodetypes="cc" /> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path10092" + sodipodi:cx="420" + sodipodi:cy="212.36218" + sodipodi:rx="80" + sodipodi:ry="20" + d="M 500,212.36218 A 80,20 0 1 1 340,212.36218 A 80,20 0 1 1 500,212.36218 z" + transform="matrix(0.3375,0,0,0.3375,326.62493,224.71999)" /> + <text + xml:space="preserve" + style="font-size:8.09999943px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="556.67358" + y="169.5114" + id="text10094" + transform="scale(0.8252145,1.2118062)"><tspan + sodipodi:role="line" + id="tspan10096" + x="556.67358" + y="169.5114" /></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect13628" + width="7.5" + height="0" + x="524.88025" + y="299.30756" /> + <g + id="g16785" + transform="matrix(0.364293,0,0,0.4974358,-16.906009,-38.001986)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <g + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="g16787" + transform="translate(-210,240)" /> + <text + transform="scale(1.0714114,0.9333483)" + id="text16789" + y="325.48486" + x="362.67249" + style="font-size:32.76525116px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + id="tspan16791" + y="325.48486" + x="362.67249" + sodipodi:role="line" /></text> + </g> + <text + transform="scale(0.9161476,1.0915272)" + id="text16795" + y="124.86931" + x="159.02403" + style="font-size:13.94785595px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="124.86931" + x="159.02403" + id="tspan16797" + sodipodi:role="line" /></text> + <text + xml:space="preserve" + style="font-size:13.947855px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="247.0589" + y="116.87234" + id="text16801" + transform="scale(0.7061936,1.4160423)"><tspan + sodipodi:role="line" + id="tspan16803" + x="247.0589" + y="116.87234" /></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect20335" + width="4.5456867" + height="0" + x="206.55289" + y="326.09802" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.27742502;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect7836" + width="54" + height="3.375" + x="346.5321" + y="342.79144" /> + <text + transform="scale(1.0705538,0.934096)" + id="text7838" + y="377.70102" + x="341.13809" + style="font-size:6.07499981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="377.70102" + x="341.13809" + id="tspan7840" + sodipodi:role="line" + style="font-size:8.10000038px">salt</tspan></text> + <g + transform="matrix(0.3375,0,0,0.3375,168.46227,275.21496)" + id="g8416" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ffff;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#ca1818;stroke-width:0.82200003;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect8418" + width="160" + height="10" + x="535" + y="22.362183" /> + </g> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="332.31949" + y="313.88254" + id="text8424" + transform="scale(1.0714114,0.9333483)"><tspan + sodipodi:role="line" + id="tspan8426" + x="332.31949" + y="313.88254" + style="font-size:8.10000038px">encryption</tspan><tspan + sodipodi:role="line" + x="332.31949" + y="324.00754" + id="tspan8428" + style="font-size:8.10000038px"> key</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 298.98227,329.83819 C 326.42371,330.53571 348.95266,320.06453 348.95266,320.06453" + id="path21352" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.33749998px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 362.28379,341.51001 C 341.45603,329.97307 346.83916,321.99552 346.83916,321.99552" + id="path21354" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.2438544px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 355.39701,305.53135 L 360.98003,293.64584" + id="path21358" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="487.03278" + y="411.55334" + id="text3034"><tspan + sodipodi:role="line" + id="tspan3036" + x="487.03278" + y="411.55334" /></text> + <flowRoot + xml:space="preserve" + id="flowRoot3254" + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + transform="matrix(0.75,0,0,0.75,89.880266,80.035916)"><flowRegion + id="flowRegion3256"><rect + id="rect3258" + width="18.039574" + height="36.830799" + x="-31.569254" + y="-50.306789" + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /></flowRegion><flowPara + id="flowPara3260" /></flowRoot> <rect + y="198.60286" + x="219.6953" + height="24.165203" + width="107.25604" + id="rect3282" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect5573" + width="54.139946" + height="3.3068728" + x="242.37775" + y="271.45877" /> + <text + xml:space="preserve" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="235.36351" + y="301.57739" + id="text7107" + transform="scale(1.0705539,0.9340959)"><tspan + sodipodi:role="line" + id="tspan7109" + x="235.36351" + y="301.57739" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text> + <text + transform="scale(1.0705539,0.9340959)" + id="text7768" + y="362.28162" + x="234.52074" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="362.28162" + x="234.52074" + id="tspan7770" + sodipodi:role="line" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text> + <rect + y="356.53317" + x="230.62067" + height="24.165203" + width="107.25604" + id="rect3291" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="248.95004" + y="370.59125" + id="text3246"><tspan + sodipodi:role="line" + id="tspan3248" + x="248.95004" + y="370.59125" + style="font-size:8.10000038px">verifying (public) key</tspan></text> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="239.46277" + y="213.58257" + id="text3328"><tspan + sodipodi:role="line" + x="239.46277" + y="213.58257" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="tspan3021">signing (private) key</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect4024" + width="54.139946" + height="3.3068728" + x="242.55493" + y="328.39029" /> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="381.61792" + y="386.57251" + id="text4229"><tspan + sodipodi:role="line" + id="tspan4231" + x="381.61792" + y="386.57251" /></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 234.50363,224.362 L 234.50363,354.01202" + id="path4243" + inkscape:connector-type="polyline" /> + <rect + y="241.14568" + x="288.69962" + height="24.165203" + width="107.25604" + id="rect5564" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:1;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#250f25;stroke-width:0.44410068;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" /> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="306.05878" + y="255.20375" + id="text5566"><tspan + sodipodi:role="line" + id="tspan5568" + x="306.05878" + y="255.20375" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">encrypted signing key</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 279.02164,269.72178 C 281.56206,241.33051 292.24088,235.15181 292.24088,235.15181" + id="path5574" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 285.08543,222.90932 L 291.78123,230.87533" + id="path6618" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.375;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 322.35949,233.1782 L 335.48526,239.16028" + id="path8979" + sodipodi:nodetypes="cc" /> + <text + transform="scale(1.0705539,0.9340959)" + id="text9528" + y="462.90314" + x="245.50374" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="462.90314" + x="245.50374" + id="tspan9530" + sodipodi:role="line" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9554" + width="108.27989" + height="3.3068728" + x="222.74568" + y="419.13055" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect16799" + width="171.15405" + height="13.22591" + x="222.05762" + y="440.96823" /> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="279.37097" + y="462.55542" + id="text3313"><tspan + sodipodi:role="line" + x="279.37097" + y="462.55542" + id="tspan3317" + style="font-size:8.10000038px">read-write cap</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 222.87392,420.82386 L 222.87392,419.36856 L 276.84166,419.36856 L 330.8094,419.36856 L 330.8094,420.82386 L 330.8094,422.27917 L 276.84166,422.27917 L 222.87392,422.27917 L 222.87392,420.82386 z" + id="path9564" /> + <text + transform="scale(1.0705539,0.9340959)" + id="text9566" + y="483.10208" + x="304.77203" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="483.10208" + x="304.77203" + id="tspan9568" + sodipodi:role="line" + style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9570" + width="108.27989" + height="3.3068728" + x="281.14557" + y="443.04819" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 281.27383,444.74153 L 281.27383,443.28622 L 335.24158,443.28622 L 389.20931,443.28622 L 389.20931,444.74153 L 389.20931,446.19684 L 335.24158,446.19684 L 281.27383,446.19684 L 281.27383,444.74153 z" + id="path9572" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9574" + width="54.139946" + height="3.3068728" + x="225.99055" + y="442.97894" /> + <text + xml:space="preserve" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="223.80324" + y="483.19937" + id="text9576" + transform="scale(1.0705539,0.9340959)"><tspan + sodipodi:role="line" + id="tspan9578" + x="223.80324" + y="483.19937" + style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">write key</tspan></text> + <text + xml:space="preserve" + style="font-size:6.07500029px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="279.37097" + y="490.32758" + id="text9582"><tspan + sodipodi:role="line" + x="279.37097" + y="490.32758" + id="tspan9584" + style="font-size:8.10000038px">read-only cap</tspan></text> + <text + transform="scale(1.0705539,0.9340959)" + id="text9586" + y="512.94104" + x="305.00543" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + xml:space="preserve"><tspan + y="512.94104" + x="305.00543" + id="tspan9588" + sodipodi:role="line" + style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">verify cap</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.19443056;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9590" + width="108.27989" + height="3.3068728" + x="281.14554" + y="470.82034" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#00ff00;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + d="M 281.27383,472.51368 L 281.27383,471.05837 L 335.24157,471.05837 L 389.2093,471.05837 L 389.2093,472.51368 L 389.2093,473.96898 L 335.24157,473.96898 L 281.27383,473.96898 L 281.27383,472.51368 z" + id="path9592" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;opacity:0.52360517;fill:#f22a33;fill-opacity:1;fill-rule:nonzero;stroke:#250f25;stroke-width:0.13748316;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9594" + width="54.139946" + height="3.3068728" + x="225.99054" + y="470.7511" /> + <text + xml:space="preserve" + style="font-size:11.05827236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="224.83044" + y="512.93097" + id="text9596" + transform="scale(1.0705539,0.9340959)"><tspan + sodipodi:role="line" + id="tspan9598" + x="224.83044" + y="512.93097" + style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter">read key</tspan></text> + <text + xml:space="preserve" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="384.58023" + y="210.64319" + id="text3025"><tspan + sodipodi:role="line" + id="tspan3027" + x="384.58023" + y="210.64319">plaintext</tspan></text> + <text + xml:space="preserve" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="451.8754" + y="298.79443" + id="text3029"><tspan + sodipodi:role="line" + id="tspan3031" + x="451.8754" + y="298.79443">ciphertext</tspan></text> + <text + xml:space="preserve" + style="font-size:8.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="102.84189" + y="100.84377" + id="text3459" + transform="translate(218.99833,196.47119)"><tspan + sodipodi:role="line" + id="tspan3461" + x="102.84189" + y="100.84377" /></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 48.719461,27.732616 L 48.719461,41.723846" + id="path3512" + transform="translate(218.99833,196.47119)" + inkscape:connector-type="polyline" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 267.71779,255.74642 L 267.71779,269.73765" + id="path4829" + inkscape:connector-type="polyline" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 266.96826,282.47967 L 266.96826,296.4709" + id="path4831" + inkscape:connector-type="polyline" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 266.96826,312.96055 L 266.96826,326.95178" + id="path4833" + inkscape:connector-type="polyline" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.14901878px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect5110" + width="113.09831" + height="7.6182923" + x="221.60002" + y="417.24417" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 49.877177,187.22739 L 50.127816,194.49593" + id="path5112" + transform="translate(218.99833,196.47119)" + inkscape:connector-type="polyline" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" + d="M 50.127816,212.04066 L 50.127816,219.3092" + id="path5641" + transform="translate(218.99833,196.47119)" + inkscape:connector-type="polyline" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" + d="M 22.500552,81.301996 C 3.3317037,108.63786 -8.6943462,156.11861 6.9001691,245.40603" + id="path7224" + transform="translate(218.99833,196.47119)" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" + d="M 240.57714,332.04074 C 221.40829,359.37661 207.8822,408.95742 225.87678,470.34415" + id="path7753" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" + d="M 90.602225,227.40558 L 105.30258,246.00604" + id="path7755" + transform="translate(218.99833,196.47119)" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1" + d="M 367.86051,447.5929 L 367.5605,469.79345" + id="path8286" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" /> + <g + id="g9190" + transform="matrix(0.7985291,0,0,0.5813416,-211.70247,-29.719429)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9192" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9194" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9196" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9198" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9200" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="257.18979" + y="245.77785" + id="text9202"><tspan + sodipodi:role="line" + x="257.18979" + y="245.77785" + id="tspan9204" + style="font-size:5px">SHA256d</tspan><tspan + sodipodi:role="line" + x="257.18979" + y="252.02785" + style="font-size:5px" + id="tspan9206">truncated</tspan></text> + <g + id="g9208" + transform="matrix(0.7985291,0,0,0.5813416,-211.70247,28.482004)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9210" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9212" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9214" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9216" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9218" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="257.18979" + y="303.97925" + id="text9220"><tspan + sodipodi:role="line" + x="257.18979" + y="303.97925" + id="tspan9222" + style="font-size:5px">SHA256d</tspan><tspan + sodipodi:role="line" + x="257.18979" + y="310.22925" + style="font-size:5px" + id="tspan9224">truncated</tspan></text> + <g + id="g9226" + transform="matrix(0.7985291,0,0,0.5813416,-127.4004,35.982184)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9228" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9230" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9232" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9234" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9236" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="341.49188" + y="311.47946" + id="text9238"><tspan + sodipodi:role="line" + x="341.49188" + y="311.47946" + id="tspan9240" + style="font-size:5px">SHA256d</tspan><tspan + sodipodi:role="line" + x="341.49188" + y="317.72946" + style="font-size:5px" + id="tspan9242">truncated</tspan></text> + <g + id="g9244" + transform="matrix(0.7985291,0,0,0.5813416,-210.80245,122.98432)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9246" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9248" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9250" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9252" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9254" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="258.08981" + y="398.4816" + id="text9256"><tspan + sodipodi:role="line" + x="258.08981" + y="398.4816" + id="tspan9258" + style="font-size:5px">SHA256d</tspan><tspan + sodipodi:role="line" + x="258.08981" + y="404.7316" + style="font-size:5px" + id="tspan9260">truncated</tspan></text> + <g + id="g9262" + transform="matrix(0.7985291,0,0,0.5813416,-52.098552,-13.519031)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter"> + <path + sodipodi:type="arc" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffe6d5;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="path9264" + sodipodi:cx="607.56927" + sodipodi:cy="196.10106" + sodipodi:rx="34.958466" + sodipodi:ry="34.073441" + d="M 642.52774,196.10106 A 34.958466,34.073441 0 1 1 572.61081,196.10106 A 34.958466,34.073441 0 1 1 642.52774,196.10106 z" + transform="matrix(0.512658,0,0,0.4006128,289.10499,398.76956)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="591.47559" + y="483.09396" + id="text9266" + sodipodi:linespacing="100%"><tspan + y="483.09396" + x="591.47559" + id="tspan9268" + sodipodi:role="line" /><tspan + y="493.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9270" /><tspan + y="503.09396" + x="591.47559" + sodipodi:role="line" + id="tspan9272" /></text> + </g> + <text + xml:space="preserve" + style="font-size:2.70000005px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="417.99377" + y="264.97833" + id="text9274"><tspan + sodipodi:role="line" + x="417.99377" + y="264.97833" + style="font-size:5px" + id="tspan9276">AES-CTR</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9845" + width="20.741352" + height="9.1972332" + x="395.21106" + y="396.4776" + inkscape:transform-center-y="4.6611973" + inkscape:transform-center-x="1.720467e-05" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 395.27984,401.04002 L 395.27984,396.56484 L 405.56868,396.56484 L 415.85752,396.56484 L 415.85752,401.04002 L 415.85752,405.51519 L 405.56868,405.51519 L 395.27984,405.51519 L 395.27984,401.04002 z" + id="path9847" + inkscape:transform-center-x="0.013044945" + inkscape:transform-center-y="4.6250009" /> + <text + xml:space="preserve" + style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="397.93158" + y="402.57623" + id="text9849"><tspan + sodipodi:role="line" + id="tspan9851" + x="397.93158" + y="402.57623">share 1</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9853" + width="20.741352" + height="9.1972332" + x="421.31168" + y="396.4776" + inkscape:transform-center-y="4.6611973" + inkscape:transform-center-x="1.720467e-05" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 421.38048,401.04003 L 421.38048,396.56485 L 431.66932,396.56485 L 441.95816,396.56485 L 441.95816,401.04003 L 441.95816,405.5152 L 431.66932,405.5152 L 421.38048,405.5152 L 421.38048,401.04003 z" + id="path9855" + inkscape:transform-center-x="0.013044945" + inkscape:transform-center-y="4.6250009" /> + <text + xml:space="preserve" + style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="424.0322" + y="402.57623" + id="text9857"><tspan + sodipodi:role="line" + id="tspan9859" + x="424.0322" + y="402.57623">share 2</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9861" + width="20.741352" + height="9.1972332" + x="446.81232" + y="396.4776" + inkscape:transform-center-y="4.6611973" + inkscape:transform-center-x="1.720467e-05" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 446.88111,401.04003 L 446.88111,396.56485 L 457.16995,396.56485 L 467.45879,396.56485 L 467.45879,401.04003 L 467.45879,405.5152 L 457.16995,405.5152 L 446.88111,405.5152 L 446.88111,401.04003 z" + id="path9863" + inkscape:transform-center-x="0.013044945" + inkscape:transform-center-y="4.6250009" /> + <text + xml:space="preserve" + style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="449.53284" + y="402.57623" + id="text9865"><tspan + sodipodi:role="line" + id="tspan9867" + x="449.53284" + y="402.57623">share 3</tspan></text> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.07011827px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect9869" + width="20.741352" + height="9.1972332" + x="473.81299" + y="396.77759" + inkscape:transform-center-y="4.6611973" + inkscape:transform-center-x="1.720467e-05" /> + <path + style="opacity:1;fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 473.88178,401.34003 L 473.88178,396.86485 L 484.17062,396.86485 L 494.45946,396.86485 L 494.45946,401.34003 L 494.45946,405.8152 L 484.17062,405.8152 L 473.88178,405.8152 L 473.88178,401.34003 z" + id="path9871" + inkscape:transform-center-x="0.013044945" + inkscape:transform-center-y="4.6250009" /> + <text + xml:space="preserve" + style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + x="476.53351" + y="402.87622" + id="text9873"><tspan + sodipodi:role="line" + id="tspan9875" + x="476.53351" + y="402.87622">share 4</tspan></text> + <path + style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 26.414265,133.71319 L 26.414265,132.21315 L 53.414928,132.21315 L 80.415591,132.21315 L 80.415591,133.51519 L 80.415591,134.81725 L 73.166834,135.01523 C 69.180018,135.12413 57.02972,135.21323 46.166171,135.21323 L 26.414265,135.21323 L 26.414265,133.71319 z" + id="path10049" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 9.9138595,248.166 L 9.9138595,246.51596 L 36.764519,246.51596 L 63.615178,246.51596 L 63.615178,248.166 L 63.615178,249.81604 L 36.764519,249.81604 L 9.9138595,249.81604 L 9.9138595,248.166 z" + id="path10051" + transform="translate(216.27706,196.47119)" /> + <path + style="opacity:1;fill:#e4161b;fill-opacity:1;fill-rule:nonzero;stroke-width:0.5;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:0.5, 0.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 9.9138595,275.91668 L 9.9138595,274.41665 L 36.764519,274.41665 L 63.615178,274.41665 L 63.615178,275.91668 L 63.615178,277.41672 L 36.764519,277.41672 L 9.9138595,277.41672 L 9.9138595,275.91668 z" + id="path10055" + transform="translate(216.27706,196.47119)" /> + <rect + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a1010;stroke-width:0.2415408px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Charter;-inkscape-font-specification:Bitstream Charter" + id="rect2971" + width="171.15405" + height="13.22591" + x="222.20229" + y="469.1651" /> + </g> +</svg> diff --git a/docs/specifications/mutable.txt b/docs/specifications/mutable.txt new file mode 100644 index 00000000..40a5374b --- /dev/null +++ b/docs/specifications/mutable.txt @@ -0,0 +1,648 @@ + +This describes the "RSA-based mutable files" which were shipped in Tahoe v0.8.0. + += Mutable Files = + +Mutable File Slots are places with a stable identifier that can hold data +that changes over time. In contrast to CHK slots, for which the +URI/identifier is derived from the contents themselves, the Mutable File Slot +URI remains fixed for the life of the slot, regardless of what data is placed +inside it. + +Each mutable slot is referenced by two different URIs. The "read-write" URI +grants read-write access to its holder, allowing them to put whatever +contents they like into the slot. The "read-only" URI is less powerful, only +granting read access, and not enabling modification of the data. The +read-write URI can be turned into the read-only URI, but not the other way +around. + +The data in these slots is distributed over a number of servers, using the +same erasure coding that CHK files use, with 3-of-10 being a typical choice +of encoding parameters. The data is encrypted and signed in such a way that +only the holders of the read-write URI will be able to set the contents of +the slot, and only the holders of the read-only URI will be able to read +those contents. Holders of either URI will be able to validate the contents +as being written by someone with the read-write URI. The servers who hold the +shares cannot read or modify them: the worst they can do is deny service (by +deleting or corrupting the shares), or attempt a rollback attack (which can +only succeed with the cooperation of at least k servers). + +== Consistency vs Availability == + +There is an age-old battle between consistency and availability. Epic papers +have been written, elaborate proofs have been established, and generations of +theorists have learned that you cannot simultaneously achieve guaranteed +consistency with guaranteed reliability. In addition, the closer to 0 you get +on either axis, the cost and complexity of the design goes up. + +Tahoe's design goals are to largely favor design simplicity, then slightly +favor read availability, over the other criteria. + +As we develop more sophisticated mutable slots, the API may expose multiple +read versions to the application layer. The tahoe philosophy is to defer most +consistency recovery logic to the higher layers. Some applications have +effective ways to merge multiple versions, so inconsistency is not +necessarily a problem (i.e. directory nodes can usually merge multiple "add +child" operations). + +== The Prime Coordination Directive: "Don't Do That" == + +The current rule for applications which run on top of Tahoe is "do not +perform simultaneous uncoordinated writes". That means you need non-tahoe +means to make sure that two parties are not trying to modify the same mutable +slot at the same time. For example: + + * don't give the read-write URI to anyone else. Dirnodes in a private + directory generally satisfy this case, as long as you don't use two + clients on the same account at the same time + * if you give a read-write URI to someone else, stop using it yourself. An + inbox would be a good example of this. + * if you give a read-write URI to someone else, call them on the phone + before you write into it + * build an automated mechanism to have your agents coordinate writes. + For example, we expect a future release to include a FURL for a + "coordination server" in the dirnodes. The rule can be that you must + contact the coordination server and obtain a lock/lease on the file + before you're allowed to modify it. + +If you do not follow this rule, Bad Things will happen. The worst-case Bad +Thing is that the entire file will be lost. A less-bad Bad Thing is that one +or more of the simultaneous writers will lose their changes. An observer of +the file may not see monotonically-increasing changes to the file, i.e. they +may see version 1, then version 2, then 3, then 2 again. + +Tahoe takes some amount of care to reduce the badness of these Bad Things. +One way you can help nudge it from the "lose your file" case into the "lose +some changes" case is to reduce the number of competing versions: multiple +versions of the file that different parties are trying to establish as the +one true current contents. Each simultaneous writer counts as a "competing +version", as does the previous version of the file. If the count "S" of these +competing versions is larger than N/k, then the file runs the risk of being +lost completely. [TODO] If at least one of the writers remains running after +the collision is detected, it will attempt to recover, but if S>(N/k) and all +writers crash after writing a few shares, the file will be lost. + +Note that Tahoe uses serialization internally to make sure that a single +Tahoe node will not perform simultaneous modifications to a mutable file. It +accomplishes this by using a weakref cache of the MutableFileNode (so that +there will never be two distinct MutableFileNodes for the same file), and by +forcing all mutable file operations to obtain a per-node lock before they +run. The Prime Coordination Directive therefore applies to inter-node +conflicts, not intra-node ones. + + +== Small Distributed Mutable Files == + +SDMF slots are suitable for small (<1MB) files that are editing by rewriting +the entire file. The three operations are: + + * allocate (with initial contents) + * set (with new contents) + * get (old contents) + +The first use of SDMF slots will be to hold directories (dirnodes), which map +encrypted child names to rw-URI/ro-URI pairs. + +=== SDMF slots overview === + +Each SDMF slot is created with a public/private key pair. The public key is +known as the "verification key", while the private key is called the +"signature key". The private key is hashed and truncated to 16 bytes to form +the "write key" (an AES symmetric key). The write key is then hashed and +truncated to form the "read key". The read key is hashed and truncated to +form the 16-byte "storage index" (a unique string used as an index to locate +stored data). + +The public key is hashed by itself to form the "verification key hash". + +The write key is hashed a different way to form the "write enabler master". +For each storage server on which a share is kept, the write enabler master is +concatenated with the server's nodeid and hashed, and the result is called +the "write enabler" for that particular server. Note that multiple shares of +the same slot stored on the same server will all get the same write enabler, +i.e. the write enabler is associated with the "bucket", rather than the +individual shares. + +The private key is encrypted (using AES in counter mode) by the write key, +and the resulting crypttext is stored on the servers. so it will be +retrievable by anyone who knows the write key. The write key is not used to +encrypt anything else, and the private key never changes, so we do not need +an IV for this purpose. + +The actual data is encrypted (using AES in counter mode) with a key derived +by concatenating the readkey with the IV, the hashing the results and +truncating to 16 bytes. The IV is randomly generated each time the slot is +updated, and stored next to the encrypted data. + +The read-write URI consists of the write key and the verification key hash. +The read-only URI contains the read key and the verification key hash. The +verify-only URI contains the storage index and the verification key hash. + + URI:SSK-RW:b2a(writekey):b2a(verification_key_hash) + URI:SSK-RO:b2a(readkey):b2a(verification_key_hash) + URI:SSK-Verify:b2a(storage_index):b2a(verification_key_hash) + +Note that this allows the read-only and verify-only URIs to be derived from +the read-write URI without actually retrieving the public keys. Also note +that it means the read-write agent must validate both the private key and the +public key when they are first fetched. All users validate the public key in +exactly the same way. + +The SDMF slot is allocated by sending a request to the storage server with a +desired size, the storage index, and the write enabler for that server's +nodeid. If granted, the write enabler is stashed inside the slot's backing +store file. All further write requests must be accompanied by the write +enabler or they will not be honored. The storage server does not share the +write enabler with anyone else. + +The SDMF slot structure will be described in more detail below. The important +pieces are: + + * a sequence number + * a root hash "R" + * the encoding parameters (including k, N, file size, segment size) + * a signed copy of [seqnum,R,encoding_params], using the signature key + * the verification key (not encrypted) + * the share hash chain (part of a Merkle tree over the share hashes) + * the block hash tree (Merkle tree over blocks of share data) + * the share data itself (erasure-coding of read-key-encrypted file data) + * the signature key, encrypted with the write key + +The access pattern for read is: + * hash read-key to get storage index + * use storage index to locate 'k' shares with identical 'R' values + * either get one share, read 'k' from it, then read k-1 shares + * or read, say, 5 shares, discover k, either get more or be finished + * or copy k into the URIs + * read verification key + * hash verification key, compare against verification key hash + * read seqnum, R, encoding parameters, signature + * verify signature against verification key + * read share data, compute block-hash Merkle tree and root "r" + * read share hash chain (leading from "r" to "R") + * validate share hash chain up to the root "R" + * submit share data to erasure decoding + * decrypt decoded data with read-key + * submit plaintext to application + +The access pattern for write is: + * hash write-key to get read-key, hash read-key to get storage index + * use the storage index to locate at least one share + * read verification key and encrypted signature key + * decrypt signature key using write-key + * hash signature key, compare against write-key + * hash verification key, compare against verification key hash + * encrypt plaintext from application with read-key + * application can encrypt some data with the write-key to make it only + available to writers (use this for transitive read-onlyness of dirnodes) + * erasure-code crypttext to form shares + * split shares into blocks + * compute Merkle tree of blocks, giving root "r" for each share + * compute Merkle tree of shares, find root "R" for the file as a whole + * create share data structures, one per server: + * use seqnum which is one higher than the old version + * share hash chain has log(N) hashes, different for each server + * signed data is the same for each server + * now we have N shares and need homes for them + * walk through peers + * if share is not already present, allocate-and-set + * otherwise, try to modify existing share: + * send testv_and_writev operation to each one + * testv says to accept share if their(seqnum+R) <= our(seqnum+R) + * count how many servers wind up with which versions (histogram over R) + * keep going until N servers have the same version, or we run out of servers + * if any servers wound up with a different version, report error to + application + * if we ran out of servers, initiate recovery process (described below) + +=== Server Storage Protocol === + +The storage servers will provide a mutable slot container which is oblivious +to the details of the data being contained inside it. Each storage index +refers to a "bucket", and each bucket has one or more shares inside it. (In a +well-provisioned network, each bucket will have only one share). The bucket +is stored as a directory, using the base32-encoded storage index as the +directory name. Each share is stored in a single file, using the share number +as the filename. + +The container holds space for a container magic number (for versioning), the +write enabler, the nodeid which accepted the write enabler (used for share +migration, described below), a small number of lease structures, the embedded +data itself, and expansion space for additional lease structures. + + # offset size name + 1 0 32 magic verstr "tahoe mutable container v1" plus binary + 2 32 20 write enabler's nodeid + 3 52 32 write enabler + 4 84 8 data size (actual share data present) (a) + 5 92 8 offset of (8) count of extra leases (after data) + 6 100 368 four leases, 92 bytes each + 0 4 ownerid (0 means "no lease here") + 4 4 expiration timestamp + 8 32 renewal token + 40 32 cancel token + 72 20 nodeid which accepted the tokens + 7 468 (a) data + 8 ?? 4 count of extra leases + 9 ?? n*92 extra leases + +The "extra leases" field must be copied and rewritten each time the size of +the enclosed data changes. The hope is that most buckets will have four or +fewer leases and this extra copying will not usually be necessary. + +The (4) "data size" field contains the actual number of bytes of data present +in field (7), such that a client request to read beyond 504+(a) will result +in an error. This allows the client to (one day) read relative to the end of +the file. The container size (that is, (8)-(7)) might be larger, especially +if extra size was pre-allocated in anticipation of filling the container with +a lot of data. + +The offset in (5) points at the *count* of extra leases, at (8). The actual +leases (at (9)) begin 4 bytes later. If the container size changes, both (8) +and (9) must be relocated by copying. + +The server will honor any write commands that provide the write token and do +not exceed the server-wide storage size limitations. Read and write commands +MUST be restricted to the 'data' portion of the container: the implementation +of those commands MUST perform correct bounds-checking to make sure other +portions of the container are inaccessible to the clients. + +The two methods provided by the storage server on these "MutableSlot" share +objects are: + + * readv(ListOf(offset=int, length=int)) + * returns a list of bytestrings, of the various requested lengths + * offset < 0 is interpreted relative to the end of the data + * spans which hit the end of the data will return truncated data + + * testv_and_writev(write_enabler, test_vector, write_vector) + * this is a test-and-set operation which performs the given tests and only + applies the desired writes if all tests succeed. This is used to detect + simultaneous writers, and to reduce the chance that an update will lose + data recently written by some other party (written after the last time + this slot was read). + * test_vector=ListOf(TupleOf(offset, length, opcode, specimen)) + * the opcode is a string, from the set [gt, ge, eq, le, lt, ne] + * each element of the test vector is read from the slot's data and + compared against the specimen using the desired (in)equality. If all + tests evaluate True, the write is performed + * write_vector=ListOf(TupleOf(offset, newdata)) + * offset < 0 is not yet defined, it probably means relative to the + end of the data, which probably means append, but we haven't nailed + it down quite yet + * write vectors are executed in order, which specifies the results of + overlapping writes + * return value: + * error: OutOfSpace + * error: something else (io error, out of memory, whatever) + * (True, old_test_data): the write was accepted (test_vector passed) + * (False, old_test_data): the write was rejected (test_vector failed) + * both 'accepted' and 'rejected' return the old data that was used + for the test_vector comparison. This can be used by the client + to detect write collisions, including collisions for which the + desired behavior was to overwrite the old version. + +In addition, the storage server provides several methods to access these +share objects: + + * allocate_mutable_slot(storage_index, sharenums=SetOf(int)) + * returns DictOf(int, MutableSlot) + * get_mutable_slot(storage_index) + * returns DictOf(int, MutableSlot) + * or raises KeyError + +We intend to add an interface which allows small slots to allocate-and-write +in a single call, as well as do update or read in a single call. The goal is +to allow a reasonably-sized dirnode to be created (or updated, or read) in +just one round trip (to all N shareholders in parallel). + +==== migrating shares ==== + +If a share must be migrated from one server to another, two values become +invalid: the write enabler (since it was computed for the old server), and +the lease renew/cancel tokens. + +Suppose that a slot was first created on nodeA, and was thus initialized with +WE(nodeA) (= H(WEM+nodeA)). Later, for provisioning reasons, the share is +moved from nodeA to nodeB. + +Readers may still be able to find the share in its new home, depending upon +how many servers are present in the grid, where the new nodeid lands in the +permuted index for this particular storage index, and how many servers the +reading client is willing to contact. + +When a client attempts to write to this migrated share, it will get a "bad +write enabler" error, since the WE it computes for nodeB will not match the +WE(nodeA) that was embedded in the share. When this occurs, the "bad write +enabler" message must include the old nodeid (e.g. nodeA) that was in the +share. + +The client then computes H(nodeB+H(WEM+nodeA)), which is the same as +H(nodeB+WE(nodeA)). The client sends this along with the new WE(nodeB), which +is H(WEM+nodeB). Note that the client only sends WE(nodeB) to nodeB, never to +anyone else. Also note that the client does not send a value to nodeB that +would allow the node to impersonate the client to a third node: everything +sent to nodeB will include something specific to nodeB in it. + +The server locally computes H(nodeB+WE(nodeA)), using its own node id and the +old write enabler from the share. It compares this against the value supplied +by the client. If they match, this serves as proof that the client was able +to compute the old write enabler. The server then accepts the client's new +WE(nodeB) and writes it into the container. + +This WE-fixup process requires an extra round trip, and requires the error +message to include the old nodeid, but does not require any public key +operations on either client or server. + +Migrating the leases will require a similar protocol. This protocol will be +defined concretely at a later date. + +=== Code Details === + +The MutableFileNode class is used to manipulate mutable files (as opposed to +ImmutableFileNodes). These are initially generated with +client.create_mutable_file(), and later recreated from URIs with +client.create_node_from_uri(). Instances of this class will contain a URI and +a reference to the client (for peer selection and connection). + +NOTE: this section is out of date. Please see src/allmydata/interfaces.py +(the section on IMutableFilesystemNode) for more accurate information. + +The methods of MutableFileNode are: + + * download_to_data() -> [deferred] newdata, NotEnoughSharesError + * if there are multiple retrieveable versions in the grid, get() returns + the first version it can reconstruct, and silently ignores the others. + In the future, a more advanced API will signal and provide access to + the multiple heads. + * update(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError + * overwrite(newdata) -> OK, UncoordinatedWriteError, NotEnoughSharesError + +download_to_data() causes a new retrieval to occur, pulling the current +contents from the grid and returning them to the caller. At the same time, +this call caches information about the current version of the file. This +information will be used in a subsequent call to update(), and if another +change has occured between the two, this information will be out of date, +triggering the UncoordinatedWriteError. + +update() is therefore intended to be used just after a download_to_data(), in +the following pattern: + + d = mfn.download_to_data() + d.addCallback(apply_delta) + d.addCallback(mfn.update) + +If the update() call raises UCW, then the application can simply return an +error to the user ("you violated the Prime Coordination Directive"), and they +can try again later. Alternatively, the application can attempt to retry on +its own. To accomplish this, the app needs to pause, download the new +(post-collision and post-recovery) form of the file, reapply their delta, +then submit the update request again. A randomized pause is necessary to +reduce the chances of colliding a second time with another client that is +doing exactly the same thing: + + d = mfn.download_to_data() + d.addCallback(apply_delta) + d.addCallback(mfn.update) + def _retry(f): + f.trap(UncoordinatedWriteError) + d1 = pause(random.uniform(5, 20)) + d1.addCallback(lambda res: mfn.download_to_data()) + d1.addCallback(apply_delta) + d1.addCallback(mfn.update) + return d1 + d.addErrback(_retry) + +Enthusiastic applications can retry multiple times, using a randomized +exponential backoff between each. A particularly enthusiastic application can +retry forever, but such apps are encouraged to provide a means to the user of +giving up after a while. + +UCW does not mean that the update was not applied, so it is also a good idea +to skip the retry-update step if the delta was already applied: + + d = mfn.download_to_data() + d.addCallback(apply_delta) + d.addCallback(mfn.update) + def _retry(f): + f.trap(UncoordinatedWriteError) + d1 = pause(random.uniform(5, 20)) + d1.addCallback(lambda res: mfn.download_to_data()) + def _maybe_apply_delta(contents): + new_contents = apply_delta(contents) + if new_contents != contents: + return mfn.update(new_contents) + d1.addCallback(_maybe_apply_delta) + return d1 + d.addErrback(_retry) + +update() is the right interface to use for delta-application situations, like +directory nodes (in which apply_delta might be adding or removing child +entries from a serialized table). + +Note that any uncoordinated write has the potential to lose data. We must do +more analysis to be sure, but it appears that two clients who write to the +same mutable file at the same time (even if both eventually retry) will, with +high probability, result in one client observing UCW and the other silently +losing their changes. It is also possible for both clients to observe UCW. +The moral of the story is that the Prime Coordination Directive is there for +a reason, and that recovery/UCW/retry is not a subsitute for write +coordination. + +overwrite() tells the client to ignore this cached version information, and +to unconditionally replace the mutable file's contents with the new data. +This should not be used in delta application, but rather in situations where +you want to replace the file's contents with completely unrelated ones. When +raw files are uploaded into a mutable slot through the tahoe webapi (using +POST and the ?mutable=true argument), they are put in place with overwrite(). + + + +The peer-selection and data-structure manipulation (and signing/verification) +steps will be implemented in a separate class in allmydata/mutable.py . + +=== SMDF Slot Format === + +This SMDF data lives inside a server-side MutableSlot container. The server +is oblivious to this format. + +This data is tightly packed. In particular, the share data is defined to run +all the way to the beginning of the encrypted private key (the encprivkey +offset is used both to terminate the share data and to begin the encprivkey). + + # offset size name + 1 0 1 version byte, \x00 for this format + 2 1 8 sequence number. 2^64-1 must be handled specially, TBD + 3 9 32 "R" (root of share hash Merkle tree) + 4 41 16 IV (share data is AES(H(readkey+IV)) ) + 5 57 18 encoding parameters: + 57 1 k + 58 1 N + 59 8 segment size + 67 8 data length (of original plaintext) + 6 75 32 offset table: + 75 4 (8) signature + 79 4 (9) share hash chain + 83 4 (10) block hash tree + 87 4 (11) share data + 91 8 (12) encrypted private key + 99 8 (13) EOF + 7 107 436ish verification key (2048 RSA key) + 8 543ish 256ish signature=RSAenc(sigkey, H(version+seqnum+r+IV+encparm)) + 9 799ish (a) share hash chain, encoded as: + "".join([pack(">H32s", shnum, hash) + for (shnum,hash) in needed_hashes]) +10 (927ish) (b) block hash tree, encoded as: + "".join([pack(">32s",hash) for hash in block_hash_tree]) +11 (935ish) LEN share data (no gap between this and encprivkey) +12 ?? 1216ish encrypted private key= AESenc(write-key, RSA-key) +13 ?? -- EOF + +(a) The share hash chain contains ceil(log(N)) hashes, each 32 bytes long. + This is the set of hashes necessary to validate this share's leaf in the + share Merkle tree. For N=10, this is 4 hashes, i.e. 128 bytes. +(b) The block hash tree contains ceil(length/segsize) hashes, each 32 bytes + long. This is the set of hashes necessary to validate any given block of + share data up to the per-share root "r". Each "r" is a leaf of the share + has tree (with root "R"), from which a minimal subset of hashes is put in + the share hash chain in (8). + +=== Recovery === + +The first line of defense against damage caused by colliding writes is the +Prime Coordination Directive: "Don't Do That". + +The second line of defense is to keep "S" (the number of competing versions) +lower than N/k. If this holds true, at least one competing version will have +k shares and thus be recoverable. Note that server unavailability counts +against us here: the old version stored on the unavailable server must be +included in the value of S. + +The third line of defense is our use of testv_and_writev() (described below), +which increases the convergence of simultaneous writes: one of the writers +will be favored (the one with the highest "R"), and that version is more +likely to be accepted than the others. This defense is least effective in the +pathological situation where S simultaneous writers are active, the one with +the lowest "R" writes to N-k+1 of the shares and then dies, then the one with +the next-lowest "R" writes to N-2k+1 of the shares and dies, etc, until the +one with the highest "R" writes to k-1 shares and dies. Any other sequencing +will allow the highest "R" to write to at least k shares and establish a new +revision. + +The fourth line of defense is the fact that each client keeps writing until +at least one version has N shares. This uses additional servers, if +necessary, to make sure that either the client's version or some +newer/overriding version is highly available. + +The fifth line of defense is the recovery algorithm, which seeks to make sure +that at least *one* version is highly available, even if that version is +somebody else's. + +The write-shares-to-peers algorithm is as follows: + + * permute peers according to storage index + * walk through peers, trying to assign one share per peer + * for each peer: + * send testv_and_writev, using "old(seqnum+R) <= our(seqnum+R)" as the test + * this means that we will overwrite any old versions, and we will + overwrite simultaenous writers of the same version if our R is higher. + We will not overwrite writers using a higher seqnum. + * record the version that each share winds up with. If the write was + accepted, this is our own version. If it was rejected, read the + old_test_data to find out what version was retained. + * if old_test_data indicates the seqnum was equal or greater than our + own, mark the "Simultanous Writes Detected" flag, which will eventually + result in an error being reported to the writer (in their close() call). + * build a histogram of "R" values + * repeat until the histogram indicate that some version (possibly ours) + has N shares. Use new servers if necessary. + * If we run out of servers: + * if there are at least shares-of-happiness of any one version, we're + happy, so return. (the close() might still get an error) + * not happy, need to reinforce something, goto RECOVERY + +RECOVERY: + * read all shares, count the versions, identify the recoverable ones, + discard the unrecoverable ones. + * sort versions: locate max(seqnums), put all versions with that seqnum + in the list, sort by number of outstanding shares. Then put our own + version. (TODO: put versions with seqnum <max but >us ahead of us?). + * for each version: + * attempt to recover that version + * if not possible, remove it from the list, go to next one + * if recovered, start at beginning of peer list, push that version, + continue until N shares are placed + * if pushing our own version, bump up the seqnum to one higher than + the max seqnum we saw + * if we run out of servers: + * schedule retry and exponential backoff to repeat RECOVERY + * admit defeat after some period? presumeably the client will be shut down + eventually, maybe keep trying (once per hour?) until then. + + + + +== Medium Distributed Mutable Files == + +These are just like the SDMF case, but: + + * we actually take advantage of the Merkle hash tree over the blocks, by + reading a single segment of data at a time (and its necessary hashes), to + reduce the read-time alacrity + * we allow arbitrary writes to the file (i.e. seek() is provided, and + O_TRUNC is no longer required) + * we write more code on the client side (in the MutableFileNode class), to + first read each segment that a write must modify. This looks exactly like + the way a normal filesystem uses a block device, or how a CPU must perform + a cache-line fill before modifying a single word. + * we might implement some sort of copy-based atomic update server call, + to allow multiple writev() calls to appear atomic to any readers. + +MDMF slots provide fairly efficient in-place edits of very large files (a few +GB). Appending data is also fairly efficient, although each time a power of 2 +boundary is crossed, the entire file must effectively be re-uploaded (because +the size of the block hash tree changes), so if the filesize is known in +advance, that space ought to be pre-allocated (by leaving extra space between +the block hash tree and the actual data). + +MDMF1 uses the Merkle tree to enable low-alacrity random-access reads. MDMF2 +adds cache-line reads to allow random-access writes. + +== Large Distributed Mutable Files == + +LDMF slots use a fundamentally different way to store the file, inspired by +Mercurial's "revlog" format. They enable very efficient insert/remove/replace +editing of arbitrary spans. Multiple versions of the file can be retained, in +a revision graph that can have multiple heads. Each revision can be +referenced by a cryptographic identifier. There are two forms of the URI, one +that means "most recent version", and a longer one that points to a specific +revision. + +Metadata can be attached to the revisions, like timestamps, to enable rolling +back an entire tree to a specific point in history. + +LDMF1 provides deltas but tries to avoid dealing with multiple heads. LDMF2 +provides explicit support for revision identifiers and branching. + +== TODO == + +improve allocate-and-write or get-writer-buckets API to allow one-call (or +maybe two-call) updates. The challenge is in figuring out which shares are on +which machines. First cut will have lots of round trips. + +(eventually) define behavior when seqnum wraps. At the very least make sure +it can't cause a security problem. "the slot is worn out" is acceptable. + +(eventually) define share-migration lease update protocol. Including the +nodeid who accepted the lease is useful, we can use the same protocol as we +do for updating the write enabler. However we need to know which lease to +update.. maybe send back a list of all old nodeids that we find, then try all +of them when we accept the update? + + We now do this in a specially-formatted IndexError exception: + "UNABLE to renew non-existent lease. I have leases accepted by " + + "nodeids: '12345','abcde','44221' ." + +confirm that a repairer can regenerate shares without the private key. Hmm, +without the write-enabler they won't be able to write those shares to the +servers.. although they could add immutable new shares to new servers. diff --git a/docs/specifications/uri.txt b/docs/specifications/uri.txt new file mode 100644 index 00000000..5599fa19 --- /dev/null +++ b/docs/specifications/uri.txt @@ -0,0 +1,187 @@ + += Tahoe URIs = + +Each file and directory in a Tahoe filesystem is described by a "URI". There +are different kinds of URIs for different kinds of objects, and there are +different kinds of URIs to provide different kinds of access to those +objects. Each URI is a string representation of a "capability" or "cap", and +there are read-caps, write-caps, verify-caps, and others. + +Each URI provides both '''location''' and '''identification''' properties. +'''location''' means that holding the URI is sufficient to locate the data it +represents (this means it contains a storage index or a lookup key, whatever +is necessary to find the place or places where the data is being kept). +'''identification''' means that the URI also serves to validate the data: an +attacker who wants to trick you into into using the wrong data will be +limited in their abilities by the identification properties of the URI. + +Some URIs are subsets of others. In particular, if you know a URI which +allows you to modify some object, you can produce a weaker read-only URI and +give it to someone else, and they will be able to read that object but not +modify it. Directories, for example, have a read-cap which is derived from +the write-cap: anyone with read/write access to the directory can produce a +limited URI that grants read-only access, but not the other way around. + +source:src/allmydata/uri.py is the main place where URIs are processed. It is +the authoritative definition point for all the the URI types described +herein. + +== File URIs == + +The lowest layer of the Tahoe architecture (the "grid") is reponsible for +mapping URIs to data. This is basically a distributed hash table, in which +the URI is the key, and some sequence of bytes is the value. + +There are two kinds of entries in this table: immutable and mutable. For +immutable entries, the URI represents a fixed chunk of data. The URI itself +is derived from the data when it is uploaded into the grid, and can be used +to locate and download that data from the grid at some time in the future. + +For mutable entries, the URI identifies a "slot" or "container", which can be +filled with different pieces of data at different times. + +It is important to note that the "files" described by these URIs are just a +bunch of bytes, and that __no__ filenames or other metadata is retained at +this layer. The vdrive layer (which sits above the grid layer) is entirely +responsible for directories and filenames and the like. + +=== CHI URIs === + +CHK (Content Hash Keyed) files are immutable sequences of bytes. They are +uploaded in a distributed fashion using a "storage index" (for the "location" +property), and encrypted using a "read key". A secure hash of the data is +computed to help validate the data afterwards (providing the "identification" +property). All of these pieces, plus information about the file's size and +the number of shares into which it has been distributed, are put into the +"CHK" uri. The storage index is derived by hashing the read key (using a +tagged SHA-256d hash, then truncated to 128 bits), so it does not need to be +physically present in the URI. + +The current format for CHK URIs is the concatenation of the following +strings: + + URI:CHK:(key):(hash):(needed-shares):(total-shares):(size) + +Where (key) is the base32 encoding of the 16-byte AES read key, (hash) is the +base32 encoding of the SHA-256 hash of the URI Extension Block, +(needed-shares) is an ascii decimal representation of the number of shares +required to reconstruct this file, (total-shares) is the same representation +of the total number of shares created, and (size) is an ascii decimal +representation of the size of the data represented by this URI. All base32 +encodings are expressed in lower-case, with the trailing '=' signs removed. + +For example, the following is a CHK URI, generated from the contents of the +architecture.txt document that lives next to this one in the source tree: + +URI:CHK:ihrbeov7lbvoduupd4qblysj7a:bg5agsdt62jb34hxvxmdsbza6do64f4fg5anxxod2buttbo6udzq:3:10:28733 + +Historical note: The name "CHK" is somewhat inaccurate and continues to be +used for historical reasons. "Content Hash Key" means that the encryption key +is derived by hashing the contents, which gives the useful property that +encoding the same file twice will result in the same URI. However, this is an +optional step: by passing a different flag to the appropriate API call, Tahoe +will generate a random encryption key instead of hashing the file: this gives +the useful property that the URI or storage index does not reveal anything +about the file's contents (except filesize), which improves privacy. The +URI:CHK: prefix really indicates that an immutable file is in use, without +saying anything about how the key was derived. + +=== LIT URIs === + +LITeral files are also an immutable sequence of bytes, but they are so short +that the data is stored inside the URI itself. These are used for files of 55 +bytes or shorter, which is the point at which the LIT URI is the same length +as a CHK URI would be. + +LIT URIs do not require an upload or download phase, as their data is stored +directly in the URI. + +The format of a LIT URI is simply a fixed prefix concatenated with the base32 +encoding of the file's data: + + URI:LIT:bjuw4y3movsgkidbnrwg26lemf2gcl3xmvrc6kropbuhi3lmbi + +The LIT URI for an empty file is "URI:LIT:", and the LIT URI for a 5-byte +file that contains the string "hello" is "URI:LIT:nbswy3dp". + +=== Mutable File URIs === + +The other kind of DHT entry is the "mutable slot", in which the URI names a +container to which data can be placed and retrieved without changing the +identity of the container. + +These slots have write-caps (which allow read/write access), read-caps (which +only allow read-access), and verify-caps (which allow a file checker/repairer +to confirm that the contents exist, but does not let it decrypt the +contents). + +Mutable slots use public key technology to provide data integrity, and put a +hash of the public key in the URI. As a result, the data validation is +limited to confirming that the data retrieved matches _some_ data that was +uploaded in the past, but not _which_ version of that data. + +The format of the write-cap for mutable files is: + + URI:SSK:(writekey):(fingerprint) + +Where (writekey) is the base32 encoding of the 16-byte AES encryption key +that is used to encrypt the RSA private key, and (fingerprint) is the base32 +encoded 32-byte SHA-256 hash of the RSA public key. For more details about +the way these keys are used, please see docs/mutable.txt . + +The format for mutable read-caps is: + + URI:SSK-RO:(readkey):(fingerprint) + +The read-cap is just like the write-cap except it contains the other AES +encryption key: the one used for encrypting the mutable file's contents. This +second key is derived by hashing the writekey, which allows the holder of a +write-cap to produce a read-cap, but not the other way around. The +fingerprint is the same in both caps. + +Historical note: the "SSK" prefix is a perhaps-inaccurate reference to +"Sub-Space Keys" from the Freenet project, which uses a vaguely similar +structure to provide mutable file access. + +== Directory URIs == + +The grid layer provides a mapping from URI to data. To turn this into a graph +of directories and files, the "vdrive" layer (which sits on top of the grid +layer) needs to keep track of "directory nodes", or "dirnodes" for short. +source:docs/dirnodes.txt describes how these work. + +Dirnodes are contained inside mutable files, and are thus simply a particular +way to interpret the contents of these files. As a result, a directory +write-cap looks a lot like a mutable-file write-cap: + + URI:DIR2:(writekey):(fingerprint) + +Likewise directory read-caps (which provide read-only access to the +directory) look much like mutable-file read-caps: + + URI:DIR2-RO:(readkey):(fingerprint) + +Historical note: the "DIR2" prefix is used because the non-distributed +dirnodes in earlier Tahoe releases had already claimed the "DIR" prefix. + +== Internal Usage of URIs == + +The classes in source:src/allmydata/uri.py are used to pack and unpack these +various kinds of URIs. Three Interfaces are defined (IURI, IFileURI, and +IDirnodeURI) which are implemented by these classes, and string-to-URI-class +conversion routines have been registered as adapters, so that code which +wants to extract e.g. the size of a CHK or LIT uri can do: + +{{{ +print IFileURI(uri).get_size() +}}} + +If the URI does not represent a CHK or LIT uri (for example, if it was for a +directory instead), the adaptation will fail, raising a TypeError inside the +IFileURI() call. + +Several utility methods are provided on these objects. The most important is +{{{ to_string() }}}, which returns the string form of the URI. Therefore {{{ +IURI(uri).to_string == uri }}} is true for any valid URI. See the IURI class +in source:src/allmydata/interfaces.py for more details. + diff --git a/docs/uri.txt b/docs/uri.txt deleted file mode 100644 index 5599fa19..00000000 --- a/docs/uri.txt +++ /dev/null @@ -1,187 +0,0 @@ - -= Tahoe URIs = - -Each file and directory in a Tahoe filesystem is described by a "URI". There -are different kinds of URIs for different kinds of objects, and there are -different kinds of URIs to provide different kinds of access to those -objects. Each URI is a string representation of a "capability" or "cap", and -there are read-caps, write-caps, verify-caps, and others. - -Each URI provides both '''location''' and '''identification''' properties. -'''location''' means that holding the URI is sufficient to locate the data it -represents (this means it contains a storage index or a lookup key, whatever -is necessary to find the place or places where the data is being kept). -'''identification''' means that the URI also serves to validate the data: an -attacker who wants to trick you into into using the wrong data will be -limited in their abilities by the identification properties of the URI. - -Some URIs are subsets of others. In particular, if you know a URI which -allows you to modify some object, you can produce a weaker read-only URI and -give it to someone else, and they will be able to read that object but not -modify it. Directories, for example, have a read-cap which is derived from -the write-cap: anyone with read/write access to the directory can produce a -limited URI that grants read-only access, but not the other way around. - -source:src/allmydata/uri.py is the main place where URIs are processed. It is -the authoritative definition point for all the the URI types described -herein. - -== File URIs == - -The lowest layer of the Tahoe architecture (the "grid") is reponsible for -mapping URIs to data. This is basically a distributed hash table, in which -the URI is the key, and some sequence of bytes is the value. - -There are two kinds of entries in this table: immutable and mutable. For -immutable entries, the URI represents a fixed chunk of data. The URI itself -is derived from the data when it is uploaded into the grid, and can be used -to locate and download that data from the grid at some time in the future. - -For mutable entries, the URI identifies a "slot" or "container", which can be -filled with different pieces of data at different times. - -It is important to note that the "files" described by these URIs are just a -bunch of bytes, and that __no__ filenames or other metadata is retained at -this layer. The vdrive layer (which sits above the grid layer) is entirely -responsible for directories and filenames and the like. - -=== CHI URIs === - -CHK (Content Hash Keyed) files are immutable sequences of bytes. They are -uploaded in a distributed fashion using a "storage index" (for the "location" -property), and encrypted using a "read key". A secure hash of the data is -computed to help validate the data afterwards (providing the "identification" -property). All of these pieces, plus information about the file's size and -the number of shares into which it has been distributed, are put into the -"CHK" uri. The storage index is derived by hashing the read key (using a -tagged SHA-256d hash, then truncated to 128 bits), so it does not need to be -physically present in the URI. - -The current format for CHK URIs is the concatenation of the following -strings: - - URI:CHK:(key):(hash):(needed-shares):(total-shares):(size) - -Where (key) is the base32 encoding of the 16-byte AES read key, (hash) is the -base32 encoding of the SHA-256 hash of the URI Extension Block, -(needed-shares) is an ascii decimal representation of the number of shares -required to reconstruct this file, (total-shares) is the same representation -of the total number of shares created, and (size) is an ascii decimal -representation of the size of the data represented by this URI. All base32 -encodings are expressed in lower-case, with the trailing '=' signs removed. - -For example, the following is a CHK URI, generated from the contents of the -architecture.txt document that lives next to this one in the source tree: - -URI:CHK:ihrbeov7lbvoduupd4qblysj7a:bg5agsdt62jb34hxvxmdsbza6do64f4fg5anxxod2buttbo6udzq:3:10:28733 - -Historical note: The name "CHK" is somewhat inaccurate and continues to be -used for historical reasons. "Content Hash Key" means that the encryption key -is derived by hashing the contents, which gives the useful property that -encoding the same file twice will result in the same URI. However, this is an -optional step: by passing a different flag to the appropriate API call, Tahoe -will generate a random encryption key instead of hashing the file: this gives -the useful property that the URI or storage index does not reveal anything -about the file's contents (except filesize), which improves privacy. The -URI:CHK: prefix really indicates that an immutable file is in use, without -saying anything about how the key was derived. - -=== LIT URIs === - -LITeral files are also an immutable sequence of bytes, but they are so short -that the data is stored inside the URI itself. These are used for files of 55 -bytes or shorter, which is the point at which the LIT URI is the same length -as a CHK URI would be. - -LIT URIs do not require an upload or download phase, as their data is stored -directly in the URI. - -The format of a LIT URI is simply a fixed prefix concatenated with the base32 -encoding of the file's data: - - URI:LIT:bjuw4y3movsgkidbnrwg26lemf2gcl3xmvrc6kropbuhi3lmbi - -The LIT URI for an empty file is "URI:LIT:", and the LIT URI for a 5-byte -file that contains the string "hello" is "URI:LIT:nbswy3dp". - -=== Mutable File URIs === - -The other kind of DHT entry is the "mutable slot", in which the URI names a -container to which data can be placed and retrieved without changing the -identity of the container. - -These slots have write-caps (which allow read/write access), read-caps (which -only allow read-access), and verify-caps (which allow a file checker/repairer -to confirm that the contents exist, but does not let it decrypt the -contents). - -Mutable slots use public key technology to provide data integrity, and put a -hash of the public key in the URI. As a result, the data validation is -limited to confirming that the data retrieved matches _some_ data that was -uploaded in the past, but not _which_ version of that data. - -The format of the write-cap for mutable files is: - - URI:SSK:(writekey):(fingerprint) - -Where (writekey) is the base32 encoding of the 16-byte AES encryption key -that is used to encrypt the RSA private key, and (fingerprint) is the base32 -encoded 32-byte SHA-256 hash of the RSA public key. For more details about -the way these keys are used, please see docs/mutable.txt . - -The format for mutable read-caps is: - - URI:SSK-RO:(readkey):(fingerprint) - -The read-cap is just like the write-cap except it contains the other AES -encryption key: the one used for encrypting the mutable file's contents. This -second key is derived by hashing the writekey, which allows the holder of a -write-cap to produce a read-cap, but not the other way around. The -fingerprint is the same in both caps. - -Historical note: the "SSK" prefix is a perhaps-inaccurate reference to -"Sub-Space Keys" from the Freenet project, which uses a vaguely similar -structure to provide mutable file access. - -== Directory URIs == - -The grid layer provides a mapping from URI to data. To turn this into a graph -of directories and files, the "vdrive" layer (which sits on top of the grid -layer) needs to keep track of "directory nodes", or "dirnodes" for short. -source:docs/dirnodes.txt describes how these work. - -Dirnodes are contained inside mutable files, and are thus simply a particular -way to interpret the contents of these files. As a result, a directory -write-cap looks a lot like a mutable-file write-cap: - - URI:DIR2:(writekey):(fingerprint) - -Likewise directory read-caps (which provide read-only access to the -directory) look much like mutable-file read-caps: - - URI:DIR2-RO:(readkey):(fingerprint) - -Historical note: the "DIR2" prefix is used because the non-distributed -dirnodes in earlier Tahoe releases had already claimed the "DIR" prefix. - -== Internal Usage of URIs == - -The classes in source:src/allmydata/uri.py are used to pack and unpack these -various kinds of URIs. Three Interfaces are defined (IURI, IFileURI, and -IDirnodeURI) which are implemented by these classes, and string-to-URI-class -conversion routines have been registered as adapters, so that code which -wants to extract e.g. the size of a CHK or LIT uri can do: - -{{{ -print IFileURI(uri).get_size() -}}} - -If the URI does not represent a CHK or LIT uri (for example, if it was for a -directory instead), the adaptation will fail, raising a TypeError inside the -IFileURI() call. - -Several utility methods are provided on these objects. The most important is -{{{ to_string() }}}, which returns the string form of the URI. Therefore {{{ -IURI(uri).to_string == uri }}} is true for any valid URI. See the IURI class -in source:src/allmydata/interfaces.py for more details. -