From 00649c592808b27ef250c99ea1ad05f8a93d05dc Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 8 Nov 2018 15:04:17 -0500 Subject: [PATCH] Content - P2P - Add DIP4 p2p messages getmnlistd and mnlistdiff with details Update data message image with DIP4 messages --- _includes/devdoc/ref_p2p_networking.md | 109 ++++++++++++++++++ img/dev/en-p2p-data-messages.dot | 1 + img/dev/en-p2p-data-messages.png | Bin 24436 -> 22625 bytes img/dev/en-p2p-data-messages.svg | 152 ++++++++++++++----------- 4 files changed, 193 insertions(+), 69 deletions(-) diff --git a/_includes/devdoc/ref_p2p_networking.md b/_includes/devdoc/ref_p2p_networking.md index 7aa2690d..22478d7d 100644 --- a/_includes/devdoc/ref_p2p_networking.md +++ b/_includes/devdoc/ref_p2p_networking.md @@ -542,6 +542,34 @@ to the `getheaders` message will include as many as 2,000 block headers. {% endautocrossref %} +#### GetMNListD +{% include helpers/subhead-links.md %} + +{% autocrossref %} + +*Added in protocol version 70211* + +The `getmnlistd` message is sent to request a full masternode list or an +update to a previously requested masternode list. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 32 | baseBlockHash | uint256 | Required | Hash of a block the requester already has a valid masternode list of.
_Note: Can be all-zero to indicate that a full masternode list is requested._ +| 32 | blockHash | uint256 | Required | Hash of the block for which the masternode list diff is requested + +The following annotated hexdump shows a `getmnlistd` message. (The +message header has been omitted.) + +{% highlight text %} +000001ee5108348a2c59396da29dc576 +9b2a9bb303d7577aee9cd95136c49b9b ........... Base block hash + +0000030f51f12e7069a7aa5f1bc9085d +db3fe368976296fd3b6d73fdaf898cc0 ........... Block hash +{% endhighlight %} + +{% endautocrossref %} + #### Headers {% include helpers/subhead-links.md %} @@ -849,6 +877,87 @@ template near the beginning of this subsection. {% endautocrossref %} +#### MnListDiff +{% include helpers/subhead-links.md %} + +{% autocrossref %} + +*Added in protocol version 70211* + +The `mnlistdiff` message is a reply to a `getmnlistd` message which +requested either a full masternode list or a diff for a range of blocks. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 32 | baseBlockHash | uint256 | Required | Hash of a block the requester already has a valid masternode list of. Can be all-zero to indicate that a full masternode list is requested. +| 32 | blockHash | uint256 | Required | Hash of the block for which the masternode list diff is requested +| 4 | totalTransactions | uint32_t | Required | Number of total transactions in `blockHash` +| 1-9 | merkleHashesCount | compactSize uint | Required | Number of Merkle hashes +| variable | merkleHashes | vector | Required | Merkle hashes in depth-first order +| 1-9 | merkleFlagsCount | compactSize uint | Required | Number of Merkle flag bytes +| variable | merkleFlags | vector | Required | Merkle flag bits, packed per 8 in a byte, least significant bit first +| variable | cbTx | CTransaction | Required | The fully serialized coinbase transaction of `blockHash` +| variable | deletedMNs | vector | Required | A list of ProRegTx hashes for masternode which were deleted after `baseBlockHash` +| variable | mnList | vector | Required | The list of SML entries which were added or updated since `baseBlockHash` + +The following annotated hexdump shows a `mnlistdiff` message. (The +message header has been omitted.) + +{% highlight text %} +000001ee5108348a2c59396da29dc576 +9b2a9bb303d7577aee9cd95136c49b9b ........... Base block hash + +0000030f51f12e7069a7aa5f1bc9085d +db3fe368976296fd3b6d73fdaf898cc0 ........... Block hash + +05000000 ................................... Transactions: 5 + +04 ......................................... Merkle hash count: 4 + +4488a599e5d61709664c32305befd58b +ef29e33bc6e718af0233f938557a57a9 ........... Merkle hash 1 +5c8119b7b136d94e477a0d2917d5f724 +5ff299cc6e31994f6236a8fb34fec88f ........... Merkle hash 2 +905efa3e6743c889823f00147d36d12f +d12ad401c19089f0affcabd423deef67 ........... Merkle hash 3 +3f3a7f84d7ad33214994b5aecf4c1e19 +2cb65b86750b1377e069073d1eba477a ........... Merkle hash 4 + +01 ......................................... Merkle flag count: 1 +0f ......................................... Flags: 0 0 0 0 1 1 1 1 + +[...]....................................... Coinbase Tx (Not shown) + +00 ......................................... Deleted masternodes: 0 + +02 ......................................... Masternode list entries: 2 + +Masternode List +| Masternode 1 +| | 01040eb32f760490054543356cff4638 +| | 65633439dd073cffa570305eb086f70e ....... ProRegTx hash +| | 00000000000000000000000000000000 ....... IP Address: ::ffff:0.0.0.0 +| | 0000 ................................... Port: 0 +| | +| | 0000000000000000000000000000000000000000 +| | 0000000000000000000000000000000000000000 +| | 0000000000000000 ....................... Operator public key (BLS) +| | c2ae01fb4084cbc3bc31e7f59b36be228a320404 Voting pubkey hash (ECDSA) +| +| Masternode 2 +| | f7737beb39779971e9bc59632243e13f +| | c5fc9ada93b69bf48c2d4c463296cd5a ....... ProRegTx hash +| | 000000000000000000000000cf9af40d ....... IP Address: ::ffff:207.154.244.13 +| | 4e1f ................................... Port: 19999 +| | +| | 88d719278eef605d9c19037366910b59bc28d437 +| | de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8 +| | c22f4a914a6c5566 ....................... Operator public key (BLS) +| | 43ce12751c4ba45dcdfe2c16cefd61461e17a54d Voting pubkey hash (ECDSA) +{% endhighlight %} + +{% endautocrossref %} + #### NotFound {% include helpers/subhead-links.md %} diff --git a/img/dev/en-p2p-data-messages.dot b/img/dev/en-p2p-data-messages.dot index 2e47a418..72e090ac 100644 --- a/img/dev/en-p2p-data-messages.dot +++ b/img/dev/en-p2p-data-messages.dot @@ -10,6 +10,7 @@ edge [ penwidth = 1.75, fontname="Sans", dir="none" ] node [ penwidth = 1.75, shape = "box", fontname="Sans", ] graph [ penwidth = 1.75, fontname="Sans" ] +getmnlistd -> mnlistdiff [ minlen = 3 ]; getblocktxn -> blocktxn [ minlen = 3 ]; getblocks -> inv; diff --git a/img/dev/en-p2p-data-messages.png b/img/dev/en-p2p-data-messages.png index 39ada9342adfe9a875d97cf826f722aa4139a007..9b511c8d4184c71c93621242ed1bd8f7f3207ab0 100644 GIT binary patch literal 22625 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 literal 24436 zcmbTe2V9PQ-#>oZE0IXjpa>0=iZ)s_q`kDIwD(jY6fJ2$;!&exB#P|F7rucfGF5C3T+1d3?X$&*!~9$NkHfq_%IR+e#vlwqLv;u1F%S zRVR_w@NeFTugJ3Ml;F3G1~O9Oq!r?yXT`6ANu&d$i{j^$oufuNT&^h3EQ|hX$)I=^ zmX&b7y8Grfwyi%od6l+(dZSoy`Nwu1_8hJ2Gox-fg>$CvIVqN=oeLMZI_vyMFqLx zN={~<414LPK3!gh@K{EZS!Jz&bbJH7u&c6F>kv8lxng35>x^k}UsWKJ)P)N^HHAav zbJF6?iGc%WpUp;ZN*>)B=5toudbpW0MJtceo08$3+jy~>_9y=JqkQ3>3Ns1Yt6FZZ zS(o85b*Q_g);cfl3_2#XNub2ER3bq&xgpa~>c(7$ zlX|H~ai?)jP0i*VJG_gE1bOJT$IC|CUYHvn4%NueTZ2D0nev`LfBxaahtFya>iLgx752>C>mhB_$2!C;MD2z7CrzpFh9$wwKp))nqDqdOxeuCDjxC z`%YbZrjo2`ZJX8AV(>}iIFlH@39tD~HTijiNrv^0^F?(S~ur9Td_HdG273ZWv+ZBx%02i{J4o_1igueN)pyv~r^ z-`_7CE9q}P?ljtVSYKa1%dF-2vE#?XQc^euyGl!CqXksdu1)oS+C@uybl<*xit6e| z2L}hc$H&u?yOe+Tg=?7}VP-yG@@I&>roKKL*W8+C6+^L)`@Q*6v!$JjS#t`NsHo^g z8JS?MJj;uknooYu&tJ5)&9Yo7abNgQU^kG|6vp{YCzFx1Yv)eAjM6;wRs*j1CszY| zYM)qecGW#Q=XJI7jf<;=2i9tGC^`L!-|PH*b-L4*9N1aR%!-#UAJEa!v7H;!zTWuq z{*_`^6>;$oA3nTqX;D+FQ(p)xnfmjN_~Cp6Ww6z>sOXb<=#8g z5>p>oXtp^TZc5Kw>L_xuO72cNHhZQdrL}o-^y<~C7m6H5d&|5w6&e-0&4r11Q%3mb z=$3j+mhTYt@wtFICN3rA>r)-GvS_T4V;bt?Lx0Bl?4OxoV@E;G!|I!MFg9s9&QBUm z%+B)d-%mxpG&^L-8NG>Nkltj(eZDWinKC7JeR6lQ%T&KDzD;`{6BCn-qa%&6v9XP< z?XFPi!=(2$H5b(?Yinh;ZrwUPR99c0cdRU{sqX!K>WZo=sY<_nEcfr6X=Hq7F*<1e~zU04y-3KgXhn;ROhQ}@itU%mP=MYmK( zT>Mgu2&cTz#GMNDQf!%hr!Av=eBP`qFL1m6v8SS%pR7I6mzvkvxTIb5rrYt!gE)hN ztSs)=!_*2L`spIgjV_;q>TXqbhU>1b6;rRr!mP#O^cQ*JjO^OA%RXlBo;?ST9N9EC z-X*1>v5!&6nM8F?LnA_mA=mZS_gkHAGNU(UTa7Qs$aqP{o|Bf|Dq#QfCJv{vZE~_? zs_M5K5wlqv3nOek)$!65k&?wp8PZt;1Ln>fQ*yq;AxymmhEY%+d z`Ymri#aMQzaMdVPP)`s4ylZ_PN|L#etA{#?VFZmN8w>+W?{G4kk;46k*QUU zoae2qtcv}#djnYe^#) zNtkfj8CkT>KA3s?zR$pHIb1RL@4Nf0z-j#H`t|Fp$2yAQjO(A;j&}+tchAhtg?D)@ z$UWh+NLtWsURs!oyBN%h)jPr<=$M@!-5(&KR3*l{G!^e!{WUZD#=PzIw(LZ*nr4m1 z2)RmAV23~>|K<17E}s?ZZ}Eod-S?r`&nMgeF@lAeIWaM@yRYx?w!OzgaA_A66oOvH z$A5TxYn?-%=kFhzUVF708X6k?{`KQgWF$KZ7*V6PY~M~c>rxb4w~^vus#cyferPuh z&4<%nH(0cb9QRNKHK%IT_J4}>*Ky5ujLd0H(O_9#UVilSX<8m<-=+es+P3wzjk)_} zGW@nXw`X4uCTEh@yV2`5n>YXr}LK-neU}e?qLvi&8A=!Qh(|;#$Vj$xjYrq zS3K7l%w<@q-hRoh>IF;GmCIwQcOxSsO?c=cPU_#@y=M(@h6Lb@m(eEK7|Zr$o08e%IeE8{k&#% z#?eSKuLNYS&kn+ z{-VL;>R5XLU#gXyhE{He`fU}F%4g3GM2LEpkZs7j|8YBs4eL+G`$#7IxCTS|Y|^mb zzEjg-p7VX--9LWl|LWOfI2tKP!|xKdy%5q3g1?RTI&u4hzLt)gdOaegYxpkk}bNM=><;H#K0L8me0q_n~h|NEx7 zOK7DZigVJ`R*9K4Gs@#Vd{_bpWQ1OB)Y#mU=v!z@GhwNyD~0xh%$AmxjfDfYvn@N?etIUQ2nRheJHpN`^VDf7bMT6u+H#Y=cj7 za&nnxLiVtHjEMH);-Yw*Vnj++d3m|sfviMlV%uX$h?T+K4coAd=4WVT_DV~-?unqF zpzi*DR_xWnn7;ioL!8=Wr&Pidzxor0a(cK$USw%nsUwT}$ffGf&&4WGTp2xn>+chC z&KMh5?(gQx({Wdcm^x5@t2sGT*wkHmy{V#mTY6|~b9?)h!LOOIHP?lQPAP3sb&p=C zYkcF>Hj^5$a2(6)INoWYBGli{la;N@Xa4m7r)KuUkdWQSI5Ie= z$f4{6+7C5doD<>Tkj=H~I)3=@VcVX{?JmQqdA&I;I0G^-S~Q^;OL*`kM4PnqnZ;F6G4w3)6V}H zPB*H5D$Kg+&y&b6)r}s5oyA2dR|*E;IVs}xkp;FjG>vlsPi#jo!Uiw1g^)=GXc)7?I&z_M;_M%*Ssm}284|)iU zjgI<%c_klA2gON~-gHVQur@y>^_m>J*}25ZH}Qe74kM>GKPT zZC7k{xf~u+0}K(!do)7L0A<_{X9FnDQQq6O}8|_fB$KNmF1%4fXiT<2;PEc-nf4fuj zYsWD`bcFX+RXtrR%cm(Bg?ti~UUiezbaN6pWfm&13;Tb|Wg2S(^qvPa9$TsoVrht% z+rNlzneQ~tXxUX_L2kbksvVe+WomTWC~(sWYK0kVCnu>q%Z?1RkQ+-gEk`*x){_8J z>4f}pUtEe7IC$!ml2vN}gP^_V-0W;+D7)IUh^YO~hn;R_ZCkc&D_>b2Uoq(W5PHV? zJ4s~uw;}1KudlDRK*#LpH^YItXkgHhueUyb{>;|0eUZz>P)Fx!nXTbMnqgG{iDNuG zBje=DSFgSu7I7o1sH)zR7nxt5nVDH=1XNum#pHe`j8p4fMa2furRm^Kf%pABX^>I}jnZYOj6XB@@^Wu`hcG)v!f7Q59>_SN>GL=!lX z-(~XU`^w4>K2$6e-CU<%1;s6)(H!U0$_>FAs=7QZDk$_jrrQFL*7xr2wk%UJ8-e1= zc((ue@q+*=1U`=OT-IpIvr5k^NgV&&=*k+{9U{P*Wq|J=apotb2*`YO>nJTuv&ly6e^)=<-}CzT@rfi~h-D z)-0>zF>h4hIQm4V;Le@(!AC3&Qb>_M=5IZ&h@h`}Hxmjne}c1w0n>fB*SI z7bUxO+qSstU*c_-{>*$B7vH4D^r$JRTO^6W&s{z=;#6AUfG>68BCh>@N1Hn<&hMvA zyEv60-K*ipwR-{MvkKqD&8sE3`tH1W=iWVOkPs|~w54Sl1(V1X14BaxBV5b0r7(fQ z&z`;6v5UiQs$N|&lfkV2bLL@Ht$`pewHRKzePkXb+*w0r0RhdDm1VbL2bvQ)99ZPS zxn}yjumC}&iTmoyPuG;YJleRO?&?YX9;Yt%Bk3i7l5&cYRShQf_RT4b>amq&8P(-K zd3@s1OIy226<$ZPxri{~h0|{Jp{j|VK`4>70JX`rT2DMH7`HTo5zK^Xm)y{JQ(WvY z?lv=Y_}H;yu11f7gGa;kA|gF2A3YdVKjj_3xq7P${t)*$K0-R*h8=h(MLJdl4sIY&WT7aS54ba1pS=Sz_V0VVix{2Ta&wzBRBvtc4r z##>UgaT{Ne`?&XrVgY|o5?v9e#r>~&p0BTIYbg)uzAP##DjVHHwIpNJH~;&$&+FH( z&j7cM{WFUT-^A+n>s?8Xw6w3ORiK@{O*6Ug(lupOAa4l zt}+~D>gDI(5zO5G$)RYFb0#hh)={u40?L3SADRs+Fi>FokdathRJ3_~6dMEO<6&**ZP0u~@ zRLhyQZl74zHGOotexg5M3uFRdXo`y$FOqJ)e0k{o`}aTH)0@rB9O#|;_6gQ?dak(N z0LUWUeE(kj&3u0(nQk3bYj|#Y%1D$=?| zz)f(SyP@Ar^E^k5hOP2*tke#TJj>{F?x6(|&MV9AEesw_M~bHkCYnSW(RVfDgcmakph+=jKOsHym^zu(mP7RnzEYAOSiEAevD{f@8|Ra?Y^Z_^%oTuQ%d{&BP&W8gBWTw&|KgoOFH2L9>I!?>3-MbF~ zWrnZ}70lae1E% zTczG7dV&6-gdrhr=J>f{q6B1rU{z=KJfsQ;5{}PI8 zcFc{*`!(F+z0R^rMY;d|xXUc02>f;02YJUki`j`6s;<6p{qwV1`GtiKP_F&x`4uVY z&*)w5Y+q!L@8{&odBeRWteQ#m{*KL?KQHmv1COHCf3h4v;qS|=Vx$I3nV6mqLC@Jw zA-j>IUequk^EchhD`Tbjm@#aFJ4 z7c>sdls}yt>+n^GmHhF0qDLjEDs0pHU9IK!w(rjX!0({tW@et12#8Y^@y*C0l&Icn zs*sQny{-~>T0ut+Nq@RHdv$TXn%dg(O-wg#%8M>34_@~1sb0S~Ze0RcrGk&Yzl5VB z-`cfne*s<^F8-d7_LjKH8!CMlZ$Zdyzow>?1n8NWxu5HFF&_e~PokU|qB#iBQbA7d z|Dz#OTh=y-YG0mHQITEUW=GDUQ8enG;W%>S2%)r@ zV4)1SjtcB(9*FS_xKDkAjV!cAJ=0)=fq_8?rI(LSit^>lL{-v>%Fx64c?^zeFv{++ zVH>H_Wq={us!ONl@=)~0kFp#(Z)j2Tq`l9Ji}U5XFYrOGxas4w8GK7}(3-w(qNj?> zu3uI=;Q4Ov{L|9|qAUAwSERia#_^NtgFAhE5*}&hS^77`O0hHCE59fwSMf38R4ApF zSNnZJzxDr5`mHbiwz}@I9&Qv>>%RXX{?3S$DJCk<6uRSf7KMx%hFI!eoMA0Xs@LVl zx06#`gI9l!9HJSl_bFO%@40j5E+>;WZ`pG0{Q28uDv7pJ31KX{5LAa%a%cU zaOfjMVU^BDhh=tBQLS-ua^kV-q_?rL$@f?)RB=_4&9PByWApt ze1@JR&Du0iTb(8U$rorXy?=XozTR^ysWsOkvelNT2mh2Zp=d&OJkVF(m17ou=kDE_ zH0`37kQcMEvR-yDN|8#(svSsaA8V+^6TzWLFFtETi2XJRzt2Z;cN5w76y&Q6n z5?;td&D}zp$Bww}Vyqgg8KgHeM3x~yOxWQgM}`l}VV`7qu6Pu4^YioXqNnFz?x#+{ z-5TO7LXiaC($dc3I&Iat8`A7wawhP^%!d^1BGtX&ycVQ~&@1<6&wLi!aq-fnfEsl_ zeVis`!PX~wtwn*!UrX;R7YDvJUgE?RK7*s3`tqO(uQY)HgujK0%tT=?p>Yu%_|BoYdJvBghva=4Bl zw9j1rWyjIBeeYNLBdwT)gyge9%S01{}jnzQTn;FW;-rk(8KQ=6I<9Ei5iHg14=3h?|$04U^fjkk3fmo9w?2v%bRwj;k@f;52wBtIolQ;36O)sV?rz)r0h0C0 zgoF!Nj zW+0i!?T+@K}XGcU!R1qET`Lt4N6ur<2|VpHJOa-m;JYdeGSu7$u_QM zybeWpSMNweYSzDK5 z@KBHhBjF$)A5Cj(>*mdy-$LUEK!s;#ST)&hp_=;Ba;;^N^t&uTfmX)sYx;@vJbr)C zcKiQV9seID9{>AT+l@OIDL|*=$`jOJa)eUe^6^PJz|X%A7+Bi-hc)2CEBno)-Ip?4 z=f?a2ZoXq$2=_9u{Z2OF(*IweTb^kKM zZQsT<=xaee)KuU;K0ck34#UmQ0me1AVh^1^uoaj{7+)zWo-FLbR0=oGu^1NHd$`6&w=s+ibH z++vkhFz4?hBYwe0M z*%Ta-KvV!B=U->@I0Oavql~|YNJ7QP7y!5ON2r=k8BXPHKV_HI+gi=0>oI@0)469m z#Atj{0?qyUUiSEm4RfK>I3?+4XR#m@yL&iK&tAS1|KSr_er^o=;c6(pqF4R!pldB9 zlZg4{<02xAICs2z!o<4wtR9g6WIfwF6a<)K2nr7Ng0uNubY(uU@p+Tm>eZNL-oCvy zMLlz^FAe9rr^0Rrn5}K}=hApQ*5NI4K0PH_ z9lAFr?l$T-oBj1#_t$NrJaFvT7RV?S=q_tWpvC1V^gdAEVHA+w_SOXN@q0vC^}s1d zA!4f++8^t$j|qg_O1c>yzE?7k(I4L|wEVkgtJHIrV7cO2bdm-WbFf42% z)h!sz&<5`O{_QNZvN&b!;GiO~U2j<6A6WodZZG1n2dz8G$yotQB-5mU8O9l-(|9M@ zKlwpmV3o`X=r2qj>Vqe1q*pI}_e%z~9PFVhMULA^JL%{iK#ui8B>^tOb%d4?E1hs} zX?bB>J=c666bnBvj&&r>Y?E8?oDQ*(k91PN1+>KGinAnD8&BmZaaq$q!+jz_4 zg?0m!xfb8dFFbciJ@@ClfNfYJ=Afv#|m4IYAe%nK9*R2cP{wOKBoK+nVsvOpC zC}r#=Ac?(%G-pqXY(pDrY$n_-4$bV%sJtYSuC6XY!%=97QsrM^JJl}-+PD?EBX9FH zxve{P5VC0qWjTkpT*eJ|cbkcB2~iSte|S^v-Rq5Q0Y1L7uC8vY)Wv`RVi%L${sts)CSFF0erRna z_=}IPZ#k?GhhV2&8mpU~EYnw|!l{uZemYGG*WX(mgy=%SI|W6H)%P0;#m6+jry{nX z+@_`^6?Q*5-mSPh=b=OI33xcPmN=Bk1AYDd2EaVYD2gX@Lf{26* z7Be^JK++@LIz*Z2WEnTONLhRE9S(QP`dlz6o>B1P_u^Ly?YEG=qoU?@x^5#bFOtt< zcfe;GjV~)1rLP&NIhtZlMB-c&SpQh7ny%vy%+-w>L0WcRySYjwh-I~O=TxHgWkR+h z_UrZQ*LPA8loT-1=l=b3va%FVfN{Z_FG+9G+hI3QCvo}m&VQy;=1Rl<9s62yR_#)p z;-F67;X{WG96Ge#G=~n<4Eh<*ewqK3RT-bcOW2RL?EzROU<%H*fAbW?_;)QWdm+qi zBt`u@=G7j*gf-Y7iaW^5y9dSHq&4fXq#x}qv=A`}JC8YmuJzh;wK**c#dgGxr2M~D4QEyh%eZ{Gy<1p(K zhCXr~JDc1WsyIxYf^L3MTKYj}7VdY)URp@BsDLdCLPw5BAwA?U{^_uKo0o(c`VgVb z#tzT?Y!JgWCg+)ddcxcI+E|{7>K`WCRV`-b6>!{_O0O>24mBMsu4i)nc@U8%uEI2a zG>HU0e$VAMvXOjp&?91Hl7xhXji!G#Jc@`ohT?iz;Js#9^ZME=|8=1!%aWMQs5zi2 z9XopTvsPG4O!~rF_Zv6fx3+4)$f`h21bm*f6N-qoi`|y6%tF{|erW@PgU3KzxJV8s`k-9!7oweC zl$8xhNI2TT-}dQ~92(^zcGZ-Jko)4qQXI_XGCs~Yv~l;T7<(FDv;g!5xU>V&cnEZW zdl#FMLV=HS)8|=AN=l_+CJ)~;xVdK>hIVtGI<;K{9!NdWgZ(AFV3gYb{JiGWwT}sD zm+$)|k%1K)dgA^3lM8V+u?crlQ?JX>OtsIy8k;ojgn62u0g)_~md7J9^pxM$e(ND@BHV-a@&9oNCb#r5Uy-tDBJ*+@EL*H7`TynJG; zX#7cg+Mg73gn|M2sR4AmPrVpdtN|X`Fxcu+|@eXMYxo1kMf0n8bhOt`;V&<+1i-L~6rs;1c*% zqjsIFoZKEL_8R%t&jB*zaK{mcP(dq6NR9>2%|hhv7(4ryK^pNVs_iFSZ5;_~yk_wJPdhIw8nW0A9iNEuwkrbhPXMRGaZ_0wq& zM(P>8+H>5ab7ft~tz8<5T9#DJe^%D+pySz$`$klA9UVr9iYGl5ofk)~JlBzgW}1|U zick2Qg!1nE>-!o;w-K%z(+yIE0z?Ri;4Wu8mxT~4n`UK*2H@3kpHYbtbfQev%z5|n zV(>}5x1`ui1W#zgPv};fr5E2rbv}6D0Ey_?4lC?Gzr5OU?bDOHfg*o4V<&l~r=M7! z2=t_Fq6T6ED}RBgSH4ZpMpoI!HxWMDkCR*h*84d@frYRxpfBDPb~1{75nVG6%ib$k zsiS~eM_Ks}fr?>eNP8<9@7cRIHX~yv@+i)b?n5c7o?m(6Oa)y^mBI5b7}^k-{sFoi zn%?;vH-v~Z1Qh4yvrP^y*q;Q>L4ssh2S+mBd4icxpp~?9ryb7D%sM&TmHuE%P5HjI zc3Ys(~m{cSv#9Bj`HT6kxw6U`jQ&*>*9q&rFKgyegd`oq8^;z_=Xu47W z_;uJ1#O?zMjcEMQbP?$Z@4&zvFJfcC^iu54P#WRB5VwhNH;D+&#+dN1FoWUdRP}5V zs^)avKTg2rdVNpJOKV7TlbRL|DuwGD;ETlG(Dlt0xO(E2}fvzu5@X3e`NpzA#EQ6 zKUXMz_D_ucmPw5jQtwHF_nYA)9HW2UgQy2%nohClW@KnX_BhcZxfIsY9Mo6Le(q9n#Nlq3-JFXDqY&NQdjHzQO?Fj_$*xh>(>p-NXRcnZB_^$RTSXo;n*cRf0N2`_BSDk*TX6qu zettgarTZKN7x-b{Asy{P`*Q$urnYuI7tUD~&(IK2SMY&s?8a`S16b3~Mhm;qz(kO2 zA$OKwyGAy!U&bL^3_Q99?=lVzl9`)(7l0)3E(a{S9kM}gfYoJHad1fA-7zX+jiQ_<3zoV30YDVt-`@S-s|MR5sC z-cK=^To^1p-|D^w#8!UX6fXveY~u{U5g?zRnCKprWKP@ZFJ!dJOkEQ!;1i%umSg!KFZ{zkBzt zWXl&y!=DYY-uSGjfZe_E%7%~if;t`-b~wX|Ll~C!kdF5bCO+4q2AI6KB)&D(Zr;uak;E*%#*aKEI!`QZ+gd~QfwRJ|>nRH49 z0p)K|I&7gIdQ&$tA3pPk>-yLPC$UxBW;tM)=-F$JPH(7Wt#3NclEjItcp=+i`LVvf z3Ww1eLA0ndHfu|fsSaQgwVZ76N07^;t3 ziYOe*i!KCzo1+Z}irc4MMJDe-K14iSr+6p8rrSIu{pH@?D&=t8Ht*iPzPq^YSQJFp zTDcC(#hDge_L+8R8TxtYH9?B#!2|=!lU?{7Cb~2z&&t%*-Tm&k_t1{clz2@Ew<0b9 z0Xk|{*|PxSP`>ZNLheR>=xdhIwvy#PW~d{L$46D@r{a*22hj(dev2v&o*;GQ3Ox~8 zg1$lQbFi&utyjn(iHL~gyUrwO8!%UKJB?jInL3xMigjKOcfqwv&eoP2c;W|&0kF_9 zrTCwfwAX7BmDxIy-yqs{Hn!m>In`mZ_aZ@)aq0;kb&q1-3pdJV1+Je`jZ+a2)c-R* zs9x;Ki((%L9{3&D=8XFv9)j+}+6L0x4$_9Aup9o=r``ucOsgP&?adQ{ZwehplcrlV zdhiM?q?g&*+0rx0i$~U;JufD9n3Gcuy!G(u(`xs2Fdau?h?#j80|O@!I_VVf-FqVJ z=g*&P70(^8I@szZzh7t%v4{bWQ&3yHLm?Huds*ONkcdVO$h+?O^XH_SP=7wcIRnXW z3DwQFK8RM6d?7`-7`DQ;MJRoe@P*fqAR1Pdt}Iy*sE~BCCisZq^5Xo@wj6fS0kp2E zfqE&>l8GPQOixl5zQ~JKq-eahcbG#qS=V!kmymi%XJBBYrFeU9ioX>70LMt(uOMq! zVYCrWig{ahP4AtgoQ`05kwp8=H2mhbc?~Nm;=~ScCjq&*jz{vE-9vR=M?!-J_^~>G z!+{g<9<0@RwM5FRlHt+)=<73T5g6QIP@Z4(PZMbQA12V?5V<5JLi#%rYlOek$!(Ff zfrOe;j^Pb&SfCxF#%8SJsUxn+Mbjg#)DUr$1pHh-=|dEjGD@?vx3eqH&@ad7xdT{0 z0%ZdYzNML(Yes=kLa(7uQVrZiC|28xnpA*>qN3;ti>Tj$^RO$SWf}$w-$Rb@IYRIG zo+~0C&m7HKtusE=e3a38#YmJ%GL@chc0)XFVtycook6mg8*Lr_`!1#%zt-%crbf2W zWRCC8+;|{(Woxm{S{ye@c)Q6T5PzdWYkY_K1pC?#^<6Z7`8$!t5+mK+w-H+RO1=P( z@;tI%o#c9WI6s$5;K;pv`SK@Yb_tw> zaghHXMBRdws=bTDduh*eAGGH{5k9XkfU<)z~z4TX*rh%Ch*$dUKYa-|!n5YV9`>s^VYa}<$wSXp+6o<#Ne{tgk1=e$e*xJb z(nC0%ZE+%@K0S3Wkswe)81x5*C4j}*3CIbA@*AFLC}o9Zc3|@{(T1NvEK=5kjfZ3V zWMpJUMV2pKggg6dZmtSCbG6nTvbdY?Npu46cD{7vW^@Rd3*%7f_kM=t{55t^)jQDU z&AC6)BqZ3M4jpViu`_W=`jfpi#0n5NxTK_nR>1x!_KZs3ALp0BmsKnCn=t?Xg+=Q z>Q#d=1;8}j!Gi~hEn{Xaiv4(Br;I}&=88n+2CLh$o;r(iTUMD>`U0Bh3lmOmaMuulM1|iOxqCo zB!GKdx%E-#TZJ#HAO9DOy9pTA-1}OhqoZTyQTl@#^|NP512fFtZ`b>dya4BhCCiI6XHWjwWJr8rehBxvYsCJUoWFV%(@M_xR6iAWBs-doRf>-|M*9U;SjO+}`B!>`^w z88FFW)r#*EnT*z#&z_wfmkufT=8DYvXA_={c{7l!10i=D&E5bJ4dLV`#oIM5U)G!4 z`V|et=GXUguk#MdX|LHvNhyi5n{4+b;VI<8jj|oh3&0vSeINFCP42N8zP>_1LD6d= z%$!8iRuC&IEJeu2Aia|5H;s&qdw%^WXQj?~kav)s)e!ao{U%8ouCk;m^z*xLF}%cw zfanNqT1R8=-n~dIuplr#o~wgT{uy2FZthK=kZ10*@hoFGpJyegA zF8dolecFx|!Q;BY?~B4in!uZ`Z<{QNaaL)C##0t8iXW`|H2;R1dF@SyYzNj0qUR!6?gI-)NT*suTNz9>;oMi9ytPC2G5v1K>jDq3 zBzh28cqkpM!uvHqK}Bg6#~@*G|v!cA+QI(KhD$UxGn_}_`i?Aos& zF#XTzMK5RSUAuPD)2Bp6FMhKs%^9>~W|nHiviLEHGL|k*ZVRC2zYVRF0IuM}=Ml;W zj=l+m-VI|-+I#4-`FyB@!;Bp?xwD9>eyp7Qr{v71QF%pBvw1pjPi^GzHUvx?a?I4g zgIOT2pnay>FOr|vT`ALq>p?I_@HTyzt+Z#X54?N#?jghlEj~0vbY2n(V-x?{IO%KyguoCZ-Uid+$T_Yi33Qdh;3*Dtbl8F{Ou( zANvp(7+<61GFVR(0Ni!0#VB*c!|Iz5PGDOu3{I-Y`Dg&tB8m-YF-2GdBDI!Cbk#d-}1FHRsVFXBh{<#In^1oS{{q`GX zUIVg3u|_G^H)XVoh8ZWGfcnQmNEVPlUO@KDw;$X^3`D*8GnC9%rEBs27BadQ;7D+U ztvi6G(o$TH*}cLPVv1t!A88?1TU*;hXU^m|I;_P!QMm z$V>2URd>r;wf>P24hUKaoGE>xH`2jCX%g7A&8LPcd|Wx1|+!*BoSvKk!Ql;uU8e*e;swYcvC zRJ0O=sf8L$M)-MHS_rl|e4Gi~Go0PD7fY(Gns(*-&LZB4NMgQ?boJ-w=c=K3;xj8= zHW#p|@4}r0TG7vql8$?a_CGx~5vdv9(GIJ6X!$fNb76RJFg27tHWgxPpF6ka3D5Nx z3vV!Y0sb zPxyjYB}SI91umH86iNp^A<~W?LfM0WXmKTLNkrVuIL1A<)4%0^^z&=As%oNYnwnd4 zG%Y?igKlJ4eB(3keAD{z$p9x!2)J3 zE-Dz&WHtLnvFGD@%#0aUlmvNSpOf{Q>9U0Dd;V(wuE*71nQ* zeRz3D(P`tWuSX$&fJ)@K6-PuwxQ?TR-hzNQ)Cs=Ih+HnuQD~s1QNkG6U5|R@TjJ#R8c^|a;8Ca*q?XP)Aqy+i+Ov#0`dA7MFZYSdC;}nEwC&pZ%dfZ z1xd+!)1%+i>K=ODA(5Dw}O}dJ37>4*@ze^y!brp1Q<8a7{ z*uTd5R6Xlp&kp&bq($)C#e+^Mov!YL2?Me65I?`hYP!cqMX>{KH@Xy+*=JlAMT|2? z@L4>mnfaI#t6g@acg13MVun zq)B_rI8YD~sHCa(_IAI3mNrc5l{u$EN;<}HoV;fBHFS_ZZ1QgrfDwe6wUG#II;To8 zx~w;>^!wq=nY3&5x~w*=U$6J>&KBZcp`ZAH50*hLC+-zwEBh%cKtOg}7x!vxHh zS8$Z!=3x}ha;zxWpeiw$-FT3QLlE-#N&U5i3G#Oy2X1aTI3*WkEaJ99^I^u(dDdW( zl6D$KGx8IOmDM$LvmV)xr0LJ}QBqP?g5VObI^0z%nrq(rVl@S#h+%M$X`<{R-4hFq z>@8DI0bc1Bn9T<0Ws)sR7)Jf|Gd8gKYW~%`5dQUXyj0Svo>Qj~P7aPNIBX7du2@W^ zNPC|{;GpA;3pF8N|5vytGIBqr1HEwrgy!1qkcxI4CWh1V9frfsQw4Jo5xQTHwbfR+ zJ-E7QECdS;6=jfZtTk;kR0qIIt(`NCTcONmkkE^ zNuD1|XBuTr{J@-`1ZZo801@rM9vY&|shj-u>+{ml=kco{q@*=iz*LRb8<909EeqH`m38CaaS0OX zi2PG=!i>NG{33X=%9+VF4A*XBa-XImQoT23$ZEXJY31@?kgrj0;jwI|MI3-YHfT}A zGd})3V1K3GKzN2VCgCuMlIASgA7)rT`stkDo zA=n;ZX>w}%lF~wBi6=}+XY=;|CD)$)FL5`tU50lxQ=`B@MAsLG zbywbjeE+IFQHsI8P0rA99AeV7i)e^kK8}?Q4mzPkVq9elY;XI#6>;&o#*!1I?N16v z_D!Lz|Ef6>^Bn;~F%J)slBHQK!k7!~l;S;)?OUx6BlJ9}8sZ*j*oFiD`Ur}DgBTIj zAZrH+4`s3T6VK21N8r5q>QdimN0Az-8j_%KW{U7?u2F%Z5p1Y<4pE0MMIDZ)%tXXA z9noWVLeh`?mZhd0W*`Eu2=U4|wRnS~fP2L9D=>8T_I}k~0JfqC(|Dj^`s2i2h6OD= z5{0?Q6skYG?ZiBD7>%0=4?Z6%O-jng;|>@->OskOjbRe7ukL>==rD8#XvWKteswtF zg=_E9TvrwB*@r<)P3= zed0pqfeN&}9H?iy&BlaR03N)LkGa9{0VlICOigQH>d?lkmR>NLG)+|9*N9 zrh15F_@d0Vhotx8-CcFW39`x_l2^x2_%jfgdxL>y@RmnNcxnO#&aeFdzxUG-!=&eFuI@_ezf4_&J5>0j9Sx zeObqMc?Mju_p8o2YyNVxPh#xB&EhXAdE`t_eR*cYO+LgMed*Kaj6Cz8=TU!Hxk z?^X2wnka6tena}6US<>C#IpCMN^H_W%Ko&+i*{aKTwb(6F)w*L3~xbGi0fgRliwXBc4wIKA;KE$P+4EIoS0FXPQ! zu5cbFzr-vzbs&EL;;3jZq` zJ;_a=2XS$oN}|vBRM-AB7v%EyT+oTX9tzcK)YZ0L=G7OMIKR^icm~Mi##DaqsmSq; zsV&VNw%^CY&R~gzW-Ow5#^zUF=jWyUQ(KTj&U`G(+Ausb`F7oo3xI55tXDKNjsYRj zc$FPMZO+0o1PJ1k8g=Q_Yxj{od-l|<+aYwowO9vD5Liu|Hw*{veqi9gs_sl@3Wb0b! zoO@YX+NJs`J6jnu4i$PQtHI?D!D|u_6jYhJ>*F(K(fPDTlDqVNb)Hjz7ZcRSbK;kE zb<;J|l9ILpgeD{>i&(|Y`6}Q8}Xo!AL~*Q!vj}Xdc-T@ z=L7@~9nish~Hzvf}r%=CSM zKdq#Mk@+@w!>6p0lkwCkU@OWhD#w~Jxz9$a44<0F#YjZV&N?EvyY8}l#z-*B_u2b! zw4Wa}oB^PTeevSFLJ2+|!XCMOkkAO*`1r!Qn}pl>nAeO3PhnX((;;$2Ol%#I53j70 zMB=?0){{+w6A*DlAw0wbLPG7=-O7ngSt#iIL@)7^P5A&lE|zC1^7V4c4gRWm!LqHB zOTt+}f_D9WLX*`j4;;$FF^F!22@huG+uydtk{;e9jlPP(1F9bM`T0>0&q?}{g=-1M zA1Vq_(k15m`>zo$g!b$ld=pi~(K+PgGovjep{=+dCD>TPes@HDCVtQbxNzUu0Zyu{Qj+q4CSa zsJ??6G5o)KcQweN5uV>-nTHW>71$9WL@?-5UQw{D>2))+;N09?g*-8IUq;+9O z^2a%=U^oi}4N6#L^8j!rqjpO%Ke11!CsybO_WoKYuVZ^ULe|8@D z(!qfjLfd6U#oLgx%FOv<3k&JM(KnEYMF#GmrK3~K<~*)L5`vie!cWD;g&(G(f|geD zQL7cdqTE~>LKVX`D(kK#gr56A@JKR!&aKmkB2qn&lx)!SNqM?N_LNOiODnqa%#D@y zGA9tMG0INonht@g?J+Fb{rL?at!{eupYbg9;*F=~AmO1GcN$E@t*uWYb()EU-Om|U ziHO2N0Ypd-B7Oq*0&M9#J^)D%gydv|ED|ru^gF2ljMtz5?cBY4eQ?bkD5yu<7(7U$ zwN(`r&-3%Y9_)nRd+_k#4X(wEC=9uL-gypq8VK0VVBoCChZY&(h%JaGgL z)j4QhjTS!W*h5rXr%m$I969`Tt@O`v4(&Z&Hy3}gqo?NBfd!&~)A?-2i$9J;{N3K^ z*P$}zl_Tnge;7EZf`Dl;#N;0;gz5OTre|BruCO} z`EhseRY0g^%GJsq#}%U|3}Qk&u4rD60?n8?&wpO(4pIG`_W$3yz<+2VrOWbTL}m~U zr{}$2sdLzD3xey>CeGT~y+$FO7xd#wFD~v#Us^a^hKT)Msvx8~J?-T$;k|zo->Jxj zGl)iEJ3FGmkIACa@&Yq;y8uDCO(dtnFVCMJoChB#BBV}*X13?kTV!xHe%cFo62r4> z$93KujgF39rtC?hf=dXW7!zO4RSUB+MA}>2{zQ)qF^BT6Juc{zy5}Y{^Y%B~Tnks&hvDh_SbpDfVX6cZD0!zjAQ@1n3AQvD9 zc~5*e=Unt9;{{rZjS*ai_lTfiV^^0IyB$m$A~AXA&YcVP_StVHKd>8QstZ{fA94?@ zRF763nR5e#gvHE)(VT2d1&U2M7ns)X&D=+^5$!G<<=DGNxYQTwKO7qg#(9k1jB_Cjn_6B+`#uB40+$T?-WHlHb91H@Yl)+*Xg0qKzO$)X? zE97Q0$VY;ma~(XL#D(eVj%SplrCq{vNtSj}b(}gYG6NyL`~H!q)`g?^?^{gI-Ua$1 z#y;_R9*olXZh(nLxJ(917>#&{DM`p0MDrt}Sa?Fu8q!WGjHs}nH3~%6#pZg)P?|0+ z0tyg9{q8=s6m|WDIV7ug!qc9eomB`7me$t$85tQ0c|DfVKdNeU z^z{!C#~#mZL?(Rq-o4+368ycAT~$$c%ixKegw_M8-w@`NWeY>i<8^P55+R0N_0b%1 z9WYX~!DBj>=^zIO#mb!LiZ|2pFYn*Tk?*!BXp>JZ9II?@X!v0*+f?U7a>ghN)&Bjy z;Cd(6eM!SY-pSL(GxQeR&mLF?t@w!6BzUjBcTTx&F( zXC8m0S(2+JmJdlH*zQx(!SF`0x-sIxs??8 ziXMq=0x)RRFE(xlbUM#$VvSZ)S5HC@`Dt~v0KE(OFM1RwXE~NR? z{+I}tD2X%0(HsImxQ8Io5r}l!{Q`b#Xd8UtE2*PxszjNM@FP)lEJgu_hrOAB9;k6* zzv5V=M?KiSfzShL=>2G13gAb%<-tKg?X0FvS9}(I&DDX%_7~Q4iAze3wS{6_P3rai z$$95#y<{5KZz-2>IO_OYA_0=Z2_#3@2XuFJwIh*fs%il=2BYk1a4^X&CJ41uHkEHu z0)_DxYc~{v+@GU5C=gKh!xK{FIz{FolIxnyn(#hv^20M`AFoa;Dk}B>!o-(p;1!O% zIMZRiZ34#vZ7xz&J~?ly&umaL6HZGYip3*ZMJEMDzCF~@YRyN@T5q(avG|AI-Q<+0&*9(w2auK zec4%$|N7_Hl~<>*J~cyLNr<*R&};^c?l2%d#YABV;VI~a{Jz;g9>)0*A)6k?PcnJC zhnoNagHUhL8=wO0OWd?KPoh_<&`2vYx~1#=gXUJ~io2?HL(R0lWs>X#MyS-x-Mn$5UgyfrEg$x%CJ_tnG)~b2*Alg*CWFpo z=3kOLwijFsXf-DhAuv7x-ZfooP{EOrVX2Xo?oA7!iA4h!pqR(BAm#i`t^(+b%$p^*KSby)8kUu>@4JwHq$3VuYcc+pRx+1FU9FTRyVdip z`PTS;Kr*aDr4&h&^Oc9UU;jl61pem_TCj_qN5Eeo^>>`cH@X{@KxG<11C~pMpDN_b1-{FTd4bPxmlUnmegVk zBQWXmd{{3O&qnkP;M)B?!i^WMW2LPft*>sVAHMddAi|WrW!kusw@45^FLS>HM?vdH z#;pa^H=WzR9t;B}ujfz~`Nr(Mo0pfN z4iz?{i@(pua~;$ZfU_RQ`m87DeEITPl)-$EYi(35cNCyEE>Sy>$-qlmFfX8>3dtSB zBF=Gh*2b0PL4!{MEKp#Fn>bc*-9b}NucF@KE#jB;4s)H2$h8>nfuW&PjIVn_&K_Nb zZl3(TfXBO3-N@rDj1D!ccyltgBzjCYwEi8ZoXsEGnXkzUHUO z@XF@WSVli~<&{SDo8A!@d@J8MEn1AF6P-TI8T2gK7h>ftcqQVL$2Dtb`fVt(q@^Nr<^u*pq^i$54b0uPbnWqdD zSq}nlZqp4?yoShvu{_pDubvKhsGn6~rA$XbJH17J<3~GEK3U@O>%J3JEjZn~yA`Qs zMb^v>@cAAPzYQWYxi3dFFxS9wUll4TDTP8NM!HWBRND%A?DtL5duL-#VxPEN?LEqv^-mIv7B~*PIJ?nHOA@)G^{>?x)w)>RvhiSl=|H z+1nf~0L92&^nv|k*V@20;)0=_BX^|JTf9zy%U23N~@^z({DtAo+8sIIB zk)TJ8!>aM#dz!(+Vl09X2#}*WcX7r4&?%jLmsaqD{n!)b7*=r42Bq2th`1BJS%Zl^N#D4>~K-L-n diff --git a/img/dev/en-p2p-data-messages.svg b/img/dev/en-p2p-data-messages.svg index 73699941..38ba1556 100644 --- a/img/dev/en-p2p-data-messages.svg +++ b/img/dev/en-p2p-data-messages.svg @@ -4,128 +4,142 @@ - - + + %3 - + Overview Of P2P Protocol Data Request And Reply Messages + +getmnlistd + +getmnlistd + + +mnlistdiff + +mnlistdiff + + +getmnlistd->mnlistdiff + + -getblocktxn - -getblocktxn +getblocktxn + +getblocktxn -blocktxn - -blocktxn +blocktxn + +blocktxn -getblocktxn->blocktxn - +getblocktxn->blocktxn + -getblocks - -getblocks +getblocks + +getblocks -inv - -inv +inv + +inv -getblocks->inv - +getblocks->inv + -getdata - -getdata +getdata + +getdata -inv->getdata - +inv->getdata + -mempool - -mempool +mempool + +mempool -mempool->inv - +mempool->inv + -tx - -tx +tx + +tx -getdata->tx - +getdata->tx + -block - -block +block + +block -getdata->block - +getdata->block + -merkleblock - -merkleblock +merkleblock + +merkleblock -getdata->merkleblock - +getdata->merkleblock + -notfound - -notfound +notfound + +notfound -getdata->notfound - +getdata->notfound + -getheaders - -getheaders +getheaders + +getheaders -headers - -headers +headers + +headers -getheaders->headers - +getheaders->headers + -label1 -Request For Help -Getting Up To Date +label1 +Request For Help +Getting Up To Date -label2 -Reply With -Inventory +label2 +Reply With +Inventory -label3 -Request For Specific Data +label3 +Request For Specific Data -label4 -Reply With -Requested Data +label4 +Reply With +Requested Data