From edf2e15ef23f42a4d02d275eff5991ebc6797c4f Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 6 Nov 2024 14:33:59 -0500 Subject: [PATCH 01/14] docs: update wallet screenshots (#414) * docs: update some core screenshots * docs: update wallet creation screenshot * docs: update description for core options main tab * docs: update core options screen descriptions * docs: update description for wallet repair tab --- .../dashcore/img/linux/dash-name-wallet.png | Bin 25948 -> 31440 bytes .../wallets/dashcore/img/options-main.png | Bin 34437 -> 40537 bytes .../wallets/dashcore/img/options-network.png | Bin 35969 -> 42666 bytes .../wallets/dashcore/img/options-wallet.png | Bin 26494 -> 35358 bytes .../dashcore/img/tools-information.png | Bin 76943 -> 84479 bytes .../user/wallets/dashcore/img/tools-peers.png | Bin 83031 -> 163118 bytes .../dashcore/img/tools-wallet-repair.png | Bin 78653 -> 49006 bytes docs/user/wallets/dashcore/interface.rst | 41 ++++++++++-------- 8 files changed, 22 insertions(+), 19 deletions(-) diff --git a/docs/user/wallets/dashcore/img/linux/dash-name-wallet.png b/docs/user/wallets/dashcore/img/linux/dash-name-wallet.png index 9f94157feb67ce9917c9e77d7da76814a92b66cb..308e4ce8da3ad8f0eda475ba02bcb38b04842309 100644 GIT binary patch literal 31440 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 literal 25948 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%0AYg4v{WOO^ETVki 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 ZADmp$h&L7nPGf0k^llsJU~bt({5uy<^f>?k literal 34437 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 snbW^SRLtOFAG<56V*s@y4%e*Elz0m@h3v;Y7A diff --git a/docs/user/wallets/dashcore/img/options-network.png b/docs/user/wallets/dashcore/img/options-network.png index e1fffa7963abff813e5c08d504e234bbd8ee0d5b..6b1097c37ad5289d7e8b079af23e178c2d56d155 100644 GIT binary patch literal 42666 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 literal 35969 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ξ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 aGA?1IGVLCHlz>k`sb1H(R-kD1;C}&9e2|v_ diff --git a/docs/user/wallets/dashcore/img/options-wallet.png b/docs/user/wallets/dashcore/img/options-wallet.png index b9826abd8dac094dbdab07c0e3610054fa1cdee3..b8b2145b1fc5069a1c1042fb77142549f9f532fe 100644 GIT binary patch literal 35358 zcmd42Ra9I}@GlA>KyY^pZo%DyyEDN(xa;5~xVyW%26wmMIyk`xcehLOo&UKn_wlZ? z&VHD^_Uzi#)z#fqzv`+ERZ@^dg2#u4fPg@fmJ(BefcQ`k0RegP3FiGDu=XP}{@351!gos9{Dld+?TiLH~lo%0z~m*6`Q!(Sp% zM-xM53p?A-Y8Eyo5b7r1KQnWFRRcN{y>ZR2{!Aa z)DKh<^iPl(N*{75DV%G1n(yc|bsIhG+Lk%5+G9+rzgM=i!g%h!?YHjDSOOo9$6oic zJWrJ&5=9dnUKOryG<+qyh>v_p15iaip=n(^yn==v_@+U|F9U9W&cNMxG*eMGZ(@BX zZqjHz{I)j!nc;0!eSTf*-tkT;F^nu7KA^(^voakt*>2 z^xG4YF@XwPn$C{oKpHsXU{(|HtcT=Ww5@Pp8?^Fs)Bp6Blu#c7sa_Jks>k(p`xd1k z%s0{Bptr&!;Ei$){_lG^y=>Ez`N4bN_6J<$U4x3px}PFP8rA-AEfE*XZ)af8yJ!KZ zTm4+qkH5A9)lKG}n0=ZBG&WqF;Z9=xjx~IT;2R|gEMKI%vHntW*AkWna4s^Jv$8HC z2W!45$^LjnNx!v+v&ms5py`f!-GJ$bQ2v2e0|7ILTp!_qLec(DjDWJ~!usvCPkT^0 zKM25(tq`!mzjA$>i3FlH4LmhUkTA`m0vD$ZIX?_*G}~`(@tw6_m0#^oPBv&&n)>(T z(1m?h`==O(kgB75FTwEx=T=aauC_Nw7ueD4da^wKRbXl|S7mwAmb?8ic&SgMs8=cU zFjmG`5(x9zX(EHito`yg{f4ZJOxTqhzgveMyS(TuyR&zDQQzP3BkdoNP{vdPhywr- z6693zp?iCKr{PSU_dn&+Ila4;YHnCCb)Z}x!Cf%Oi8C++-xaa+bYakBKoEp>2)WwGW9a0}TTs{`PjoP935n;!P>AkLD}x zPpC@6IV&jU-AJx=xAXd0h4e#vZi?>zcqob~V_I_((5qLix~#kJzo62Xl@u&=)w?>6 zoP?ljVf>UeMaq9Q6}p}h73u`%g=6y&Morq%{+nz41$!56!=t0Ja#B)KK1Y>Jjcm@d z8cJLyv_BHbgEgU0S?t!^nW{Bvx02CK|NEl2$F#22?P6=C$!6sierjkqZkgo>M2E=H z!tpJIh{!y=th_usDk4HI!4l@bDKncx1HZPm#_;g)pzh>0?>{|{%Knw$2=Y@tNlea% zTk&vghN$rHcxL*43YIwc=-|#&czk@6a8@YBs0Q)nIvlhrh=_>HJU?9Fu>AVN@dv6s zNSoo4+PFb8RzQC+iO+rT!NGy_kU{EyB2xUh@i;g;6T;OAPPZdE4bo;kcjL!Jgi!+^ zS+)yiM_*rGr{L(hZ9*CRxFD$=J=c&-o{BonGo8%JyphJ%__ti-kXx(Rn3=!Y+1V*k z*639yudnODz`*#~l3JavwrC;>1aeM^b|MS9yH?P_8V9a0m(N>fcRT(!B+^nKm&d0k zhZY?S;)Pwu>5UB%wGt!*ggUlgRKne3yw9W&`Z89WxQIb;lMR1oRX~awAu=p+^nOY3 zog4qhS)-(Bb9PqNsVGg}aQz%4HD12wWiVIFKT>WuBv9x}fexcOGXU$E4V=Q|zo{;Q z@YDaehvG{m!Mg!5NNY>pTjpJsAlc7sbK9c^oi`A?M!zj69xLd-ugvL>bei+*41bt^ z3i7GYp8P!KA&X{pts#o_7=mwj9cUBz#9{%C@(}bnF3O09ubm!tb06d!vH1lYc9f-+6iDR3DKov6)Z)Ns|$ z4<{)H>Yqrdpej9~qBkxe?9QBsEUyM;gb=r`KW2reKK#RDHcM1prKX{Gh++cM?{EMh}X!kr4xzc1M$)2C&pWT33y3 zUl7txMNJe12WldJT&{(|rC)@9x4^Sc8h1M+?q=Bt14)znT^C5NX12TwuUZT3_qd8x zCB=I;LYHG>u+0`lNM0`OFTurbz%w5$UJnOLQzO=*TCi-g!-&Pw;&XJ=y3FfqX7xF+ zoBf8DxaBCE!rY|2;Th{2B315~&M=2+M2<`C)lJvcb2>q(HPBd|&S*24aX-unK3Jr_ zI;!dQoZ{@%rl6x3C78fEH1JFFAIl_f#=CBI?|Pd@SYPj3DA(h&9;?vLf;KGbZ`Vg- z;R&LRs9TFy4_=T$1dOS=onAZ;68RSfDMZN47)1M!+Y6aQrz6~lkr!#_=prF8#lY&# z6BhyVu)qWL)iIZ1YUKG+`0U?28_$qy4MKY)95xjmK>ATr#=)W{l|~=FL8&>WYnf@neJ$6)Wk_PZ+r9#}P~H5vK6lg!pxb1ge!hZS_Rz&Uz4Or#iv zNsJM3PQz%pJDCe*0IJc4C}*L0uu_}#(yzX<&vMQgggog{&9sOTLEqr&MM9)UK=sj7 z)yP4JGP2u}>z@te@|`94;dxJsUh1DVhH@w_AF^LkyZCRof%*x-(j*3xqi;rSZ}J8~ za*WL{z~|SyuKnDzOod}y^~L(A#OJHZ7q>*WB(FD=FK;WV{MV71Vl@70uTNNV{#(Vp*!K4f70owL&s=WeSNeby_PHHr6-0QO zb#LpH^`1ZrxL_HJj!5f`rKl)B9?Ho3%@q_0WjU${-W)6QH00ms!YcbA>XT8I=9a9) zG#>K}xfM3Fdu45BRND>e?k^qk3Ds^{mmCDmJ8wP%g%8{72JaqO(xlzY`r#c2@YeOs zqkNdpN7`!972chlrmTO3iY5+46$#+ya3wXHfRmipJ@z<-%z7*dLk^DbTwq;)xPofe z*%ntf)^r<`s~``W!?mm&lzn=HI0&(W}69D_HvnL7jKK&65BzF|v@Gk%^d z$hooEd}*+8yO?RdB)`3P#?(fBun-nZm|l^rj_XTRU+abP?Tj9Uj|5loF4)-+I<<;? zx{ywlGX`1Aut(k;f$HAp8Cs9aNF3!C?Z$|A7Y}V6&N;>X5&_`#T-^UDV=nAhfojC6 zlBaojL$IXvgi4=2>i*J0a`hN8IbPsQ`l8b(qv1qdp*fE z3S<6|fT^k3(2@*5@rl=+rqVGic3QDZW-*!DnQvBYxj%lZ+3!NC@Bpt^d#nZkyF+0S zTJ)P^T3kPe>@&HQ>+P9!xnY>;pkHt@RX%y;EK13Q#X>cqZmAlwiGJ7r8e#>kF%>;f5c^`Cwd+^Wu+ z_7m$5&rIqL&KFB*H;IHOMvt53H#ObW+(9+4@vWP2rZc2S!?dG~z4=0in9(dooyz&F zRWvp>3c;`e{yNTf0=N4#{W>G&P=r%=w-O@FcNZ6mgoyaZG16z^u0J3!5E{!I10B5+ z&Ki>6Cllz51I~qW^ke#mHjs_$mi$Ve@MEUU`z;%YTZU>QQ?;RzQDjU0p;**>nlKSJ zH*V~3lit3dz(BP3OU_BxSb=v6)>xMh;ra*kdutE4`xk3nUH!o5JFjfHRp<$?FT+?+9;i9&Oh>o|B#VL#HcwtIv!pq=xAX3;?LCsvf#uw zWlTgED604ab3f}EOz!r8Z+?~kA%qw>&K{R95yKUhKTs&%z0|w>AsFK+?k?@=z5n_W zz`ZG*^PkwH@@XgN|Jum?Y`~d_uJsQSqs>HNninQ~`v-6c?Y2#4a#qwAJH4N%v$6gW zkVe(!K%KO^BM6Q^{A(0-t3-YIv|0(}3JfW~a!H5ax~z9Of=IoyQl zH&~wH&cT~!pb6A%J3ErytMa&!h29MlJ(1x&gyP@btxJ|s8Fy*c&%Bp&>q?( zXxW{{7VA`%K0 z*gP@yb%F9XWLfkl25ZckuiavkETj+1g;S-h@$Y~YEJ2;)Lo1`DC5y7+CY19WH|&kB zGiNLY(VvEno2m)d1f2`q!G%WiZO8UhaabhS*R}R4Q*E?w=ei3gwi4146cdgr4Bo?! z^VP2#zCTRA5>)d^`{Y4lMo5_3Sq=zny$EZi@hU|OhMp~!!C8rM8wQcz(LLjhOpJ=0 zR1~$!3SBq01(m(fVT(cm8vKLTK~JTnwh|-5XXjSvAiwmBUW(YHzHlfIFEYJ$&yH$?N)pGY$5ovB#_hCG+ETmP8ti z^OUEB<)LWjN&IL5KOAwoh?o&s)q;eU?m>Ze(E2>Aw)r7EIq9^R?A1p}3x&e((uXYB zvm=V6{9M`JUl__Pb-fq`5g|4@Wi02>u_wyDOPUa^Ll21RD=8uYT<|YsFGG?r4i%%< zW#=1p>q`&D^weY=7jqLc<6=ei)Y&>PxQ$9KR5gF?sHRNTW&}Lt8AVYp%*cBK$a$P* zY6;Kq9zQzE^Oe$d)9!uR!ieW~^T~>pwKc^%0;&Jf#NGKEDT*_>xwP)dG+oO*Tqw9NZ{58L2tad}Z%R{cZ9w;j{9;Q4xsfr648 z4uJB>Cvs{bZ!njlmC2}8_2v3P$FbE>k4*@b&10#K*8xr{zCdiIPQKM-di(XEjO!e5 zi*qQR>nvR7c3xGgiN=lVCH7395iJ_o_jRG+8IO5Se{fBRCpiF>{}XX&bw|>p9+Y(9 z0D12*DzuXv{6+9%QFU&F007Au$xZ1?Y`+;M3y09pP2q+;`SuQR3IMml_$4gU*?g+@RA>&WWMqur z6Q)!COw~4XRFg8a6OPVF9vOedIPj3H}m3lEb@3ra8W+8Lyx*Ajhu3YkGn6weTp&|WGh9o_#4JfXEv`DIAO zgQ`yD*_BwIk59cSpUoRi79n5Z_z*!0CsH0c0!~~`c5!HkFU|armg4sr7kSAI@Xymq z7Js<49Romqjhll_nHE|uJxx48zYHJP<)7m?*t2aq;ygCKdu(+!gdr4Ow@WjpSHzOJambEc(WrR=WPYMCxy9r z8HYv4kGi~rHTFic;VH^7_J8_E<$=0*yA9*ceEc+q(-bC(h1}FZllQ$AU#S5(;*nI8 zJQ0sYraE|<8rSdkthJU(ky6EiWWEj|m_DMQ-C{>m?$1GfVWXeCwwi)w3YYC#=g(!` z0f`QW6E$)%35E#>8DxsC`!$V8n>ksHyI2?(Q{X2VcX?$O| z5CC($E-J@U+N$E^aRZu5u&yc{!3*oSGD5yQ`w}Zku=tCQr(N#Xic~&6qx;fubhC%t zu0o@B#ILx0$5$;|&(_D@p6+M6#qK$i{YY9uMjye!DbqKj8eh!EmYf>JF z7iO>uASz1oXgAsz0{aifWbmG9N>Ju%EM9D3@*HW?h!j)W{L?x-HM*3Ir+c3rj<6L@ zy_I`15+sXWj1SAShO-h`_fWzG7l#`;w9OGlbL=J1Hesl304CO&XC|j{coZ5lDJ@e2 zgAE*uGD%99$vL zz0p0G#00-oOmPukW9VJ&g+D4uDrsKeHV&nx@W+VKF&%!4x*|iR+!f!!4qY`H9mPWG zNKJ&|Snh)(zA`b&e&Z^OoHli+6|h~&#Gh9i>ndW3mYRe-8n)IIVLLM+!EAlIPVC=z zWthoXgK}*Wz>{x{*6Tlh*~0}IXPqCp5h)~q<>1+@H4yP9s=U=swW24z@F_#7FsK3hVP~KPPcMlrCD~Xn+I~N%VE-b6`jiRhH;KoHf2$V5YXXB%tU2vXM~ANv zoP0hfqGE$B*9^9(FggpW#7&-{T&q?RIjb^gs{LVcHSt;G#B3u<{&>}r(o&i<7Cz@r zwatQ~&69k1j479RF8ujchs~2^`>E0JMgV(wly>UYug-@*+x4Ec`Oun2oyf zwgX>ZB34v@`VAyDYCwgjg(1Jj8CNV}uaN~X8es^%@g&c>#|?bNa$&#SRl&tGzd8Ub zyT98_q(n7MR@$+${k}(2kK#f38D?ipOadPFQt(@4f$O;r`uI~xmFlowN)+vqaHBhA z;*B6Smem|!KA$>E`1G8Y3)B8|9@>YT-qbQnW_D80z`Kv5OzJrm5@f!V@Aj z`PJ^YU=+$VKE8^P+K{Do5pyc@sdQOL>N;VTW*qM^Hat39!lB9l2oP|WhDIFEi!z5ji;V`Xg4Wlqt!1g4cpPIFybP=+CZMcH0@3M0!~Bstj@xhKovuk z#fX$gAXGs6ZgxkGdbA9}R*N9*Vh}Udl5e^xI(lNz6h=O@pg&zH;{BIkabZ;olz?j_ z`TYH3(<{3t=PUwx4c%8UeAQytsm9ze@0ZdYNwDwA+N7Lvvj3QbAz z_(Fn1^3!hq-Rm_=jb65GD$3{NP$Y9>{0Ln2V?P8nPVLcro~im{Q<{_4C%51SEf-Fp z*DIzH6b$50QC^dE>nR-@iN?jZ^CEP$!6H!yO{MZ=He=+#^h;x#3x~>)E@_DxhsSg4 zV+h=07D>`D^G@Y$T9=#J&HL~^W;A!;zi)NWVFx2aLRI=P@GhTSmii6g!!Y775-Eht zreOHV7}+AnW}T>=T(K~znN~ilGk%L zMlyNg0|OtXoRP-O$bRYifBsOp-j)2zTgiSt1FdH;PRPHvCc31`C8wAu3HjrXw(u&* zz{PfoE{}A&&5@A+^>4FF`LVIM1_U%zdB(jju2AIP%F(j>0&$R0>K`F=b#3J?X!{?C zDiLdGDT3yw7nXvvFiYmc;*Is|3-;obTY{Dkzx|TglJqIz1B0E7!m=g&d@m|_eg>Fl zuB{1xHGiHttLJZpd?PqGzKyjxEvn;+X!cX9zh!W~H7}3^PA{2#<^_U34uEFGqlv{0 z<4&fyvFJxerjOUx#G7z>BO%}y7IRU(aDlKUM|V?srffhTGzaS6H)E4he+UvWtz*$> zp6HkKkW-~E`o)%z?M6gG$ru;TD%5Jx3CxC8rlhm8M8-7oZ*OaS&-4zpT5;{&FAjLY zydFCc{=5P7269r=1MOKa^2n@CCp1;2w@nBAin5yl)o@!!Ikf|Uv@DTsT z$g{g(VH{--`f2&XFEn#M6R5F>4Pg`>=hv-3ZJvIXe?Ay zv{3!mjKrq3mR>H1*=?RZ$pL-C)tP>*&i34c;pm5mn$X_~gz{R;kR)}mB5PZA#AtIC zM<(QR3d@3CZE*lLbej97B+tJ*tlkFteBE&Rdc&Ka{k+i0zu$=+whdlndn?WnbezF`c&GM@iD}}@46!?M zrE=SLad;(?9Cp?PiE`S15SJRgFM_3C?7rmWxCduJxCvcUOO0KtesFz4u-$p8Qd}8T zfE^}#$Ug}0sstSnKM>LTnYh~LTz$wK|7l+mSUA{ zL53I)|I$FPI8#bQ$Hmnjn`LRN-{-Ycysg-ftK$gn#TyXQ zl*h&7id+j6BaKpypatl4^LahZ_3CSS(N`d6(ucz!^< z$K!kWzyOa%OS@Qht0IZ1D$_S~&oXylXPdW?HjsC~1AA5hf?XLBx(|m_?sXiN_4ic= zs7wRG(>hYvvA$CBaKVm-!PC*N9nY$AQv==jEZA+A#8g-Do_ES7W7%|?I<2@QhYiV# zZ5oUL<73S`W?l_$*Bq|UvTDcQX}b~P`~(=WWdYerw1|OGAd2DEN#)6)&P8M|*XZ zkD{#}#$x@vor*4D9g%n$rLfGP+f2?D%85H=MDD=pG9`>d?8(Xk8`gtFg+ZsVYD?5L z=y1_201ktTzZlk*4W;|;szRWBS7DrP!ooIdO+CW70Jg9isuV*b!UDrf;ySdjg^tc& zAl=TaYxHDYj$5Pf`9EkbC6d^cO-Pd94cnH+ zT}OML0Jh1VJ1isny}MBPBLRNc{XWIBcW{nD3u|Im2JG$#VIzc{bGdhpi>3&EBi2E- zIJVuKgZnV?aDYfspdl@7@QY4aiee1eBSy|bpP3?@A~`jAYQdO}%HS6&&@?*|qC{7J z^|qzeCNBE}O;9P^&aT8}rQRqkmiPA^6B28?>6lc>K?6#9b-*V4Bqh^J*k&Y0 z*Vo8bdOv<0TALSZQ-yUxWO2=`+WV#hD+B`DS>)>Yz0Z6FoeV4>kn6O@zPC@(^|mG#f zq1@nt1=i@~bq!|u&wFrr>mj#f#RohX`O;tc~EHRsu@e=awT~KTs zvF{enx!a1l^_78iYL8!FxF#6Hkdo%NG%u$byb&#_bfh>mzaW>qVNkVT+Inqolqdhb z?z5TA%<=IhB7CSrAHUMuKw+$DtC4LRvGAsug9+PuTtuDuSu9C(JLqneN6~GYBHeI@ zFPzbnrapwdM=?&)D2x6wZaRc}%P({F1*{yjh>B($E9I?J@*Qm${y!ty3FXdgjMRNu z_jd^`Z^hvzNttQ`eNPsc6L;cGxY^|n6GV>Be8yI^_Z*fg%n3a=HcPq6sTwWjFcrG) zofn>8tDpBSs3vq{BrB%H?L478f%UQ8OB`Q9)s^B^q-Qovwto{9$VK*>M^ZBII69tk z%TTx%&Vu#2;u*>xrN`yS8GHQ>U1nw%x?iz}HRI&k(S=QYSZ}m}zbuNA+rJZNDGGSf zd)AsTQ0!{x{N#78jA+jAG9m!hdB=y+^1x~E6U`-ow!*SRYbWHnaz%oY(pH+(5O4E4&dw;&SpS{5L4hK$4S623!}S>J?#qGd85i%w`+B zv5X|_KQi$WR}&oU_^Q%j$U~MvJri2DH>n{bSA4aq5r}ivM#(B)!*uhDZBgc<>>Xv% zhXif$j6=icO3Es8`KXdGRD=C8gi&6$jEgd6LN0b z6ywB^Xn4BP8twPFqlf&sj!t$o5I%8LAf|PahSIK`^QBcToD?x8S8ASPegG(FY+R=&6sVzV4=pPYBs)Zp2`;APoY|TJXiR~Q# z$}g;`$9My{pfi4283aLkL!O5M0!|f^5mKgkJ1({Ok@3d9PRN-{C&^W3RL*U5+xByd ztcRx)uRA8HJT^1O+j)J`;~q2W8XHV&Ri^DBA-SD--^xGP(J$eU0ujUa&hRpdlzdy= z)&*HT>Rn3XPG_$_^}Du&$J?A|8buLuB)+rVC44$8FI(EENiGs*!u=93L=h{*lwAQO zj%irRrkRsmTl_17;VEc2SAIBM(&5!j-W6IB#I7_aN;;C&m+=7a`MYeXt_8muUqVfV zE;)Xe2%K!8b8PJ4rOYAFrvCuI9Jmw`Axmo2OeDjRv|74! zotRi>*gzmJZMtW_QoM(2)CX85Wa&q)w&zG&G*5h7_+(`KTrHd?mC_osRHS=cxh|7W zAa~2nYBp{tb163IEZ47)I%&Ou&uOO@ZMgoSs6Xo*)a0Lcr&ebo%8_HhtXU%=7SC=% zyp$@v2zB}u{ucbH{!#1qVPx?E=7 zubO2>)NS>cL$|C89qPzbe60&_M9+^@Ek3vTK+AV97Osh?0zf{YW@qN*e;Vn ztO=8+75$>#i3nRtZO~9mOxAD1@gx#z_?W*HP-k*JnP@5VD=Tl{i!|x?im6`FzCqy9 z-k8}zoL?o{AIE8uYKFq;jj~8ctvfgTR0Wqr3Rek3z85n#fzH4 zNHU#bcHr>vxgDf71k<03qxRRe0;b%TN#9q2O~cOnfh(av9<-re7m%)JzfYFi*2tuR zLVxY9aZX3-Z4^w|3Om_l+@QDH$cQ!B5Iav&CO6fiwsW2h--ZE+_lxcvpgxCU96m4W zER=Nd#wV}Rj>REfaO!umvtw)xuk?ZKGF{`Z;z=1f3EJ69g=cCMA|^*U1o_;KHFggx z&YB`qR3|kmwy;4Ty0uW6dQe-+r&7ny|8iXlQa#^zVzlZ0J&67PkOIs89p6hva`wtD zK`#iculwY`Er38K#l+}!?l$T7o?W{Lz0o7_9vh;i{GXJZHyvetw!|fNcHB`m|GLv> zzw7>sEXen4-PT9S|4sCNXWs7rL#n}T4#Q~0{U{{=cCGE6@&n1^jS@O9+R^?sgo+fT z>>kAbm7BC*{cvK}*y`pO9sY#9!YwfVDFVk5OVIM#{wPhjHv%3wj`CDts`@Vln(-$} zJIC9!I$eLF$zdMTN$Evj*}Nyerz2hWew<5x?|D7rWX9j&7X3w$P!@yH7{DL-uj&^8B|QLcgXx175F*8wG$UO=~{Xz_$k| zt*G-gqICcHt~WtN>nq28lfP+UkuisI$8*i;w2kcpU)P%Rq_?5e5z{Fc^Qx0xSN0`0 zw~Tl3-nMZ~GvcCcDkeFI0GZ&A&X4qhTTqfP#qyDR=eZpCT;6h%?RFR8Ooc@0Y-k;#fP^Wm{%NJ9sEQ3hj=26WK(x`A>Z;U$s@?5q~40p}< zv~Wm1^8r-l`i5vWY1n-Ul=Rnz_zWx9?zR)A)nAspU5~dSUw$+l+pXS8zz99P9xOtx z0fyS5-_kme)~?H!GMvU6GE%4e`KoOTjI)0Zoo@J1KCoAHtd7YFd0}kNd?XxyNh#Lt z1+>fq+9XuU88FsRqko2|Fg7D58?Di7P^o*_AqLcxlT5d=isk)Q&B%D*H-f2(e z)?$+#en*pXLZ~_}%OL*o%jk3q&ez0^1RVQ`$mAH%Im~2xeG*l2lwzdGULeTP!2+@D zw7_W%zva#cydcE{$@ag%5{X64s8hxLe`<$bWuFjCq z>n+Lc^Zr0GcII`zif#{xP!B*A;&knr0x zjqh*t?LtFUc!7~Q2bezRRU=6%QlG9Ov~0$qFJ80S0q$6)9tcjKssl@Lypx%*BH$l9 zgm$ZidOh3H4jh7%y?VHs9hK2D?KVb58TOs_0kh0d9(Td~&*f_wjzf`SL=Jm9`7SSP z{1?9&2^XZ|icB_nHE614)n7OIn)a_bU$2I(5|9w5p8t4Pq&wlMn_1&MwG~Fz9R~&% z&0>uG`n%Xkzt6yGiQcMAjC+I(*|o*5(z<`&$7VC@v1TQY(qY}TT8!Sj)P8W!3d|b! z-CZwU|NM4~!1L7GQsF@xMBwAa2nYXX?V}cbRfXNviENOJI)@oMXyZ|6QEdv=_44jX z&tUxe%t=cP;Y{!q@d@WSL_Z@n437!wMGtW^Rmb^IlAWjO&yfBE9^gYcY8TkD%DQ4N z@SNb`q9t^yEl5aUqrd%ZePk6Es&itV|8`}6G38EP#!`Q$G_z&(`szrE)#BRbjo|Lh z2HIWdk?^ALL8eyqasJ4n^ns`&d9_#Fajq{}bY=4Bu3cn9Q)u&a;Nl*CePuR<-VD{qF?tb34$>F#BRZWye0v7Y3t{mHm+qn<{#0p z`0Yg?ov-n3spBh!z?=TFDyXavzT*)V8LwSkrnah-SO7qRolol1#_}*gs4I3!5_c|! zGkSpM8|LTM9n7Ma?F}{Oqk>4DOhOqmF`^2(oSVd}h1s*(w!ZM`g4x-%$Xa<(^}Cun z7kD#9X_J!UnGk{1PjVH4`NfU|ZLPP{PxmkFLhRxhVWAVYOgDV4Q`2gbvnW*rhnm3L zHfv`~RNn$W?ylV_PkNf8jNYZIEf$EN`ob?09+?dDwi78xxK}BBTxjG5!^33LmPO8% z6m+QR@qsp?u-?2Hk~_R8l}B$QU7(Y`Tzq9%?SnA${#+a**tu)XvC$fcnAps)8Rg#@ zZse#6t_piU9(qSG92sY8Joqt}rqtp-%HutX4uTqyKQlSGnpD!i#IWTNK#O0WXuI2xbV5am`IJ_a zUz9n5#FZ^R7SavQ*YR(LR(HC3`%WmXtKGHB{rOynfEgL~`}~g{^Y3m-|27<4&Z|+6 z%iS}(s@Sg@w0$IEbqCsxXnh_Bb8o6}5n;O$%JTAX5fSA@gq5+Jbwx?4$Bo3r0nXQ= z1XwoxEq-BTj~(Bf1*QA&;NcBSe;**YAB3VT5zP1OEvmL~*c@|IzcXnH&BN!`5a;=G z`!U0(dg#fP$YJTP8ym5h*+9z!Ce%78()+`Tgg4ctJ+8mU400v47h+8uQ^(Nu%5CL- zK3(?PR*T(-_|&}kYb!#g$(1pF=FkJyJ?!ttKbSwYI3TBm$c7Dmyw~EYYw-bpbEV8n z!5i7FcrHP^n`^P^d=W1D@#@y-WtZaxxx(mmZUEJuHbgneG+0BNL5=F&8NoNaz$8Y51?(~ zWB1MnyUA%|xaT#pMH7_&yNXZtMidG&c4i-R`P*+2pSIxs zPf)Jf@MsveQaxflfn4^38?O`9KCgtWlTw#k)lTE9_Lw=>;ra%BswnnvK_AJ;w`&KX zoz_i@zzKovSJC>8Lj;=%Iv(`;jQ9a)>{UCMxam88%%91Ru%L4Q2Ve?1}HY=&Omuy(oF zA;!65Xms#ML&Ig7qw|^rZ!U272jF3yrjgugju-vwB6kl_)7PglJ+7_{yX`XCy`0Cc zyeU6Pe^0Kq|Eb&bkJ2X6YAUMZb~kc?#ik~>IFzi)`d{HH@la&|_E%-9g)ZJ{NC>Z8 z{-^kj^IEPCNA^D7RJos?gtk`a@<*=lBda(1jI&IhxAH2K%|7y0+P#DYdope&C+}Px z0B&9?ikt#kz^fy$ZG9SUGJ=hvw)khRS?xF8@Mn+2#fy?i6?Zi!50Y*UO~EzSv(2xM zY*K09qM5X%X9c2AGltJE%|4@lt41#@_;`E{=P4#0Uv+gdI5hEHltOgfkhmVUqO91k zwDuL&-?)SDig%0&j-2Er0nu9&{kju}NDeyBN9idZ*=sF|{aZ_}N z1&-rMp;M?(%x7ruTm@zi&mz^leK;qf_y`J`@-a1JZ{@3>X<5XdyM;Y7HL|pVZB-w z#h#LI+#eIiogaUklTB#5Qp(PZ{RAmnlApD=#zuL=5V!dvB<;*L-#W4}y`0NO$YR*D z-x+7Q!hslEuX;AJHea-0!BlZLdcWs!!+||ua;C_j- zEq~b4!iQ(i_f4)Ji70D5gNrSTo-6iZ_d`JnnDKs!<2&tk zzL|k6=)QlQ>h|u=r+O{=v$s?11!Shm+Jx#g7pz%`%0A)CrmmsF3wUoU;>{{hQ!Tj2 zUE@Uce(P;wOC|h+7LL{1GlAY3Z=~H=BZT1cp^n#0ag&35fd3`V>29g|)%`9g?1k#E z@K(rovv1gB^>Oq|FK)r(?vvZ$xQ=a?{dWNLe$@WMY#4LW%e`%pcp13LCj-Xb+C8hw zR(f}ErBl>LgJk9HmY&#`(qCUslid>1rPVW!`z489nyY2;;ris+a}C|c?Y)XYMWVx# zV>EkFVXw(8boOrJX$ zz%*dr7d=TS4B4Lk)oLK|#-`I-njN0_RuITXqQSUN4NOL7(HI%+dLI(iv#lUa$i~Fn zn5(WE%0t_g@lv7IDD?c~Wpy7c0|C>x`g45SR~>GNZonPu-P?GQQ$7*lhM1&Q}? z{h4>N__wcCMTYHXA*VUI47=%Xd_?K!ZfQ-KfT45}$&1~#&PitkFfnyieknZp`#x5P z@!tEmSdy8&o^1kIznD8iOkho4mQ_ecV~4cPx291D+v#nLlB zl=LTM_0~&4*QnOGaT+QnOjlqz)x1Dg24=n&18(yWuY3OyXd+OQpeFuRb3ZQr62(e} z?UlVXoco~kWpnXdxv@A7>@GwBDuRfW)8|F#yA)uz5|6On7pCkq$1kOVU>l*Wbp|@; zvawEilr^fRHYQm8suVpd=j^Tgv)&M#b}g=x&FkzfzQ|3l--)MTB3qNsb}Z!6yHi})trNU%Ogq1M)t9?hU=s~8 zBB=qoYO3hKX`HsBofs^)yzp~PX!(Y2#L)wU5p~3CD{gxuHWc3brkz<9!gxBP*^&5hv zBaX>)EL>p1{49BFEQig_11zRnk^Je~hX^6d?YGB!ZW@cKS^2CEKwHV4WqXSIw< zRV}B^`-bt+d5Q?&Rp06VyfyYm+Z5MMz=Md}dzyk$L+SqQcn#=`W%4?7aW}?rK>AVS zL%_!m76D`(G&y+{iQ>9A;!0w*M~uIb)#@&MKh!b&Yf=1L0i555T>P)C za0S#&W6!Tr{UH=T@(g#bc+DnaJGgxdt&UUSxm;f@BKJ)Y0aEoa{8WlTqQD3b-ZWnlc8uI5#$csVVu{aWyWc4FFtByAPhMsOxCqO7O z`OLxmyUBj!R%x(cKo1c)i>2kgq$TbU%nA3~>aLvcA?>&Rz^%~GoZPnh%NoqqEJ)QX z+>zoFFD|a`m-D;TvyGxTW7uOk*aZrI8kz%>;LwzZG1r z#Xh2;#cF+ra8UcWQkGu)dkzg2`ty$UxHJXWX4E4 z&M#KpA<)9)C+>}ZNd*wK!tW`9Md(6Y)?aWOHm9iWJ6=D&C5@b&*^@2AU$izM}U z4eb#;8~1P;x5{_GbQl~;Pqz|TTs@GTQqEshaf?(!FH?7Z+21%C#aj``U?XVznI=-% zlc(!*`p_Ps)YRjjDe7C!`mZk(>Q+BpA0 zp)qK|Y{^-XyR!jm4P*7=aXynG>iglTSXIf&bxc#-p{6ePc36myT+G{9XzeZIW%t1M z(@$Qv#1gNbcpK2sT`kL-#!oZA2ghsxg17c@8duP?olQQchY;!U2W&xauGwEuLf%a0 z&`dA8`W4*0+JCil7E=6S0r7~U4vR&^lfUA(Ge`n1@&qx)@MCP%XPAzTGC+)hcuDwVL)uq)-kJIC1g#yTX*ShP-gD=Aq)aEMz94F&H$|opz=DL4t zk897ao61*_(1WRRSFm)Pgn46onA|KDy};PPLK~6}ws3GAuxvTny^652P4NSDMOU`2 zkj?V^NRx)(saaZ&?Y9&nzKE_&RT8LhyZtD`IG%(q{kfQDKsAfQ1PHTj74mZ5maX{~i z^U=b2qTxDHXY7c?*5FJS=OB4)uwf1V`Pyei$3rJX=hsiP-Y{%6lE&?>kOO!}{@>A+7Tz^(B;Nsr|vMYN&8R476D#2iZn1pW` z(kJ?x7F5u&<-NYK?r!WabmO$MTSJ}_J0u*__NL#M1=Wx4o{;}P?Y(tWTwR;?2_Zp( z2X_JiLU0dSxC9F%KydfMT?==2Cj<}fQn?zVnV(ur&9 zEq~>6)~ELjKGORx`XR@HJi7TaIUrAaG zx_aml$3~KV%OVr}b=Yj3h8`Lw=y$>RT>JL<^eFJeh~9Jy7MvoV?$3Cf{jgfWFgxM$ zdAiyf#+`l0H85PLcw@ zoj-2IAHJ$_w0!^r4_E_2NZjrwr|*dbn&ve`@4;f$3c~398n~Sc*@l+W%66xemj*k$ zpbrbL!8fKkp{bqQMNeN!a9il#508f>TgXt+CbS#=Cx975&<)~_I~SiVxhrFONVX^i!%x;e(W zoou_&VP^bEhWG%(-&4fccxB=aA2Ru6VW;4GP6cEsE7C3(tM$~gB#*wIdTq*}393qd z9N3t(i@m>fy-D6!r5P~1rKu70CMsyhbk(Ap;!=ll8G!iv2Fr`P~|8Nm#Fr`t> zfmew)5@dt{Zy^&tbctKz&fOXosO1wqnoq|>`IRa#E1^E&P#&Jcql=pL%1tmWoCI_? zIb{k>c{y)O!8-;;W<19e=3tGg^$n-M66RRuDZ;J}dVx6k!5hx%xP}y#k<4iH_t~p9 zBH7GZ*QssgnaJeX?+LxPMZcJ!EOc+&<;JbcE%kc~k0Nbrl!W~aU*?n+ApJNa`^4(O>Curfme zd8a}N?+I+ohNrjDLGzK3Q$g&Bp*MIm&5$X2<1=Kyu^A-X%yXCTPI;a$^g^_!NBFwB z$WqwjQ4O`W!u?zMZkQld#yerEJDB!AzCpKC!xO6vnV=*6upB7sY+*z?__WVb^i!cO ziPPr-@JvE(Z>HmB&n`(7sx2_B{ZJ&E+CKMrZcYZLSSVLdC&_%lzv-NvQJP@BI=sLj ze&3&AP@ zM*wrjAKk!e3Qb!MtJaT}#eV&EMpF}v>IndRSdOFP>!Px_dNs>oBQD?&rOP_L0q+&N zF-OQs`IQiEY{U|J-BZwxO-9viziO?QP(Jy-iJC1%S5EcGF zePAu+1G7AeOIk6WtYTd9BuNP=$JbH6lDq)x`Jd*GT!b@?1SI@gsQcyDN<0EB^sC@T z3Lmz=*5ll4R=>?{#*sKzrRQmRsMClHh1fNKnvO^GY_;x4^nC({BcwVRhq)5!~zU%m>I& z@S3m`)Wkt+Z5C?}h6P>oP$zyk{xLWwNKi_Bb0=A?_|00nYG%{vVDNf`vA(Fh8wD>^H=V{}IlHu5e+4Zm(-e1Z1i>21GhZNrzx>ye%tGTmw z6x_prOtn9jaZw1m!Awbx3AR{WQ~u`Uyg`UmgJ==Ww_xcei*I`<7S1+~cfUb35gwEw zW4jncg9!GpvuGZG<95Z(@x_`8>4&ZA3ib~f2cJEeqB8C^M^^5FP~)$_o)tMV>!bIE zI&h00Y)RTy!Xj}o9|l_Uiq;>gn)$*E2`1Y2i-Zo!cvNSAg6XZ>jK*U^ z3jnI11kv3OtSFuP>@9`b2bsS^tfbwN15;cEm8BB-!l=miF|hGPgw;A-M1iQqdo`&N z&$#`Dmt+Wmr|-6lDXpfyO17^kE`hY^3BH&~^|vk7qAJ-3Q96uPNIh!O3t)H&M>_4I z$=it~K$xhc4{9wBzFL7pHg*uXlIG(_d=MG;P=Z{`c&@*dd---k`0b7=fP;Znzg=OJ zsyt>Lf4$R;Uu(Jh;d~cZA6gqYgnnnP0hwVx35$s> zy(;{rGn(7nhn-hHIfrC6>}M`Y$B?POixY@0rg>ZX54tt2@4p51O*OXymX?H}0Q#O> zm36N0MB(HE8V-w9lT92}Yt6F4kuOArR>dv^E}7VpMGX4k(DKWvQeu#U3lB(FDjv+_ z^oWYi%H;<|`$Drr_G7~%?C>l%7g2e0doL{#cBf*Uq<%RTmcvi;-}<>#Tom?*9ipbv zw?GJh-ru8Gg?1a>b_55dbR)@E>@^^jwtdxyf!nTD$xeDbd;(I=cW!vyyrD8b%G^d4%59ku?c)+i{FHW(DG85EAYzT zMhHgy8fpg9^$PXq{#qrf*f9n?oIh+8uXU)sc|UJ70!9q1x|D!zTFC~-jXw1z@7_q7 zoD}JtJxgyEK%voQ{_G(ul=)2D5^Ifcy|mz655Ol4RzD}+qIjNsSf=Q$2g^Yg5lqE> z&uT80FSNyuB?)UDgEwib!jqLf)v!}(sEH4v^yyG24RL+ioWP90Q!PY>)xyoG9|F@Rf#()P;;G@=rPUweQ$RdjWU?$n;M?KKPpa+zNi6Ydfp_iW>^C2d{a0gC4LyB# z>H(h?WF_2*n_}D-PPVHjm|AM~Su|4bNTzURw7RTSnp+?8g$U`r4piAw11*ZOKhP%K z6zcV%y0NnR5^S-!UA?o9pMO30LuTKBF21@bxXO@eoNCa}rVg%#=tJS-H;o$qCe&ZzszRE zQ!qutUfkHRUokzW!l>WxN zJCe;SA%_*%GgpOSv%)B$O(%$`%yKEG;a-4% zsy3N25cB9-U*@w!#9pxq7Je5BWRJc6xtVi$U_O8s zx@N<7xB8g1gw(hl?vt#A0~)L>tGH>H)ZE?G==B=jvz+w?Wh=nXJjwTkq6yw#k(-X@ z>OF3v)cZnDY4G6!;#))8%dI+IGfKade1q-Vc)Xc$bct}J)>0uWy*9qFnqo|^bGLuL>$)v; zVGa*o2Ko6vqF=l^@S>1%vExWR!jr}uIScG~StEHrY5DMMV=mc8e8DwQRK#m>(5 z)K#I>63((&H9OoP(ebeJpkUx@O<}00ZE}N0(|fMArf;@*?Vb5$hH>ADa?p4P21fPF z1}6^^<_4TkIRCs%Vytuc98dqz;Npxq$Ks-lx_Pa>a`SoaqdwILww~Yha!@bNy%# zI9KkAOtY-F0H(pUeGavS8lXJfjl%SU?qE0lvQe(~)-1T;GC6S9mWp~67EQW<_|Q^X zd6<~Sdn-{wO0zk!ycTHB${CNifY>ucO%8nIVC}=@7iY`HO~bY|WeKi{E7s|bAGN)e zmbGsKLbU0md^^oxasBDn=IwRvbiNfpXvpT{}}wH`Eq0C*x*F zwc(!Zep8Eo{nO=)N73xks=h8QW#edJVg!c2ZFf<^#l=oUGg+zPss-h(2C)df)k9SnkeIjnL%%VVn)j~^45@>WXRn}neugBYt z-c|1Ps**f4FBWo6&%^gh3eGAf`bf;-%P>~5)@I~Qx7@6cQ@Sy^3$(Cda7dqp3V$Rb z2_fhw?uS)+hqJ(vgpyp*yHx9^9Ns8BhfH2uxT`%l&;Bn_fbC86;43Ke1;Cx$Ta59- zvt>VZr=!?G1sm)a4!56VR3}skGM!Bb9p3U=ZA1loB8n5X<;5HV)tWsI!k>Fn!WmZ5 zRAm8ugO1oPfTRI#5x3gyC7F&|+UiEmq~0l}hj;#v8#0AiCdsLAUd5mBW8+%zno&us zO|xZw>-E6`P_b}XOj(}`al=gCMF6wRj+c#4KPo1%uXQs$@|%gbLd$fpBD&NdY3plp z_E6U0PfzD{5-KVXtN5-@al&wr)~8)7Hq`vt6D0a$2k3b9nXmv7U(SC|(=MHuh3aYD zORkVo5w4N_Ur!gtay`|l6f=&e_5B~|iav9ab45>uvY)ixt5O#sZR+3K%qTdz?uUo& zurlwNt(;@k{qQ)R7olB>lj_H0NQ;q*aws$~%Rq*##g7!KG=@RE`DPOHjS+A55lcS} z@3wGof7Y7EJev0ha3v}(-dXlis0Yp^wm<3iWb0?^`*c#E9lmm%ztI`gaQ{3&W^rj) zNLSiQZ!o?V8&lQuVKwWv02{&}%YsG2BXO@uE6alnhv2E+FKk@Ao|cWnk9i$tc~Vvy zJOjbvfwTnKk(u!yPC$WYFkq*Wu zi^NZh|D?|{E@as9!sPHUMaj00?{EXrwvmVgPeZ6fZowq+#@fP$ma7p0tXyf!zZeO| z4SOgCQqDe*Z@odlzx;gIXS%Dr-0~An>2iK33ly?h;T-AH;TUM6BrKIF!%y6u zwb%m2f7a2B9t$B$7j@U)fVeqlriVo^9c+%1(_ILopxPwpT8+38@2Xio$Lt~!*SP$s z??0-_a!iOjCFO5^n?oR(n{=>$MnPX{enoIAv@;m5Z^Y=uki82;_kcg&a(6JH8*!Gxg-Ebvi>3vyAUuSA z%RBP8@&{V~w`j)}tv%V<1B0g+rD09Y{T`6^@+`20pv9l=<9vK+RoGWk&#Ti|{gCH+ zLa37dmTy9$m-8!#a}AY4{*c^-_;l%V-j|ntaL!Ju{7fwyg=^UyBBNU=ldf~N@$;t!CSwbePp?GQ^o50!(W?_Nf;0}mqR zU%8;OeLqn!kC5ELS!G}C`+hup(AquJS;DOQgntDmh14%%J9mqOHx><>Y{+{oqHL}OFn!`qex{vm6X*}^-hBT{&eU0REPM!=x7m7|Dt)DE+G%HVn7Xp{6GIj$ z+7~GwI7W%jhPV!C(>J9BbpH;OlOd=qjFNxJubRqBfvwb_BxTiN;5uyi%S1&_6~=Vf zU&@_4zSsfKHjAK98Z;Yi<8iWl*2E0

Ak6HQB9Oa6JAh|4U5^>-@0q`qtV3!M>gA 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 diff --git a/docs/user/wallets/dashcore/img/tools-information.png b/docs/user/wallets/dashcore/img/tools-information.png index 088a51f37830ff50a4222ae3c98ddd2218e8b73d..67d978abb7e9322c6f6279c2b77da106e09b117a 100644 GIT binary patch literal 84479 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

MoT4hZv{FTzbO$AXE@N?@B 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 LoOrpYUcmnVPIR-H literal 76943 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 diff --git a/docs/user/wallets/dashcore/img/tools-peers.png b/docs/user/wallets/dashcore/img/tools-peers.png index 733cc3ec9edacf1171676aa1e82bfce1fe944075..275702a82578332138c8bde95de49f085cc98cfe 100644 GIT binary patch literal 163118 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 |Z?hzaImHp5n+( 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ʙ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 literal 83031 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 z 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 diff --git a/docs/user/wallets/dashcore/img/tools-wallet-repair.png b/docs/user/wallets/dashcore/img/tools-wallet-repair.png index d9c5c82a54ac7437f10ad4e6b0c85ff9813fd94d..1c4c81f4706bced03a67d5728f903309fa883243 100644 GIT binary patch literal 49006 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 z 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 literal 78653 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 z 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 ZK-Di4ZveQv0SNFUC#57=@zyx#KL8Gl)E)o; diff --git a/docs/user/wallets/dashcore/interface.rst b/docs/user/wallets/dashcore/interface.rst index bd944030b..db39326e3 100644 --- a/docs/user/wallets/dashcore/interface.rst +++ b/docs/user/wallets/dashcore/interface.rst @@ -274,9 +274,9 @@ Start Dash Core on system login option is effectively the same as starting Dash Core together with the operating system. -Hide tray icon - When this option is enabled, Dash Core will not display an icon in the - system tray. This option cannot be selected at the same time as +Show tray icon + When this option is enabled, Dash Core will display an icon in the + system tray. This option must be selected to enable **Minimize to the tray instead of the taskbar**. Minimize to the tray instead of the taskbar @@ -284,7 +284,7 @@ Minimize to the tray instead of the taskbar will no longer appear in your taskbar as a running task. Instead, Dash Core will keep running in the background and can be re-opened from the Dash icon in the system tray (the area next to your system clock). This - option cannot be selected at the same time as **Hide tray icon**. + option can only be selected when **Show tray icon** is selected. Minimize on close When this option is enabled, clicking the X button in the top right @@ -313,6 +313,10 @@ Number of script verification threads that number of processor cores, while setting a negative number will leave that number of processor cores free. +Enable RPC Server + This option allows you or a third-party tool to communicate with the node + through command-line and JSON-RPC commands. + Wallet tab ---------- @@ -327,6 +331,9 @@ as inputs with the Coin Control, CoinJoin and Masternode features. The Wallet tab of the Dash Core Options dialog +Subtract fee from amount by default + Whether to set subtract fee from amount as default or not. + Enable coin control features Your Dash Core wallet balance is actually the sum total of all addresses holding balance that are associated with your wallet. When @@ -339,6 +346,9 @@ Enable coin control features different addresses in your wallet. See :ref:`here ` for a more detailed explanation of Coin Control. +Keep custom change address + Whether to keep the specified custom change address or not. + Show Masternodes tab Enabling this option causes Dash Core to display an additional Masternodes tab to the right of the Transactions tab. This option @@ -435,6 +445,14 @@ Map port using UPnP routers and will allow you to connect to the Dash network without making any special settings on your router. +Map port using NAT-PMP + This option causes Dash Core to automatically attempt to open and map + the client port on your router using + `NAT-PMP `__ + (NAT Port Mapping Protocol). This feature is supported by most modern home + routers and will allow you to connect to the Dash network without making + any special settings on your router. + Allow incoming connections This option causes your client to accept external connections. Since Dash is a peer-to-peer network and Dash Core is considered a full client @@ -612,21 +630,6 @@ Rescan blockchain files 2 Performs the same operation as *Rescan blockchain files 1* but scans from the genesis block instead of the wallet creation time. -Recover transactions - The recover transactions commands can be used to remove unconfirmed - transactions from the memory pool. Your wallet will restart and rescan - the blockchain, recovering existing transactions and removing - unconfirmed transactions. Transactions may become stuck in an - unconfirmed state if there is a conflict in protocol versions on the - network during CoinJoin processing, for example, or if a - transaction is sent with insufficient fees when blocks are full. - -Upgrade wallet format - This command is available for very old wallets where an upgrade to the - wallet version is required in addition to an update to the wallet - software. You can view your current wallet version by running the - ``getwalletinfo`` command in the console. - Rebuild index Discards the current blockchain and chainstate indexes (the database of unspent transaction outputs) and rebuilds it from existing block files. From 46561ee9fc5eb570fce33595fc876bc7efcafeb8 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 7 Nov 2024 11:11:41 -0500 Subject: [PATCH 02/14] build: use multiple cores Builds were taking too long due to using a single core. This updates to automatically use multiple cores. Build time went from ~25 sec to ~10 sec --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3424313bb..acd62bf7a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -j auto SPHINXBUILD = sphinx-build SPHINXPROJ = Dash SOURCEDIR = . From db9cca9ac0e6e15166bb49fadb30e415cba2d84d Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 7 Nov 2024 16:12:11 -0500 Subject: [PATCH 03/14] docs: import v21.0.0 core docs (#417) * docs: import v21.0.0 core docs From dashpay/docs-core@37c88509b7d3dbe1883014760c684359bccf73fc * docs: update index to include local core docs * build: update conf Remove unnecessary core intersphinx connection Remove unnecessary core external link Add some files to ignore * docs: convert core intersphinx links to local Previously these links to labels were in a separate project and had to be referred to using intersphinx. Now that core docs are in the same repo, the links are internal to the project and don't require intersphinx mapping. --- conf.py | 4 +- docs/core/api/ai-prompt.md | 116 + .../api/dash-core-apis-hash-byte-order.md | 81 + docs/core/api/http-rest-quick-reference.md | 11 + docs/core/api/http-rest-requests.md | 1030 ++++ docs/core/api/http-rest.md | 23 + .../remote-procedure-call-quick-reference.md | 235 + .../remote-procedure-calls-address-index.md | 279 ++ .../api/remote-procedure-calls-blockchain.md | 2300 +++++++++ .../api/remote-procedure-calls-control.md | 374 ++ docs/core/api/remote-procedure-calls-dash.md | 1929 ++++++++ docs/core/api/remote-procedure-calls-evo.md | 4268 +++++++++++++++++ .../api/remote-procedure-calls-generating.md | 173 + .../core/api/remote-procedure-calls-mining.md | 391 ++ .../api/remote-procedure-calls-network.md | 834 ++++ ...remote-procedure-calls-raw-transactions.md | 1556 ++++++ .../api/remote-procedure-calls-removed.md | 63 + docs/core/api/remote-procedure-calls-util.md | 428 ++ ...emote-procedure-calls-wallet-deprecated.md | 13 + .../core/api/remote-procedure-calls-wallet.md | 3886 +++++++++++++++ docs/core/api/remote-procedure-calls-zmq.md | 53 + docs/core/api/remote-procedure-calls.md | 357 ++ docs/core/api/zmq.md | 110 + .../wallet-arguments-and-commands-dash-cli.md | 192 + .../wallet-arguments-and-commands-dash-qt.md | 70 + .../wallet-arguments-and-commands-dash-tx.md | 142 + ...llet-arguments-and-commands-dash-wallet.md | 132 + .../wallet-arguments-and-commands-dashd.md | 1208 +++++ .../dashcore/wallet-arguments-and-commands.md | 97 + .../dashcore/wallet-configuration-file.md | 100 + docs/core/dips/README.md | 48 + docs/core/examples/configuration-file.md | 33 + docs/core/examples/introduction.md | 18 + .../p2p-network-bloom-filter-script.md | 117 + .../p2p-network-creating-a-bloom-filter.md | 122 + .../p2p-network-evaluating-a-bloom-filter.md | 57 + .../p2p-network-parsing-a-merkleblock.md | 73 + .../p2p-network-retrieving-a-merkleblock.md | 102 + docs/core/examples/p2p-network.md | 12 + .../examples/receiving-zmq-notifications.md | 164 + docs/core/examples/testing-applications.md | 126 + ...action-tutorial-complex-raw-transaction.md | 230 + .../transaction-tutorial-offline-signing.md | 280 ++ .../transaction-tutorial-p2sh-multisig.md | 357 ++ ...saction-tutorial-simple-raw-transaction.md | 208 + .../transaction-tutorial-simple-spending.md | 165 + docs/core/examples/transaction-tutorial.md | 24 + .../guide/block-chain-block-chain-overview.md | 25 + .../block-chain-block-height-and-forking.md | 21 + .../block-chain-consensus-rule-changes.md | 43 + docs/core/guide/block-chain-proof-of-work.md | 29 + .../guide/block-chain-transaction-data.md | 37 + docs/core/guide/block-chain.md | 21 + .../guide/contracts-escrow-and-arbitration.md | 41 + .../guide/contracts-micropayment-channel.md | 27 + docs/core/guide/contracts.md | 20 + docs/core/guide/dash-features-chainlocks.md | 18 + docs/core/guide/dash-features-coinjoin.md | 131 + docs/core/guide/dash-features-governance.md | 90 + .../dash-features-historical-reference.md | 67 + docs/core/guide/dash-features-instantsend.md | 62 + .../guide/dash-features-masternode-payment.md | 17 + .../guide/dash-features-masternode-quorums.md | 124 + .../guide/dash-features-masternode-sync.md | 72 + .../guide/dash-features-proof-of-service.md | 58 + docs/core/guide/dash-features.md | 57 + docs/core/guide/introduction.md | 14 + docs/core/guide/mining-block-prototypes.md | 47 + docs/core/guide/mining-pool-mining.md | 19 + docs/core/guide/mining-solo-mining.md | 17 + docs/core/guide/mining.md | 21 + docs/core/guide/operating-modes-full-node.md | 13 + .../guide/operating-modes-future-proposals.md | 13 + ...des-simplified-payment-verification-spv.md | 47 + docs/core/guide/operating-modes.md | 11 + .../guide/p2p-network-block-broadcasting.md | 49 + .../guide/p2p-network-connecting-to-peers.md | 13 + .../p2p-network-initial-block-download.md | 115 + .../guide/p2p-network-misbehaving-nodes.md | 77 + docs/core/guide/p2p-network-peer-discovery.md | 43 + .../p2p-network-transaction-broadcasting.md | 23 + docs/core/guide/p2p-network.md | 25 + .../guide/transactions-avoiding-key-reuse.md | 23 + ...ansactions-locktime-and-sequence-number.md | 27 + .../transactions-non-standard-transactions.md | 29 + .../transactions-p2pkh-script-validation.md | 43 + docs/core/guide/transactions-p2sh-scripts.md | 21 + .../transactions-signature-hash-types.md | 27 + .../transactions-standard-transactions.md | 104 + ...ransactions-transaction-fees-and-change.md | 17 + .../transactions-transaction-malleability.md | 23 + docs/core/guide/transactions.md | 73 + docs/core/guide/wallets-wallet-files.md | 191 + docs/core/guide/wallets-wallet-programs.md | 97 + docs/core/guide/wallets.md | 18 + docs/core/index.md | 171 + .../reference/block-chain-block-headers.md | 99 + .../block-chain-serialized-blocks.md | 120 + docs/core/reference/block-chain.md | 11 + docs/core/reference/improvement-proposals.md | 17 + docs/core/reference/introduction.md | 25 + .../p2p-network-constants-and-defaults.md | 22 + .../reference/p2p-network-control-messages.md | 536 +++ .../reference/p2p-network-data-messages.md | 982 ++++ .../p2p-network-deprecated-messages.md | 119 + .../p2p-network-governance-messages.md | 176 + .../p2p-network-instantsend-messages.md | 88 + .../p2p-network-masternode-messages.md | 69 + .../reference/p2p-network-message-headers.md | 27 + .../p2p-network-privatesend-messages.md | 555 +++ .../p2p-network-protocol-versions.md | 60 + .../reference/p2p-network-quorum-messages.md | 823 ++++ docs/core/reference/p2p-network.md | 31 + .../transactions-address-conversion.md | 57 + ...nsactions-compactsize-unsigned-integers.md | 22 + docs/core/reference/transactions-opcodes.md | 111 + .../transactions-raw-transaction-format.md | 223 + .../transactions-special-transactions.md | 1329 +++++ docs/core/reference/transactions.md | 15 + docs/core/reference/wallets.md | 19 + docs/core/resources/glossary.md | 709 +++ docs/img/dash-d.png | Bin 0 -> 10675 bytes docs/img/dash_logo.png | Bin 0 -> 42986 bytes docs/img/dash_logo_white.png | Bin 0 -> 39404 bytes docs/img/dev/COPYING | 2 + docs/img/dev/README | 64 + .../dev/animated-en-merkleblock-creation.gif | Bin 0 -> 16316 bytes .../dev/animated-en-merkleblock-parsing.gif | Bin 0 -> 14866 bytes docs/img/dev/en-block-height-vs-depth.dot | 39 + docs/img/dev/en-block-height-vs-depth.png | Bin 0 -> 4695 bytes docs/img/dev/en-block-height-vs-depth.svg | 113 + docs/img/dev/en-blockchain-fork.dot | 55 + docs/img/dev/en-blockchain-fork.png | Bin 0 -> 12080 bytes docs/img/dev/en-blockchain-fork.svg | 213 + docs/img/dev/en-blockchain-overview.dot | 60 + docs/img/dev/en-blockchain-overview.png | Bin 0 -> 17511 bytes docs/img/dev/en-blockchain-overview.svg | 121 + docs/img/dev/en-blocks-first-flowchart.dot | 32 + docs/img/dev/en-blocks-first-flowchart.png | Bin 0 -> 7040 bytes docs/img/dev/en-blocks-first-flowchart.svg | 62 + docs/img/dev/en-bloom-update.dot | 72 + docs/img/dev/en-bloom-update.png | Bin 0 -> 7339 bytes docs/img/dev/en-bloom-update.svg | 140 + docs/img/dev/en-btcc-payment-request.png | Bin 0 -> 29521 bytes docs/img/dev/en-cert-order.dot | 29 + docs/img/dev/en-cert-order.png | Bin 0 -> 9204 bytes docs/img/dev/en-cert-order.svg | 66 + docs/img/dev/en-coinjoin.dot | 99 + docs/img/dev/en-coinjoin.png | Bin 0 -> 12451 bytes docs/img/dev/en-coinjoin.svg | 206 + docs/img/dev/en-creating-p2pkh-output.dot | 42 + docs/img/dev/en-creating-p2pkh-output.png | Bin 0 -> 4167 bytes docs/img/dev/en-creating-p2pkh-output.svg | 78 + docs/img/dev/en-creating-p2sh-output.dot | 42 + docs/img/dev/en-creating-p2sh-output.png | Bin 0 -> 4502 bytes docs/img/dev/en-creating-p2sh-output.svg | 88 + .../en-ecdsa-compressed-public-key.gnuplot | 15 + .../dev/en-ecdsa-compressed-public-key.png | Bin 0 -> 2963 bytes .../dev/en-ecdsa-compressed-public-key.svg | 386 ++ docs/img/dev/en-hard-fork.dot | 49 + docs/img/dev/en-hard-fork.png | Bin 0 -> 6182 bytes docs/img/dev/en-hard-fork.svg | 128 + ...n-hd-cross-generational-key-compromise.dot | 75 + ...n-hd-cross-generational-key-compromise.png | Bin 0 -> 9474 bytes ...n-hd-cross-generational-key-compromise.svg | 192 + docs/img/dev/en-hd-overview.dot | 55 + docs/img/dev/en-hd-overview.png | Bin 0 -> 6591 bytes docs/img/dev/en-hd-overview.svg | 135 + .../en-hd-private-parent-to-private-child.dot | 65 + .../en-hd-private-parent-to-private-child.png | Bin 0 -> 10921 bytes .../en-hd-private-parent-to-private-child.svg | 161 + ...ic-child-from-public-or-private-parent.dot | 78 + ...ic-child-from-public-or-private-parent.png | Bin 0 -> 11067 bytes ...ic-child-from-public-or-private-parent.svg | 196 + .../en-hd-public-child-from-public-parent.dot | 39 + .../en-hd-public-child-from-public-parent.png | Bin 0 -> 7184 bytes .../en-hd-public-child-from-public-parent.svg | 85 + docs/img/dev/en-hd-root-keys.dot | 42 + docs/img/dev/en-hd-root-keys.png | Bin 0 -> 6874 bytes docs/img/dev/en-hd-root-keys.svg | 111 + docs/img/dev/en-hd-tree.dot | 66 + docs/img/dev/en-hd-tree.png | Bin 0 -> 11029 bytes docs/img/dev/en-hd-tree.svg | 142 + docs/img/dev/en-headers-first-flowchart.dot | 37 + docs/img/dev/en-headers-first-flowchart.png | Bin 0 -> 8792 bytes docs/img/dev/en-headers-first-flowchart.svg | 78 + .../dev/en-headers-first-moving-window.dot | 45 + .../dev/en-headers-first-moving-window.png | Bin 0 -> 5651 bytes .../dev/en-headers-first-moving-window.svg | 86 + docs/img/dev/en-ibd-block.dot | 49 + docs/img/dev/en-ibd-block.png | Bin 0 -> 11595 bytes docs/img/dev/en-ibd-block.svg | 56 + docs/img/dev/en-ibd-getblocks.dot | 59 + docs/img/dev/en-ibd-getblocks.png | Bin 0 -> 11968 bytes docs/img/dev/en-ibd-getblocks.svg | 65 + docs/img/dev/en-ibd-getblocks2.dot | 60 + docs/img/dev/en-ibd-getblocks2.png | Bin 0 -> 13574 bytes docs/img/dev/en-ibd-getblocks2.svg | 67 + docs/img/dev/en-ibd-getdata.dot | 73 + docs/img/dev/en-ibd-getdata.png | Bin 0 -> 17126 bytes docs/img/dev/en-ibd-getdata.svg | 65 + docs/img/dev/en-ibd-getheaders.dot | 57 + docs/img/dev/en-ibd-getheaders.png | Bin 0 -> 15877 bytes docs/img/dev/en-ibd-getheaders.svg | 65 + docs/img/dev/en-ibd-headers.dot | 70 + docs/img/dev/en-ibd-headers.png | Bin 0 -> 16127 bytes docs/img/dev/en-ibd-headers.svg | 61 + docs/img/dev/en-ibd-inv.dot | 76 + docs/img/dev/en-ibd-inv.png | Bin 0 -> 16915 bytes docs/img/dev/en-ibd-inv.svg | 65 + .../dev/en-masternode-sync-initial-dip3.png | Bin 0 -> 17838 bytes .../dev/en-masternode-sync-initial-dip3.svg | 139 + docs/img/dev/en-masternode-sync-initial.png | Bin 0 -> 35145 bytes docs/img/dev/en-masternode-sync-initial.svg | 194 + docs/img/dev/en-masternode-sync-ongoing.png | Bin 0 -> 130682 bytes docs/img/dev/en-masternode-sync-ongoing.svg | 780 +++ docs/img/dev/en-masternode-sync.odg | Bin 0 -> 17364 bytes docs/img/dev/en-merkle-tree-construction.dot | 42 + docs/img/dev/en-merkle-tree-construction.png | Bin 0 -> 6134 bytes docs/img/dev/en-merkle-tree-construction.svg | 86 + docs/img/dev/en-micropayment-channel.dot | 54 + docs/img/dev/en-micropayment-channel.png | Bin 0 -> 53198 bytes docs/img/dev/en-micropayment-channel.svg | 128 + docs/img/dev/en-nbits-overview.dot | 29 + docs/img/dev/en-nbits-overview.png | Bin 0 -> 5443 bytes docs/img/dev/en-nbits-overview.svg | 83 + docs/img/dev/en-nbits-quick-parse.dot | 122 + docs/img/dev/en-nbits-quick-parse.png | Bin 0 -> 7053 bytes docs/img/dev/en-nbits-quick-parse.svg | 298 ++ docs/img/dev/en-orphan-stale-definition.dot | 43 + docs/img/dev/en-orphan-stale-definition.png | Bin 0 -> 6635 bytes docs/img/dev/en-orphan-stale-definition.svg | 80 + docs/img/dev/en-p2p-control-messages.dot | 29 + docs/img/dev/en-p2p-control-messages.png | Bin 0 -> 8533 bytes docs/img/dev/en-p2p-control-messages.svg | 102 + docs/img/dev/en-p2p-data-messages.dot | 39 + docs/img/dev/en-p2p-data-messages.png | Bin 0 -> 22625 bytes docs/img/dev/en-p2p-data-messages.svg | 146 + docs/img/dev/en-p2p-governance-messages.dot | 34 + docs/img/dev/en-p2p-governance-messages.png | Bin 0 -> 21628 bytes docs/img/dev/en-p2p-governance-messages.svg | 93 + docs/img/dev/en-p2p-instantsend-messages.dot | 28 + docs/img/dev/en-p2p-instantsend-messages.png | Bin 0 -> 10657 bytes docs/img/dev/en-p2p-instantsend-messages.svg | 69 + docs/img/dev/en-p2p-masternode-messages.dot | 41 + docs/img/dev/en-p2p-masternode-messages.png | Bin 0 -> 20144 bytes docs/img/dev/en-p2p-masternode-messages.svg | 121 + docs/img/dev/en-p2p-privatesend-messages.dot | 33 + docs/img/dev/en-p2p-privatesend-messages.png | Bin 0 -> 26006 bytes docs/img/dev/en-p2p-privatesend-messages.svg | 88 + docs/img/dev/en-p2pkh-stack.dot | 146 + docs/img/dev/en-p2pkh-stack.png | Bin 0 -> 18084 bytes docs/img/dev/en-p2pkh-stack.svg | 306 ++ docs/img/dev/en-payment-processing.dot | 29 + docs/img/dev/en-payment-processing.png | Bin 0 -> 6129 bytes docs/img/dev/en-payment-processing.svg | 96 + docs/img/dev/en-payment-protocol.dot | 56 + docs/img/dev/en-payment-protocol.png | Bin 0 -> 17220 bytes docs/img/dev/en-payment-protocol.svg | 164 + docs/img/dev/en-pooled-mining-overview.dot | 25 + docs/img/dev/en-pooled-mining-overview.png | Bin 0 -> 5512 bytes docs/img/dev/en-pooled-mining-overview.svg | 78 + docs/img/dev/en-qr-code.png | Bin 0 -> 6583 bytes docs/img/dev/en-qr-code.svg | 225 + docs/img/dev/en-signing-output-to-spend.dot | 90 + docs/img/dev/en-signing-output-to-spend.png | Bin 0 -> 8761 bytes docs/img/dev/en-signing-output-to-spend.svg | 143 + docs/img/dev/en-soft-fork.dot | 47 + docs/img/dev/en-soft-fork.png | Bin 0 -> 6798 bytes docs/img/dev/en-soft-fork.svg | 105 + docs/img/dev/en-solo-mining-overview.dot | 25 + docs/img/dev/en-solo-mining-overview.png | Bin 0 -> 5231 bytes docs/img/dev/en-solo-mining-overview.svg | 77 + docs/img/dev/en-transaction-propagation.dot | 86 + docs/img/dev/en-transaction-propagation.png | Bin 0 -> 44781 bytes docs/img/dev/en-transaction-propagation.svg | 195 + docs/img/dev/en-tx-overview-spending.dot | 52 + docs/img/dev/en-tx-overview-spending.png | Bin 0 -> 21756 bytes docs/img/dev/en-tx-overview-spending.svg | 108 + docs/img/dev/en-tx-overview.dot | 54 + docs/img/dev/en-tx-overview.png | Bin 0 -> 5640 bytes docs/img/dev/en-tx-overview.svg | 89 + docs/img/dev/en-unlocking-p2pkh-output.dot | 48 + docs/img/dev/en-unlocking-p2pkh-output.png | Bin 0 -> 5780 bytes docs/img/dev/en-unlocking-p2pkh-output.svg | 80 + docs/img/dev/en-unlocking-p2sh-output.dot | 47 + docs/img/dev/en-unlocking-p2sh-output.png | Bin 0 -> 5263 bytes docs/img/dev/en-unlocking-p2sh-output.svg | 80 + docs/img/dev/en-wallets-distributing-only.dot | 50 + docs/img/dev/en-wallets-distributing-only.png | Bin 0 -> 5998 bytes docs/img/dev/en-wallets-distributing-only.svg | 131 + docs/img/dev/en-wallets-full-service.dot | 30 + docs/img/dev/en-wallets-full-service.png | Bin 0 -> 3818 bytes docs/img/dev/en-wallets-full-service.svg | 95 + docs/img/dev/en-wallets-signing-only.dot | 50 + docs/img/dev/en-wallets-signing-only.png | Bin 0 -> 6382 bytes docs/img/dev/en-wallets-signing-only.svg | 131 + docs/img/dev/gifs/README.md | 31 + .../en-merkleblock-creation-001.dot | 148 + .../en-merkleblock-creation-002.dot | 148 + .../en-merkleblock-creation-003.dot | 148 + .../en-merkleblock-creation-004.dot | 148 + .../en-merkleblock-creation-005.dot | 148 + .../en-merkleblock-creation-006.dot | 148 + .../en-merkleblock-creation-007.dot | 148 + .../en-merkleblock-creation-008.dot | 148 + .../en-merkleblock-creation-009.dot | 148 + .../en-merkleblock-creation-010.dot | 148 + .../en-merkleblock-creation-011.dot | 148 + .../en-merkleblock-creation-012.dot | 148 + .../en-merkleblock-parsing-001.dot | 138 + .../en-merkleblock-parsing-001.png | Bin 0 -> 5951 bytes .../en-merkleblock-parsing-001.svg | 288 ++ .../en-merkleblock-parsing-002.dot | 140 + .../en-merkleblock-parsing-002.png | Bin 0 -> 6043 bytes .../en-merkleblock-parsing-002.svg | 291 ++ .../en-merkleblock-parsing-003.dot | 141 + .../en-merkleblock-parsing-003.png | Bin 0 -> 6347 bytes .../en-merkleblock-parsing-003.svg | 299 ++ .../en-merkleblock-parsing-004.dot | 142 + .../en-merkleblock-parsing-004.png | Bin 0 -> 6323 bytes .../en-merkleblock-parsing-004.svg | 294 ++ .../en-merkleblock-parsing-005.dot | 140 + .../en-merkleblock-parsing-005.png | Bin 0 -> 6343 bytes .../en-merkleblock-parsing-005.svg | 293 ++ .../en-merkleblock-parsing-006.dot | 140 + .../en-merkleblock-parsing-006.png | Bin 0 -> 6657 bytes .../en-merkleblock-parsing-006.svg | 301 ++ .../en-merkleblock-parsing-007.dot | 140 + .../en-merkleblock-parsing-007.png | Bin 0 -> 6919 bytes .../en-merkleblock-parsing-007.svg | 304 ++ .../en-merkleblock-parsing-008.dot | 140 + .../en-merkleblock-parsing-008.png | Bin 0 -> 6913 bytes .../en-merkleblock-parsing-008.svg | 301 ++ .../en-merkleblock-parsing-009.dot | 141 + .../en-merkleblock-parsing-009.png | Bin 0 -> 7329 bytes .../en-merkleblock-parsing-009.svg | 312 ++ .../en-merkleblock-parsing-010.dot | 141 + .../en-merkleblock-parsing-011.dot | 141 + .../en-merkleblock-parsing-011.png | Bin 0 -> 7290 bytes .../en-merkleblock-parsing-011.svg | 308 ++ docs/img/icons/icon_warning.png | Bin 0 -> 637 bytes docs/img/icons/icon_warning.svg | 7 + docs/user/developers/index.rst | 2 +- docs/user/developers/integration.rst | 78 +- docs/user/developers/testnet.rst | 2 +- docs/user/governance/using.rst | 4 +- docs/user/wallets/dashcore/advanced.rst | 2 +- docs/user/wallets/dashcore/cmd-rpc.rst | 14 +- docs/user/wallets/dashcore/interface.rst | 2 +- index.rst | 5 +- 351 files changed, 48225 insertions(+), 56 deletions(-) create mode 100644 docs/core/api/ai-prompt.md create mode 100644 docs/core/api/dash-core-apis-hash-byte-order.md create mode 100644 docs/core/api/http-rest-quick-reference.md create mode 100644 docs/core/api/http-rest-requests.md create mode 100644 docs/core/api/http-rest.md create mode 100644 docs/core/api/remote-procedure-call-quick-reference.md create mode 100644 docs/core/api/remote-procedure-calls-address-index.md create mode 100644 docs/core/api/remote-procedure-calls-blockchain.md create mode 100644 docs/core/api/remote-procedure-calls-control.md create mode 100644 docs/core/api/remote-procedure-calls-dash.md create mode 100644 docs/core/api/remote-procedure-calls-evo.md create mode 100644 docs/core/api/remote-procedure-calls-generating.md create mode 100644 docs/core/api/remote-procedure-calls-mining.md create mode 100644 docs/core/api/remote-procedure-calls-network.md create mode 100644 docs/core/api/remote-procedure-calls-raw-transactions.md create mode 100644 docs/core/api/remote-procedure-calls-removed.md create mode 100644 docs/core/api/remote-procedure-calls-util.md create mode 100644 docs/core/api/remote-procedure-calls-wallet-deprecated.md create mode 100644 docs/core/api/remote-procedure-calls-wallet.md create mode 100644 docs/core/api/remote-procedure-calls-zmq.md create mode 100644 docs/core/api/remote-procedure-calls.md create mode 100644 docs/core/api/zmq.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands-dash-cli.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands-dash-qt.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands-dash-tx.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands-dash-wallet.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands-dashd.md create mode 100644 docs/core/dashcore/wallet-arguments-and-commands.md create mode 100644 docs/core/dashcore/wallet-configuration-file.md create mode 100644 docs/core/dips/README.md create mode 100644 docs/core/examples/configuration-file.md create mode 100644 docs/core/examples/introduction.md create mode 100644 docs/core/examples/p2p-network-bloom-filter-script.md create mode 100644 docs/core/examples/p2p-network-creating-a-bloom-filter.md create mode 100644 docs/core/examples/p2p-network-evaluating-a-bloom-filter.md create mode 100644 docs/core/examples/p2p-network-parsing-a-merkleblock.md create mode 100644 docs/core/examples/p2p-network-retrieving-a-merkleblock.md create mode 100644 docs/core/examples/p2p-network.md create mode 100644 docs/core/examples/receiving-zmq-notifications.md create mode 100644 docs/core/examples/testing-applications.md create mode 100644 docs/core/examples/transaction-tutorial-complex-raw-transaction.md create mode 100644 docs/core/examples/transaction-tutorial-offline-signing.md create mode 100644 docs/core/examples/transaction-tutorial-p2sh-multisig.md create mode 100644 docs/core/examples/transaction-tutorial-simple-raw-transaction.md create mode 100644 docs/core/examples/transaction-tutorial-simple-spending.md create mode 100644 docs/core/examples/transaction-tutorial.md create mode 100644 docs/core/guide/block-chain-block-chain-overview.md create mode 100644 docs/core/guide/block-chain-block-height-and-forking.md create mode 100644 docs/core/guide/block-chain-consensus-rule-changes.md create mode 100644 docs/core/guide/block-chain-proof-of-work.md create mode 100644 docs/core/guide/block-chain-transaction-data.md create mode 100644 docs/core/guide/block-chain.md create mode 100644 docs/core/guide/contracts-escrow-and-arbitration.md create mode 100644 docs/core/guide/contracts-micropayment-channel.md create mode 100644 docs/core/guide/contracts.md create mode 100644 docs/core/guide/dash-features-chainlocks.md create mode 100644 docs/core/guide/dash-features-coinjoin.md create mode 100644 docs/core/guide/dash-features-governance.md create mode 100644 docs/core/guide/dash-features-historical-reference.md create mode 100644 docs/core/guide/dash-features-instantsend.md create mode 100644 docs/core/guide/dash-features-masternode-payment.md create mode 100644 docs/core/guide/dash-features-masternode-quorums.md create mode 100644 docs/core/guide/dash-features-masternode-sync.md create mode 100644 docs/core/guide/dash-features-proof-of-service.md create mode 100644 docs/core/guide/dash-features.md create mode 100644 docs/core/guide/introduction.md create mode 100644 docs/core/guide/mining-block-prototypes.md create mode 100644 docs/core/guide/mining-pool-mining.md create mode 100644 docs/core/guide/mining-solo-mining.md create mode 100644 docs/core/guide/mining.md create mode 100644 docs/core/guide/operating-modes-full-node.md create mode 100644 docs/core/guide/operating-modes-future-proposals.md create mode 100644 docs/core/guide/operating-modes-simplified-payment-verification-spv.md create mode 100644 docs/core/guide/operating-modes.md create mode 100644 docs/core/guide/p2p-network-block-broadcasting.md create mode 100644 docs/core/guide/p2p-network-connecting-to-peers.md create mode 100644 docs/core/guide/p2p-network-initial-block-download.md create mode 100644 docs/core/guide/p2p-network-misbehaving-nodes.md create mode 100644 docs/core/guide/p2p-network-peer-discovery.md create mode 100644 docs/core/guide/p2p-network-transaction-broadcasting.md create mode 100644 docs/core/guide/p2p-network.md create mode 100644 docs/core/guide/transactions-avoiding-key-reuse.md create mode 100644 docs/core/guide/transactions-locktime-and-sequence-number.md create mode 100644 docs/core/guide/transactions-non-standard-transactions.md create mode 100644 docs/core/guide/transactions-p2pkh-script-validation.md create mode 100644 docs/core/guide/transactions-p2sh-scripts.md create mode 100644 docs/core/guide/transactions-signature-hash-types.md create mode 100644 docs/core/guide/transactions-standard-transactions.md create mode 100644 docs/core/guide/transactions-transaction-fees-and-change.md create mode 100644 docs/core/guide/transactions-transaction-malleability.md create mode 100644 docs/core/guide/transactions.md create mode 100644 docs/core/guide/wallets-wallet-files.md create mode 100644 docs/core/guide/wallets-wallet-programs.md create mode 100644 docs/core/guide/wallets.md create mode 100644 docs/core/index.md create mode 100644 docs/core/reference/block-chain-block-headers.md create mode 100644 docs/core/reference/block-chain-serialized-blocks.md create mode 100644 docs/core/reference/block-chain.md create mode 100644 docs/core/reference/improvement-proposals.md create mode 100644 docs/core/reference/introduction.md create mode 100644 docs/core/reference/p2p-network-constants-and-defaults.md create mode 100644 docs/core/reference/p2p-network-control-messages.md create mode 100644 docs/core/reference/p2p-network-data-messages.md create mode 100644 docs/core/reference/p2p-network-deprecated-messages.md create mode 100644 docs/core/reference/p2p-network-governance-messages.md create mode 100644 docs/core/reference/p2p-network-instantsend-messages.md create mode 100644 docs/core/reference/p2p-network-masternode-messages.md create mode 100644 docs/core/reference/p2p-network-message-headers.md create mode 100644 docs/core/reference/p2p-network-privatesend-messages.md create mode 100644 docs/core/reference/p2p-network-protocol-versions.md create mode 100644 docs/core/reference/p2p-network-quorum-messages.md create mode 100644 docs/core/reference/p2p-network.md create mode 100644 docs/core/reference/transactions-address-conversion.md create mode 100644 docs/core/reference/transactions-compactsize-unsigned-integers.md create mode 100644 docs/core/reference/transactions-opcodes.md create mode 100644 docs/core/reference/transactions-raw-transaction-format.md create mode 100644 docs/core/reference/transactions-special-transactions.md create mode 100644 docs/core/reference/transactions.md create mode 100644 docs/core/reference/wallets.md create mode 100644 docs/core/resources/glossary.md create mode 100644 docs/img/dash-d.png create mode 100644 docs/img/dash_logo.png create mode 100644 docs/img/dash_logo_white.png create mode 100644 docs/img/dev/COPYING create mode 100644 docs/img/dev/README create mode 100644 docs/img/dev/animated-en-merkleblock-creation.gif create mode 100644 docs/img/dev/animated-en-merkleblock-parsing.gif create mode 100644 docs/img/dev/en-block-height-vs-depth.dot create mode 100644 docs/img/dev/en-block-height-vs-depth.png create mode 100644 docs/img/dev/en-block-height-vs-depth.svg create mode 100644 docs/img/dev/en-blockchain-fork.dot create mode 100644 docs/img/dev/en-blockchain-fork.png create mode 100644 docs/img/dev/en-blockchain-fork.svg create mode 100644 docs/img/dev/en-blockchain-overview.dot create mode 100644 docs/img/dev/en-blockchain-overview.png create mode 100644 docs/img/dev/en-blockchain-overview.svg create mode 100644 docs/img/dev/en-blocks-first-flowchart.dot create mode 100644 docs/img/dev/en-blocks-first-flowchart.png create mode 100644 docs/img/dev/en-blocks-first-flowchart.svg create mode 100644 docs/img/dev/en-bloom-update.dot create mode 100644 docs/img/dev/en-bloom-update.png create mode 100644 docs/img/dev/en-bloom-update.svg create mode 100644 docs/img/dev/en-btcc-payment-request.png create mode 100644 docs/img/dev/en-cert-order.dot create mode 100644 docs/img/dev/en-cert-order.png create mode 100644 docs/img/dev/en-cert-order.svg create mode 100644 docs/img/dev/en-coinjoin.dot create mode 100644 docs/img/dev/en-coinjoin.png create mode 100644 docs/img/dev/en-coinjoin.svg create mode 100644 docs/img/dev/en-creating-p2pkh-output.dot create mode 100644 docs/img/dev/en-creating-p2pkh-output.png create mode 100644 docs/img/dev/en-creating-p2pkh-output.svg create mode 100644 docs/img/dev/en-creating-p2sh-output.dot create mode 100644 docs/img/dev/en-creating-p2sh-output.png create mode 100644 docs/img/dev/en-creating-p2sh-output.svg create mode 100644 docs/img/dev/en-ecdsa-compressed-public-key.gnuplot create mode 100644 docs/img/dev/en-ecdsa-compressed-public-key.png create mode 100644 docs/img/dev/en-ecdsa-compressed-public-key.svg create mode 100644 docs/img/dev/en-hard-fork.dot create mode 100644 docs/img/dev/en-hard-fork.png create mode 100644 docs/img/dev/en-hard-fork.svg create mode 100644 docs/img/dev/en-hd-cross-generational-key-compromise.dot create mode 100644 docs/img/dev/en-hd-cross-generational-key-compromise.png create mode 100644 docs/img/dev/en-hd-cross-generational-key-compromise.svg create mode 100644 docs/img/dev/en-hd-overview.dot create mode 100644 docs/img/dev/en-hd-overview.png create mode 100644 docs/img/dev/en-hd-overview.svg create mode 100644 docs/img/dev/en-hd-private-parent-to-private-child.dot create mode 100644 docs/img/dev/en-hd-private-parent-to-private-child.png create mode 100644 docs/img/dev/en-hd-private-parent-to-private-child.svg create mode 100644 docs/img/dev/en-hd-public-child-from-public-or-private-parent.dot create mode 100644 docs/img/dev/en-hd-public-child-from-public-or-private-parent.png create mode 100644 docs/img/dev/en-hd-public-child-from-public-or-private-parent.svg create mode 100644 docs/img/dev/en-hd-public-child-from-public-parent.dot create mode 100644 docs/img/dev/en-hd-public-child-from-public-parent.png create mode 100644 docs/img/dev/en-hd-public-child-from-public-parent.svg create mode 100644 docs/img/dev/en-hd-root-keys.dot create mode 100644 docs/img/dev/en-hd-root-keys.png create mode 100644 docs/img/dev/en-hd-root-keys.svg create mode 100644 docs/img/dev/en-hd-tree.dot create mode 100644 docs/img/dev/en-hd-tree.png create mode 100644 docs/img/dev/en-hd-tree.svg create mode 100644 docs/img/dev/en-headers-first-flowchart.dot create mode 100644 docs/img/dev/en-headers-first-flowchart.png create mode 100644 docs/img/dev/en-headers-first-flowchart.svg create mode 100644 docs/img/dev/en-headers-first-moving-window.dot create mode 100644 docs/img/dev/en-headers-first-moving-window.png create mode 100644 docs/img/dev/en-headers-first-moving-window.svg create mode 100644 docs/img/dev/en-ibd-block.dot create mode 100644 docs/img/dev/en-ibd-block.png create mode 100644 docs/img/dev/en-ibd-block.svg create mode 100644 docs/img/dev/en-ibd-getblocks.dot create mode 100644 docs/img/dev/en-ibd-getblocks.png create mode 100644 docs/img/dev/en-ibd-getblocks.svg create mode 100644 docs/img/dev/en-ibd-getblocks2.dot create mode 100644 docs/img/dev/en-ibd-getblocks2.png create mode 100644 docs/img/dev/en-ibd-getblocks2.svg create mode 100644 docs/img/dev/en-ibd-getdata.dot create mode 100644 docs/img/dev/en-ibd-getdata.png create mode 100644 docs/img/dev/en-ibd-getdata.svg create mode 100644 docs/img/dev/en-ibd-getheaders.dot create mode 100644 docs/img/dev/en-ibd-getheaders.png create mode 100644 docs/img/dev/en-ibd-getheaders.svg create mode 100644 docs/img/dev/en-ibd-headers.dot create mode 100644 docs/img/dev/en-ibd-headers.png create mode 100644 docs/img/dev/en-ibd-headers.svg create mode 100644 docs/img/dev/en-ibd-inv.dot create mode 100644 docs/img/dev/en-ibd-inv.png create mode 100644 docs/img/dev/en-ibd-inv.svg create mode 100644 docs/img/dev/en-masternode-sync-initial-dip3.png create mode 100644 docs/img/dev/en-masternode-sync-initial-dip3.svg create mode 100644 docs/img/dev/en-masternode-sync-initial.png create mode 100644 docs/img/dev/en-masternode-sync-initial.svg create mode 100644 docs/img/dev/en-masternode-sync-ongoing.png create mode 100644 docs/img/dev/en-masternode-sync-ongoing.svg create mode 100644 docs/img/dev/en-masternode-sync.odg create mode 100644 docs/img/dev/en-merkle-tree-construction.dot create mode 100644 docs/img/dev/en-merkle-tree-construction.png create mode 100644 docs/img/dev/en-merkle-tree-construction.svg create mode 100644 docs/img/dev/en-micropayment-channel.dot create mode 100644 docs/img/dev/en-micropayment-channel.png create mode 100644 docs/img/dev/en-micropayment-channel.svg create mode 100644 docs/img/dev/en-nbits-overview.dot create mode 100644 docs/img/dev/en-nbits-overview.png create mode 100644 docs/img/dev/en-nbits-overview.svg create mode 100644 docs/img/dev/en-nbits-quick-parse.dot create mode 100644 docs/img/dev/en-nbits-quick-parse.png create mode 100644 docs/img/dev/en-nbits-quick-parse.svg create mode 100644 docs/img/dev/en-orphan-stale-definition.dot create mode 100644 docs/img/dev/en-orphan-stale-definition.png create mode 100644 docs/img/dev/en-orphan-stale-definition.svg create mode 100644 docs/img/dev/en-p2p-control-messages.dot create mode 100644 docs/img/dev/en-p2p-control-messages.png create mode 100644 docs/img/dev/en-p2p-control-messages.svg create mode 100644 docs/img/dev/en-p2p-data-messages.dot create mode 100644 docs/img/dev/en-p2p-data-messages.png create mode 100644 docs/img/dev/en-p2p-data-messages.svg create mode 100644 docs/img/dev/en-p2p-governance-messages.dot create mode 100644 docs/img/dev/en-p2p-governance-messages.png create mode 100644 docs/img/dev/en-p2p-governance-messages.svg create mode 100644 docs/img/dev/en-p2p-instantsend-messages.dot create mode 100644 docs/img/dev/en-p2p-instantsend-messages.png create mode 100644 docs/img/dev/en-p2p-instantsend-messages.svg create mode 100644 docs/img/dev/en-p2p-masternode-messages.dot create mode 100644 docs/img/dev/en-p2p-masternode-messages.png create mode 100644 docs/img/dev/en-p2p-masternode-messages.svg create mode 100644 docs/img/dev/en-p2p-privatesend-messages.dot create mode 100644 docs/img/dev/en-p2p-privatesend-messages.png create mode 100644 docs/img/dev/en-p2p-privatesend-messages.svg create mode 100644 docs/img/dev/en-p2pkh-stack.dot create mode 100644 docs/img/dev/en-p2pkh-stack.png create mode 100644 docs/img/dev/en-p2pkh-stack.svg create mode 100644 docs/img/dev/en-payment-processing.dot create mode 100644 docs/img/dev/en-payment-processing.png create mode 100644 docs/img/dev/en-payment-processing.svg create mode 100644 docs/img/dev/en-payment-protocol.dot create mode 100644 docs/img/dev/en-payment-protocol.png create mode 100644 docs/img/dev/en-payment-protocol.svg create mode 100644 docs/img/dev/en-pooled-mining-overview.dot create mode 100644 docs/img/dev/en-pooled-mining-overview.png create mode 100644 docs/img/dev/en-pooled-mining-overview.svg create mode 100644 docs/img/dev/en-qr-code.png create mode 100644 docs/img/dev/en-qr-code.svg create mode 100644 docs/img/dev/en-signing-output-to-spend.dot create mode 100644 docs/img/dev/en-signing-output-to-spend.png create mode 100644 docs/img/dev/en-signing-output-to-spend.svg create mode 100644 docs/img/dev/en-soft-fork.dot create mode 100644 docs/img/dev/en-soft-fork.png create mode 100644 docs/img/dev/en-soft-fork.svg create mode 100644 docs/img/dev/en-solo-mining-overview.dot create mode 100644 docs/img/dev/en-solo-mining-overview.png create mode 100644 docs/img/dev/en-solo-mining-overview.svg create mode 100644 docs/img/dev/en-transaction-propagation.dot create mode 100644 docs/img/dev/en-transaction-propagation.png create mode 100644 docs/img/dev/en-transaction-propagation.svg create mode 100644 docs/img/dev/en-tx-overview-spending.dot create mode 100644 docs/img/dev/en-tx-overview-spending.png create mode 100644 docs/img/dev/en-tx-overview-spending.svg create mode 100644 docs/img/dev/en-tx-overview.dot create mode 100644 docs/img/dev/en-tx-overview.png create mode 100644 docs/img/dev/en-tx-overview.svg create mode 100644 docs/img/dev/en-unlocking-p2pkh-output.dot create mode 100644 docs/img/dev/en-unlocking-p2pkh-output.png create mode 100644 docs/img/dev/en-unlocking-p2pkh-output.svg create mode 100644 docs/img/dev/en-unlocking-p2sh-output.dot create mode 100644 docs/img/dev/en-unlocking-p2sh-output.png create mode 100644 docs/img/dev/en-unlocking-p2sh-output.svg create mode 100644 docs/img/dev/en-wallets-distributing-only.dot create mode 100644 docs/img/dev/en-wallets-distributing-only.png create mode 100644 docs/img/dev/en-wallets-distributing-only.svg create mode 100644 docs/img/dev/en-wallets-full-service.dot create mode 100644 docs/img/dev/en-wallets-full-service.png create mode 100644 docs/img/dev/en-wallets-full-service.svg create mode 100644 docs/img/dev/en-wallets-signing-only.dot create mode 100644 docs/img/dev/en-wallets-signing-only.png create mode 100644 docs/img/dev/en-wallets-signing-only.svg create mode 100644 docs/img/dev/gifs/README.md create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-001.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-002.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-003.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-004.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-005.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-006.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-007.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-008.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-009.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-010.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-011.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-012.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.svg create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-010.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.dot create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.png create mode 100644 docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.svg create mode 100644 docs/img/icons/icon_warning.png create mode 100644 docs/img/icons/icon_warning.svg diff --git a/conf.py b/conf.py index 08dac367b..729c97e81 100644 --- a/conf.py +++ b/conf.py @@ -73,6 +73,8 @@ 'README.md', '.devcontainer', 'transifex', + 'docs/core/api/ai-prompt.md', + 'docs/img/dev/gifs/README.md', 'docs/user/wallets/electrum/dip3_p2sh_howto.md', 'venv' ] @@ -115,7 +117,6 @@ # -- intersphinx configuration ----------------------------------------------- intersphinx_mapping = { - "core": ("https://docs.dash.org/projects/core/en/stable/", None), "platform": ("https://docs.dash.org/projects/platform/en/stable/", None), } @@ -138,7 +139,6 @@ # html_theme_options = { "external_links": [ - {"name": "Core docs", "url": "https://docs.dash.org/projects/core/en/stable/docs/index.html"}, {"name": "Platform docs", "url": "https://docs.dash.org/projects/platform/en/stable/docs/index.html"}, {"name": "Dash.org", "url": "https://www.dash.org"}, {"name": "Forum", "url": "https://www.dash.org/forum"}, diff --git a/docs/core/api/ai-prompt.md b/docs/core/api/ai-prompt.md new file mode 100644 index 000000000..78b9f8a77 --- /dev/null +++ b/docs/core/api/ai-prompt.md @@ -0,0 +1,116 @@ +## Check documentation against Core help output + +Compare this documentation +``` +INSERT MARKDOWN TABLE FROM DOCS HERE +``` + +With the actual help output +``` +INSERT "HELP " OUTPUT HERE +``` + +Only list any discrepancies (including parameters and/or response fields that have changed to be deprecated) and output markdown table entries in a copyable code block for items missing from the documentation. Use field descriptions from the provided help output without modifying them. + +## Remove the excess whitespace at the end of tables + +Remove the whitespace padding from the last column of this markdown table. do not worry about alignment of the end of the line but do include the ending "|" with a single space before it + +## Create documentation for a new RPC + +Use this RPC documentation as a template to create documentation for new RPCs: + +```## ImportMulti + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). Wallet must be unlocked. +::: + +_Added in Dash Core 0.12.3 / Bitcoin Core 0.14.0_ + +The [`importmulti` RPC](../api/remote-procedure-calls-wallet.md#importmulti) imports addresses or scripts (with private keys, public keys, or P2SH redeem scripts) and optionally performs the minimum necessary rescan for all imports. + +_Parameter #1---the addresses/scripts to import_ + +| Name | Type | Presence | Description| +| --------------------- | --------------------- | ----------------------- | -----------| +| Imports | array | Required
(exactly 1) | An array of JSON objects, each one being an address or script to be imported | +| → Import | object | Required
(1 or more) | A JSON object describing a particular import | +| → →
`scriptPubKey` | string (hex) | Optional
(0 or 1) | The script (string) to be imported. Must have either this field or `address` below | +| → →
`address` | string (base58) | Optional
(0 or 1) | The P2PKH or P2SH address to be imported. Must have either this field or `scriptPubKey` above | +| → →
`timestamp` | number (int) / string | Required
(exactly 1) | The creation time of the key in Unix epoch time or the string “now” to substitute the current synced block chain time. The timestamp of the oldest key will determine how far back block chain rescans need to begin. Specify `now` to bypass scanning for keys which are known to never have been used. Specify `0` to scan the entire block chain. Blocks up to 2 hours before the earliest key creation time will be scanned | +| → →
`redeemscript` | string | Optional
(0 or 1) | A redeem script. Only allowed if either the `address` field is a P2SH address or the `scriptPubKey` field is a P2SH scriptPubKey | +| → →
`pubkeys` | array | Optional
(0 or 1) | Array of strings giving pubkeys that must occur in the scriptPubKey or redeemscript | +| → →
`keys` | array | Optional
(0 or 1) | Array of strings giving private keys whose corresponding public keys must occur in the scriptPubKey or redeemscript | +| → →
`internal` | bool | Optional
(0 or 1) | Stating whether matching outputs should be treated as change rather than incoming payments. The default is `false` | +| → →
`watchonly` | bool | Optional
(0 or 1) | Stating whether matching outputs should be considered watched even when they're not spendable. This is only allowed if keys are empty. The default is `false` | +| → →
`label` | string | Optional
(0 or 1) | Label to assign to the address, only allowed with `internal` set to `false`. The default is an empty string (“”) | + +_Parameter #2---options regarding the import_ + +| Name | Type | Presence | Description | +| -------------- | ------ | -------------------- | ----------- | +| Option | object | Optional
(0 or 1) | JSON object with options regarding the import | +| →
`rescan` | bool | Optional
(0 or 1) | Set to `true` (the default) to rescan the entire local block chain for transactions affecting any imported address or script. Set to `false` to not rescan after the import. Rescanning may take a considerable amount of time and may require re-downloading blocks if using block chain pruning | + +_Result---execution result_ + +| Name | Type | Presence | Description | +| ------------------- | --------------- | ----------------------- | ----------------------------------------------------------------------------------------- | +| `result` | array | Required
(exactly 1) | An array of JSON objects, with each object describing the execution result of each import | +| → Result | object | Required
(1 or more) | A JSON object describing the execution result of an imported address or script | +| → →
`success` | string | Required
(exactly 1) | Displays `true` if the import has been successful or `false` if it failed | +| → →
`error` | string : object | Optional
(0 or 1) | A JSON object containing details about the error. Only displayed if the import fails | +| → → →
`code` | number (int) | Optional
(0 or 1) | The error code | +| → → →
`message` | string | Optional
(0 or 1) | The error message | + +_Example from Dash Core 0.12.3_ + +Import the address `ycCsAUKsjdmoP4qAXiS1cjYA4ixM48zJWe` (giving it a label and scanning the entire block chain) and the scriptPubKey `76a9146cf5870411edc31ba5630d61c7cddff55b884fda88ac` (giving a specific timestamp and label): + +```bash +dash-cli importmulti ' + [ + { + "scriptPubKey" : { "address": "ycCsAUKsjdmoP4qAXiS1cjYA4ixM48zJWe" }, + "timestamp" : 0, + "label" : "Personal" + }, + { + "scriptPubKey" : "76a9146cf5870411edc31ba5630d61c7cddff55b884fda88ac", + "timestamp" : 1493912405, + "label" : "TestFailure" + } + ]' '{ "rescan": true }' +``` + +Result (scriptPubKey import failed because `internal` was not set to `true`): + +```json +[ + { + "success": true + }, + { + "success": false, + "error": { + "code": -8, + "message": "Internal must be set for hex scriptPubKey" + } + } +] +``` + +_See also_ + +* [ImportPrivKey](../api/remote-procedure-calls-wallet.md#importprivkey): adds a private key to your wallet. The key should be formatted in the wallet import format created by the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey). +* [ImportAddress](../api/remote-procedure-calls-wallet.md#importaddress): adds an address or pubkey script to the wallet without the associated private key, allowing you to watch for transactions affecting that address or pubkey script without being able to spend any of its outputs. +* [ImportWallet](../api/remote-procedure-calls-wallet.md#importwallet): imports private keys from a file in wallet dump file format (see the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet)). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes. +``` + + +Create documentation for the following new RPC using the style of previously provided RPC documentation as a template: + +``` +INSERT "HELP " OUTPUT HERE +``` diff --git a/docs/core/api/dash-core-apis-hash-byte-order.md b/docs/core/api/dash-core-apis-hash-byte-order.md new file mode 100644 index 000000000..a38091a35 --- /dev/null +++ b/docs/core/api/dash-core-apis-hash-byte-order.md @@ -0,0 +1,81 @@ +```{eval-rst} +.. meta:: + :title: Hash Byte Order + :description: Dash Core RPCs accept and return the byte-wise reverse of computed SHA-256 hash values. Dash Core's RPCs use the byte-wise reverse for hashes. +``` + +# Hash Byte Order + +Dash Core RPCs accept and return the byte-wise reverse of computed SHA-256 hash values. For example, the Unix `sha256sum` command displays the SHA256(SHA256()) hash of mainnet block 300,000's header as: + +``` shell +> /bin/echo -n '020000007ef055e1674d2e6551dba41cd214debbee34aeb544c7ec670000000000000000d3998963f80c5bab43fe8c26228e98d030edf4dcbe48a666f5c39e2d7a885c9102c86d536c890019593a470d' \ + | xxd -r -p \ + | sha256sum -b \ + | xxd -r -p \ + | sha256sum -b + +5472ac8b1187bfcf91d6d218bbda1eb2405d7c55f1f8cc820000000000000000 (Resulting hash) +``` + +The result above is also how the hash appears in the previous-header-hash part of [block](../resources/glossary.md#block) 300,001's header: + +

020000005472ac8b1187bfcf91d6d218bbda1eb2405d7c55f1f8cc82000\
+0000000000000ab0aaa377ca3f49b1545e2ae6b0667a08f42e72d8c24ae\
+237140e28f14f3bb7c6bcc6d536c890019edd83ccf
+ +However, Dash Core's RPCs use the byte-wise reverse for hashes, so if you want to get information about block 675,776 using the [`getblock` RPC](../api/remote-procedure-calls-blockchain.md#getblock), you need to reverse the requested hash: + +``` shell +> dash-cli getblock \ + 000000000000327a66cd1011b2d1defd1417b7d9e39b439e8e67ba996ee92602 +``` + +:::{note} +Hex representation uses two characters to display each byte of data, which is why the reversed string looks somewhat mangled. +::: + +The rationale for the reversal is unknown, but it likely stems from Dash Core's use of hashes (which are byte arrays in C++) as integers for the purpose of determining whether the hash is below the network target. Whatever the reason for reversing header hashes, the reversal also extends to other hashes used in RPCs, such as [TXIDs](../resources/glossary.md#transaction-identifiers) and merkle roots. + +As header hashes and TXIDs are widely used as global identifiers in other Dash software, this reversal of hashes has become the standard way to refer to certain objects. The table below should make clear where each byte order is used. + +| Data | Internal Byte Order | RPC Byte Order | +|---------------|---------------------|-----------------| +| Example: SHA256(SHA256(0x00)) | Hash: 1406...539a | Hash: 9a53...0614 | +|---------------|---------------------|-----------------| +| Header Hashes: SHA256(SHA256(block header)) | Used when constructing block headers | Used by RPCs such as `getblock`; widely used in block explorers | +|---------------|---------------------|-----------------| +| Merkle Roots: SHA256(SHA256(TXIDs and merkle rows)) | Used when constructing block headers | Returned by RPCs such as `getblock` | +|---------------|---------------------|-----------------| +| TXIDs: SHA256(SHA256(transaction)) | Used in transaction inputs | Used by RPCs such as `gettransaction` and transaction data parts of `getblock`; widely used in wallet programs | +|---------------|---------------------|-----------------| +| P2PKH Hashes: RIPEMD160(SHA256(pubkey)) | Used in both addresses and pubkey scripts | **N/A:** RPCs use addresses which use internal byte order | +|---------------|---------------------|-----------------| +| P2SH Hashes: RIPEMD160(SHA256(redeem script)) | Used in both addresses and pubkey scripts | **N/A:** RPCs use addresses which use internal byte order | +|---------------|---------------------|-----------------| + +:::{note} +Note: RPCs which return raw results, such as `getrawtransaction` or the raw mode of `getblock`, always display hashes as they appear in blocks ([internal byte order](../resources/glossary.md#internal-byte-order)). +::: + +The code below may help you check byte order by generating hashes from raw hex. + +``` python +from sys import byteorder +from hashlib import sha256 +import codecs + +decode_hex = codecs.getdecoder('hex_codec') +encode_hex = codecs.getencoder('hex_codec') + +# You can put in $data an 80-byte block header to get its header hash, +# or a raw transaction to get its txid +data = decode_hex('00')[0] +data_hash = sha256(sha256(data).digest()).digest() + +print("Warning: this code only tested on a little-endian x86_64 arch") +print() +print("System byte order: ", byteorder) +print("Internal-Byte-Order Hash: ", encode_hex(data_hash)[0]) +print("RPC-Byte-Order Hash: ", encode_hex(data_hash[::-1])[0]) +``` diff --git a/docs/core/api/http-rest-quick-reference.md b/docs/core/api/http-rest-quick-reference.md new file mode 100644 index 000000000..c91632829 --- /dev/null +++ b/docs/core/api/http-rest-quick-reference.md @@ -0,0 +1,11 @@ +# Quick Reference + +* [GET Block](../api/http-rest-requests.md#get-block) gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. _Updated in Bitcoin Core 0.13.0_ +* [GET Block/NoTxDetails](../api/http-rest-requests.md#get-blocknotxdetails) gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. The JSON object includes TXIDs for transactions within the block rather than the complete transactions [GET block](../api/http-rest-requests.md#get-block) returns. _Updated in Bitcoin Core 0.13.0_ +* [GET BlockHashByHeight](../api/http-rest-requests.md#get-blockhashbyheight) returns the hash of a block in best-block-chain at the height provided. The hash can be returned as a JSON object or serialized as binary or hex. _Added in Dash Core 18.0.0_ +* [GET ChainInfo](../api/http-rest-requests.md#get-chaininfo) returns information about the current state of the block chain. _Updated in Bitcoin Core 0.12.0_ +* [GET GetUtxos](../api/http-rest-requests.md#get-getutxos) returns an UTXO set given a set of outpoints. _New in Bitcoin Core 0.11.0_ +* [GET Headers](../api/http-rest-requests.md#get-headers) returns a specified amount of block headers in upward direction. _Updated in Bitcoin Core 0.13.0_ +* [GET MemPool/Contents](../api/http-rest-requests.md#get-mempoolcontents) returns all transaction in the memory pool with detailed information. _New in Bitcoin Core 0.12.0_ +* [GET MemPool/Info](../api/http-rest-requests.md#get-mempoolinfo) returns information about the node's current transaction memory pool. _New in Bitcoin Core 0.12.0_ +* [GET Tx](../api/http-rest-requests.md#get-tx) gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so this method may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. _Updated in Bitcoin Core 0.13.0_ diff --git a/docs/core/api/http-rest-requests.md b/docs/core/api/http-rest-requests.md new file mode 100644 index 000000000..f5271a3af --- /dev/null +++ b/docs/core/api/http-rest-requests.md @@ -0,0 +1,1030 @@ +```{eval-rst} +.. meta:: + :title: Requests + :description: Provides details about Dash Core HTTP REST API endpoints. +``` + +# Requests + +## GET Block + +The `GET block` operation gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. + +*Request* + +``` text +GET /block/. +``` + +*Parameter #1---the header hash of the block to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | path (hex) | Required
(exactly 1) | The hash of the header of the block to get, encoded as hex in RPC byte order + +*Parameter #2---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded block contents in JSON, or `.bin` or `hex` for a serialized block in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +Result | object | Required
(exactly 1) | An object containing the requested block +→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→
`size` | number (int) | Required
(exactly 1) | The size of this block in serialized block format, counted in bytes +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→
`versionHex` | number (int) | Required
(exactly 1) | This block's version number formatted in hexadecimal. +→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→
`tx` | array | Required
(exactly 1) | An array containing all transactions in this block. The transactions appear in the array in the same order they appear in the serialized block +→ →
Transaction | object | Required
(1 or more) | An object describing a particular transaction within this block +→ → →
`txid` | string (hex) | Required
(exactly 1) | The transaction's TXID encoded as hex in RPC byte order +→ → →
`size` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The serialized transaction size +→ → →
`version` | number (int) | Required
(exactly 1) | The transaction format version number +→ → →
`type` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.13.0.0*

The transaction format type +→ → →
`locktime` | number (int) | Required
(exactly 1) | The transaction's locktime: either a Unix epoch date or block height; see the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md#locktime-parsing-rules) +→ → →
`vin` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction. Input objects will have the same order within the array as they have in the transaction, so the first input listed will be input 0 +→ → → →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase +→ → → → →
`txid` | string | Optional
(0 or 1) | The TXID of the outpoint being spent, encoded as hex in RPC byte order. Not present if this is a coinbase transaction +→ → → → →
`vout` | number (int) | Optional
(0 or 1) | The output index number (vout) of the outpoint being spent. The first output in a transaction has an index of `0`. Not present if this is a coinbase transaction +→ → → → →
`scriptSig` | object | Optional
(0 or 1) | An object describing the signature script of this input. Not present if this is a coinbase transaction +→ → → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed +→ → → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex +→ → → → →
`coinbase` | string (hex) | Optional
(0 or 1) | The coinbase (similar to the hex field of a scriptSig) encoded as hex. Only present if this is a coinbase transaction +→ → → → →
`value` | number (Dash) | Optional
(exactly 1) | The number of Dash paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → → → →
`valueSat` | number (duffs) | Optional
(exactly 1) | The number of duffs paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types.

Only present if `spentindex` enabled +→ → → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→ → → → →
`sequence` | number (int) | Required
(exactly 1) | The input sequence number +→ → →
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 +→ → → →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs +→ → → → →
`value` | number (Dash) | Required
(exactly 1) | The number of Dash paid to this output. May be `0` +→ → → → →
`valueSat` | number (duffs) | Required
(exactly 1) | The number of duffs paid to this output. May be `0` +→ → → → →
`n` | number (int) | Required
(exactly 1) | The output index number of this output within this transaction +→ → → → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script +→ → → → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed +→ → → → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex +→ → → → → →
`reqSigs` | number (int) | Optional
(0 or 1) | The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) +→ → → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts +→ → → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types +→ → → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→ → →
`extraPayloadSize` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Size of the DIP2 extra payload. Only present if it's a DIP2 special transaction +→ → →
`extraPayload` | string (hex) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Hex encoded DIP2 extra payload data. Only present if it's a DIP2 special transaction +→
`time` | number (int) | Required
(exactly 1) | The value of the *time* field in the block header, indicating approximately when the block was created +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median time of the 11 blocks before the most recent block on the blockchain. Used for validating transaction locktime under BIP113 +→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`previousblockhash` | string (hex) | Required
(exactly 1) | The hash of the header of the previous block, encoded as hex in RPC byte order +→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order + +*Examples from Dash Core 0.12.2* + +Request a block in hex-encoded serialized block format: + +``` bash +curl http://localhost:19998/rest/block/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.hex +``` + +Result (wrapped): + +``` bash +0000002097e8135d73afa52145f6d0b4d0f957030cd598837ddc6750271fb109\ +000000008478305a7abf2f7cb21a889fb68d53c3e51685349e18e1b104b5956c\ +100bfea2c72d285a84030a1cd0041ed701010000000100000000000000000000\ +00000000000000000000000000000000000000000000ffffffff13037a94000e\ +2f5032506f6f6c2d74444153482fffffffff06a1f9ef04000000001976a91414\ +e3832cd7192ffb358a31d842636c4db8dfb1ac88ac6c357f3c000000001976a9\ +149262f2289e1f021dca954d8cf07a7ad72c2cc24d88ac31f49e010000000019\ +76a914d93f7ffa324b77d361e89a3c9c8df46ccdb4b39288ac40230e43000000\ +001976a914c4541983721b26ada79770bf22de4885e19f566188ac0200000000\ +0000004341047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9\ +440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d72\ +81bdc9430f35ac00000000000000002a6a28c855abe6461b1003ea36feb88a3b\ +d50c5696e5784d11f8cd5e892978685de1d6000000000100000000000000 +``` + +Get the same block in JSON: + +``` bash +curl http://localhost:19998/rest/block/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.json +``` + +Result (whitespace added): + +``` json +{ + "hash":"0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451", + "confirmations":20, + "size":414, + "height":38010, + "version":536870912, + "merkleroot":"a2fe0b106c95b504b1e1189e348516e5c3538db69f881ab27c2fbf7a5a307884", + "tx":[ + { + "txid":"a2fe0b106c95b504b1e1189e348516e5c3538db69f881ab27c2fbf7a5a307884", + "size":333, + "version":1, + "locktime":0, + "vin":[ + { + "coinbase":"037a94000e2f5032506f6f6c2d74444153482f", + "sequence":4294967295 + } + ], + "vout":[ + { + "value":0.82835873, + "valueSat":82835873, + "n":0, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 14e3832cd7192ffb358a31d842636c4db8dfb1ac OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a91414e3832cd7192ffb358a31d842636c4db8dfb1ac88ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "yNDtusuhm6otr3eeGh3SqdpNczV4aZSx1b" + ] + } + }, + { + "value":10.14969708, + "valueSat":1014969708, + "n":1, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 9262f2289e1f021dca954d8cf07a7ad72c2cc24d OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a9149262f2289e1f021dca954d8cf07a7ad72c2cc24d88ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "yZfU36R8dhdnFaK3AwfnubrLXAG2G1WiVn" + ] + } + }, + { + "value":0.27194417, + "valueSat":27194417, + "n":2, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 d93f7ffa324b77d361e89a3c9c8df46ccdb4b392 OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a914d93f7ffa324b77d361e89a3c9c8df46ccdb4b39288ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "yg89Yt5Tjzs9nRpX3wJCuvr7KuQvgkvmeC" + ] + } + }, + { + "value":11.25000000, + "valueSat":1125000000, + "n":3, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 c4541983721b26ada79770bf22de4885e19f5661 OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a914c4541983721b26ada79770bf22de4885e19f566188ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "yeDY39aiqbBHbJft5F6rokR23EaZca6UTU" + ] + } + }, + { + "value":0.00000002, + "valueSat":2, + "n":4, + "scriptPubKey":{ + "asm":"047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d7281bdc9430f35 OP_CHECKSIG", + "hex":"41047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d7281bdc9430f35ac", + "reqSigs":1, + "type":"pubkey", + "addresses":[ + "yb21342iADyqAotjwcn4imqjvAcdYhnzeH" + ] + } + }, + { + "value":0.00000000, + "valueSat":0, + "n":5, + "scriptPubKey":{ + "asm":"OP_RETURN c855abe6461b1003ea36feb88a3bd50c5696e5784d11f8cd5e892978685de1d60000000001000000", + "hex":"6a28c855abe6461b1003ea36feb88a3bd50c5696e5784d11f8cd5e892978685de1d60000000001000000", + "type":"nulldata" + } + } + ] + } + ], + "time":1512582599, + "mediantime":1512582025, + "nonce":3609068752, + "bits":"1c0a0384", + "difficulty":25.56450187425715, + "chainwork":"00000000000000000000000000000000000000000000000000092fc476457b68", + "previousblockhash":"0000000009b11f275067dc7d8398d50c0357f9d0b4d0f64521a5af735d13e897", + "nextblockhash":"0000000000a9baff28a79db2a50e13af8f313138f4568339f58d73eda14a4d51" +} +``` + +*See also* + +* [GET Block/NoTxDetails](../api/http-rest-requests.md#get-blocknotxdetails) gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. The JSON object includes TXIDs for transactions within the block rather than the complete transactions [GET block](../api/http-rest-requests.md#get-block) returns. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash) RPC: returns the header hash of the most recent block on the best block chain. +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock) RPC: gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash) RPC: returns the header hash of a block at the given height in the local best block chain. + +## GET Block/NoTxDetails + +The `GET block/notxdetails` operation gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. The JSON object includes TXIDs for transactions within the block rather than the complete transactions [GET block](../api/http-rest-requests.md#get-block) returns. + +*Request* + +``` text +GET /block/notxdetails/. +``` + +*Parameter #1---the header hash of the block to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | path (hex) | Required
(exactly 1) | The hash of the header of the block to get, encoded as hex in RPC byte order + +*Parameter #2---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded block contents in JSON, or `.bin` or `hex` for a serialized block in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +Result | object | Required
(exactly 1) | An object containing the requested block +→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→
`size` | number (int) | Required
(exactly 1) | The size of this block in serialized block format, counted in bytes +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→
`versionHex` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

This block's version number formatted in hexadecimal. See [BIP9 assignments] +→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→
`tx` | array | Required
(exactly 1) | An array containing all transactions in this block. The transactions appear in the array in the same order they appear in the serialized block +→ →
TXID | string (hex) | Required
(1 or more) | The TXID of a transaction in this block, encoded as hex in RPC byte order +→
`time` | number (int) | Required
(exactly 1) | The value of the *time* field in the block header, indicating approximately when the block was created +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median time of the 11 blocks before the most recent block on the blockchain. Used for validating transaction locktime under BIP113 +→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`previousblockhash` | string (hex) | Required
(exactly 1) | The hash of the header of the previous block, encoded as hex in RPC byte order +→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order + +*Examples from Dash Core 0.12.2* + +Request a block in hex-encoded serialized block format: + +``` bash +curl http://localhost:19998/rest/block/notxdetails/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.hex +``` + +Result (wrapped): + +``` bash +0000002097e8135d73afa52145f6d0b4d0f957030cd598837ddc6750271fb109\ +000000008478305a7abf2f7cb21a889fb68d53c3e51685349e18e1b104b5956c\ +100bfea2c72d285a84030a1cd0041ed701010000000100000000000000000000\ +00000000000000000000000000000000000000000000ffffffff13037a94000e\ +2f5032506f6f6c2d74444153482fffffffff06a1f9ef04000000001976a91414\ +e3832cd7192ffb358a31d842636c4db8dfb1ac88ac6c357f3c000000001976a9\ +149262f2289e1f021dca954d8cf07a7ad72c2cc24d88ac31f49e010000000019\ +76a914d93f7ffa324b77d361e89a3c9c8df46ccdb4b39288ac40230e43000000\ +001976a914c4541983721b26ada79770bf22de4885e19f566188ac0200000000\ +0000004341047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9\ +440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d72\ +81bdc9430f35ac00000000000000002a6a28c855abe6461b1003ea36feb88a3b\ +d50c5696e5784d11f8cd5e892978685de1d6000000000100000000000000 +``` + +Get the same block in JSON: + +``` bash +curl http://localhost:19998/rest/block/notxdetails/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.json +``` + +Result (whitespace added): + +``` json +{ + "hash":"0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451", + "confirmations":55, + "size":414, + "height":38010, + "version":536870912, + "merkleroot":"a2fe0b106c95b504b1e1189e348516e5c3538db69f881ab27c2fbf7a5a307884", + "tx":[ + "a2fe0b106c95b504b1e1189e348516e5c3538db69f881ab27c2fbf7a5a307884" + ], + "time":1512582599, + "mediantime":1512582025, + "nonce":3609068752, + "bits":"1c0a0384", + "difficulty":25.56450187425715, + "chainwork":"00000000000000000000000000000000000000000000000000092fc476457b68", + "previousblockhash":"0000000009b11f275067dc7d8398d50c0357f9d0b4d0f64521a5af735d13e897", + "nextblockhash":"0000000000a9baff28a79db2a50e13af8f313138f4568339f58d73eda14a4d51" +} +``` + +*See also* + +* [GET Block](../api/http-rest-requests.md#get-block): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock) RPC: gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash) RPC: returns the header hash of a block at the given height in the local best block chain. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash) RPC: returns the header hash of the most recent block on the best block chain. + +## GET BlockHashByHeight + +The `GET blockhashbyheight` operation returns the hash of a block in best-block-chain at the height provided. The hash can be returned as a JSON object or serialized as binary or hex. + +*Request* + +``` text +GET /blockhashbyheight/. +``` + +*Parameter #1---the header hash of the block to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block Height | number (int) | Required
(exactly 1) | The height of the block hash to get + +*Parameter #2---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded block hash contents in JSON, or `.bin` or `hex` for a serialized block hash in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | An object containing the block hash for the requested height +→
`blockhash` | string | Required
(exactly 1) | Block hash for the requested height + +*Examples from Dash Core 18.0.0* + +Request a block hash in hex-encoded serialized block hash format: + +``` bash +curl http://localhost:19998/rest/blockhashbyheight/1.hex +``` + +Result: + +```text +0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1 +``` + +Get the same block hash in JSON: + +``` bash +curl http://localhost:19998/rest/blockhashbyheight/1.json +``` + +Result: + +```json +{ + "blockhash": "0000047d24635e347be3aaaeb66c26be94901a2f962feccd4f95090191f208c1" +} +``` + +*See also* + +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash) RPC: returns the header hash of a block at the given height in the local best block chain. + +## GET ChainInfo + +The `GET chaininfo` operation returns information about the current state of the block chain. Supports only `json` as output format. + +*Request* + +``` text +GET /chaininfo.json +``` + +*Parameters: none* + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the current state of the local block chain +→
`chain` | string | Required
(exactly 1) | The name of the block chain. One of `main` for mainnet, `test` for testnet, or `regtest` for regtest +→
`blocks` | number (int) | Required
(exactly 1) | The number of validated blocks in the local best block chain. For a new node with just the hardcoded genesis block, this will be 0 +→
`headers` | number (int) | Required
(exactly 1) | The number of validated headers in the local best headers chain. For a new node with just the hardcoded genesis block, this will be zero. This number may be higher than the number of *blocks* +→
`bestblockhash` | string (hex) | Required
(exactly 1) | The hash of the header of the highest validated block in the best block chain, encoded as hex in RPC byte order. This is identical to the string returned by the [`getbestblockhash` RPC](../api/remote-procedure-calls-blockchain.md#getbestblockhash) +→
`difficulty` | number (real) | Required
(exactly 1) | The difficulty of the highest-height block in the best block chain +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median time of the 11 blocks before the most recent block on the blockchain. Used for validating transaction locktime under BIP113 +→
`verificationprogress` | number (real) | Required (exactly 1) | Estimate of what percentage of the block chain transactions have been verified so far, starting at 0.0 and increasing to 1.0 for fully verified. May slightly exceed 1.0 when fully synced to account for transactions in the memory pool which have been verified before being included in a block +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes checked from the genesis block to this block, encoded as big-endian hex +→
`pruned` | bool | Required
(exactly 1) | Indicates if the blocks are subject to pruning +→
`pruneheight` | number (int) | Optional
(0 or 1) | The lowest-height complete block stored if pruning is activated +→
`softforks` | array | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

An array of objects each describing a current or previous soft fork +→ →
Softfork | object | Required
(3 or more) | A specific softfork +→ → →
`id` | string | Required
(exactly 1) | The name of the softfork +→ → →
`version` | numeric
(int) | Required
(exactly 1) | The block version used for the softfork +→ → →
`enforce` | string : object | Optional
(0 or 1) | The progress toward enforcing the softfork rules for new-version blocks +→ → → →
`status` | bool | Required
(exactly 1) | Indicates if the threshold was reached +→ → → →
`found` | numeric
(int) | Optional
(0 or 1) | Number of blocks that support the softfork +→ → → →
`required` | numeric
(int) | Optional
(0 or 1) | Number of blocks that are required to reach the threshold +→ → → →
`window` | numeric
(int) | Optional
(0 or 1) | The maximum size of examined window of recent blocks +→ → →
`reject` | object | Optional
(0 or 1) | The progress toward enforcing the softfork rules for new-version blocks +→ → → →
`status` | bool | Optional
(0 or 1) | Indicates if the threshold was reached +→ → → →
`found` | numeric
(int) | Optional
(0 or 1) | Number of blocks that support the softfork +→ → → →
`required` | numeric
(int) | Optional
(0 or 1) | Number of blocks that are required to reach the threshold +→ → → →
`window` | numeric
(int) | Optional
(0 or 1) | The maximum size of examined window of recent blocks +→
`bip9_softforks` | object | Required
(exactly 1) | *Added in Bitcoin Core 0.12.1*

The status of BIP9 softforks in progress +→ →
Name | string : object | Required
(1 or more) | A specific BIP9 softfork +→ → →
`status` | string | Required
(exactly 1) | Set to one of the following reasons:
• `defined` if voting hasn't started yet
• `started` if the voting has started
• `locked_in` if the voting was successful but the softfort hasn't been activated yet
• `active` if the softfork was activated
• `failed` if the softfork has not receieved enough votes + +*Examples from Dash Core 0.12.2* + +Get blockchain info in JSON: + +``` bash +curl http://localhost:19998/rest/chaininfo.json +``` + +Result (whitespace added): + +``` json +{ + "chain":"test", + "blocks":38066, + "headers":38066, + "bestblockhash":"0000000006c6f812d4721c09b3a3ce6547d2291ff822ee39597515f75822ed3e", + "difficulty":18.8278810867833, + "mediantime":1512591324, + "verificationprogress":0.9999996159024219, + "chainwork":"00000000000000000000000000000000000000000000000000093549c2729cb1", + "pruned":false, + "softforks":[ + { + "id":"bip34", + "version":2, + "enforce":{ + "status":true, + "found":100, + "required":51, + "window":100 + }, + "reject":{ + "status":true, + "found":100, + "required":75, + "window":100 + } + }, + { + "id":"bip66", + "version":3, + "enforce":{ + "status":true, + "found":100, + "required":51, + "window":100 + }, + "reject":{ + "status":true, + "found":100, + "required":75, + "window":100 + } + }, + { + "id":"bip65", + "version":4, + "enforce":{ + "status":true, + "found":100, + "required":51, + "window":100 + }, + "reject":{ + "status":true, + "found":100, + "required":75, + "window":100 + } + } + ], + "bip9_softforks":[ + { + "id":"csv", + "status":"active" + }, + { + "id":"dip0001", + "status":"active" + } + ] +} +``` + +*See also* + +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo) RPC: provides information about the current state of the block chain. + +## GET GetUtxos + +The `GET getutxos` operation returns an UTXO set given a set of outpoints. + +*Request* + +``` text +GET /getutxos//-/-/.../-. +``` + +*Parameter #1---Include memory pool transactions* + +Name | Type | Presence | Description +--- | --- | --- | --- +Check mempool | string | Optional
(0 or 1) | Set to `checkmempool` to include transactions that are currently in the memory pool to the calculation + +*Parameter #2---List of Outpoints* + +Name | Type | Presence | Description +--- | --- | --- | --- +Outpoint | vector | Required
(1 or more) | The list of outpoints to be queried. Each outpoint is the TXID of the transaction, encoded as hex in RPC byte order with an additional `-n` parameter for the output index (vout) number, with the index starting from 0 + +*Parameter #3---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded block contents in JSON, or `.bin` or `hex` for a serialized block in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | The requested UTXO set +→→
`chainHeight` | number (int) | Required
(exactly 1) | The height of the chain at the moment the result was calculated +→
`chaintipHash` | number (int) | Required
(exactly 1) | The block hash of the top of the chain at the moment the result was calculated +→
`bitmap` | number (int) | Required
(exactly 1) | Whether each requested output was found in the UTXO set or not. A `1` is returned for those that were found and a `0` is returned for those that were not found. Results are returned in the same order as outpoints were requested in the input parameters +→
`utxos` | array | Required
(exactly 1) | An array of objects each describing an outpoint that is unspent +→→`Unspent Outpoint` | object | Optional
(0 or more) | A UTXO match based on the query +→→→
`txvers` | number (int) | Required
(exactly 1) | The version number of the transaction the UTXO was found in +→
`height` | number (int) | Required (exactly 1) | The height of the block containing the defining transaction, or 0x7FFFFFFF if the tx is in the mempool +→ → →
`value` | number (int) | Required
(exactly 1) | The value of the transaction +→ → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script +→ → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed +→ → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex +→ → → →
`reqSigs` | number (int) | Optional
(0 or 1) | The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) +→ → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts +→ → → →
`addresses` | string : array | Optional
(0 or 1) | Array of P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types +→ → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address + +*Examples from Dash Core 0.12.2* + +Request the UTXO set: + +``` bash +curl http://localhost:19998/rest/getutxos/checkmempool/7b6caf68c33794b0bda65e63691739919f13156b57c7ec20a0b4de1f33c580bd-0.hex +``` + +Result (wrapped): + +``` bash +c39400005ac8db505390f3c77635132117a7fdf07b2eb45c3d9fe38535b77b05\ +0000000001010101000000c394000050ae3b16000000001976a9146f4def95a3\ +15e83bef5e1197ace4aa7ec55f2ecc88ac +``` + +Same request in JSON: + +``` bash +curl http://localhost:19998/rest/getutxos/checkmempool/7b6caf68c33794b0bda65e63691739919f13156b57c7ec20a0b4de1f33c580bd-0.json +``` + +Result (whitespace added): + +``` json +{ + "chainHeight":38083, + "chaintipHash":"00000000057bb73585e39f3d5cb42e7bf0fda71721133576c7f3905350dbc85a", + "bitmap":"1", + "utxos":[ + { + "txvers":1, + "height":38083, + "value":3.73010000, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 6f4def95a315e83bef5e1197ace4aa7ec55f2ecc OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a9146f4def95a315e83bef5e1197ace4aa7ec55f2ecc88ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "yWTyDaMb1KZSRYwrq2DDW3Q4rKYuuPutDS" + ] + } + } + ] +} +``` + +*See also* + +* [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo) RPC: returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. + +## GET Headers + +The `GET headers` operation returns a specified amount of block headers in upward direction. + +*Request* + +``` text +GET /headers//. +``` + +*Parameter #1---the amount of block headers to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +Amount | number (int) | Required
(exactly 1) | The amount of block headers in upward direction to return (including the start header hash) + +*Parameter #2---the header hash of the block to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | path (hex) | Required
(exactly 1) | The hash of the header of the block to get, encoded as hex in RPC byte order + +*Parameter #3---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded block contents in JSON, or `.bin` or `hex` for a serialized block in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +Result | array | Required
(exactly 1) | An array containing the requested block headers +→
Block Header | object | Required
(1 or more) | An object containing a block header. The amount of the objects is the same as the amount provided in parameter #1 +→→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #2 +→→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→→
`time` | number (int) | Required
(exactly 1) | The value of the *time* field in the block header, indicating approximately when the block was created +→→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median time of the 11 blocks before the most recent block on the blockchain. Used for validating transaction locktime under BIP113 +→→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→→
`previousblockhash` | string (hex) | Required
(exactly 1) | The hash of the header of the previous block, encoded as hex in RPC byte order +→→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order + +*Examples from Dash Core 0.12.2* + +Request 2 block headers in hex-encoded serialized block format: + +``` bash +curl http://localhost:19998/rest/headers/2/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.hex +``` + +Result (wrapped): + +``` bash +0000002097e8135d73afa52145f6d0b4d0f957030cd598837ddc6750271fb109\ +000000008478305a7abf2f7cb21a889fb68d53c3e51685349e18e1b104b5956c\ +100bfea2c72d285a84030a1cd0041ed70000002051b45fe788d100ff8be0bc39\ +e88b59829f01c17a82786bcf46bfcc000000000004dc24bddd15f790efcd7af3\ +8d03f805cc1c74516888ccec8874db2ac8beb043092e285a999f091c5d6ec419 +``` + +Get the same block headers in JSON: + +``` bash +curl http://localhost:19998/rest/headers/2/0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451.json +``` + +Result (whitespace added): + +``` json +[ + { + "hash":"0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451", + "confirmations":80, + "height":38010, + "version":536870912, + "merkleroot":"a2fe0b106c95b504b1e1189e348516e5c3538db69f881ab27c2fbf7a5a307884", + "time":1512582599, + "mediantime":1512582025, + "nonce":3609068752, + "bits":"1c0a0384", + "difficulty":25.56450187425715, + "chainwork":"00000000000000000000000000000000000000000000000000092fc476457b68", + "previousblockhash":"0000000009b11f275067dc7d8398d50c0357f9d0b4d0f64521a5af735d13e897", + "nextblockhash":"0000000000a9baff28a79db2a50e13af8f313138f4568339f58d73eda14a4d51" + }, + { + "hash":"0000000000a9baff28a79db2a50e13af8f313138f4568339f58d73eda14a4d51", + "confirmations":79, + "height":38011, + "version":536870912, + "merkleroot":"43b0bec82adb7488eccc886851741ccc05f8038df37acdef90f715ddbd24dc04", + "time":1512582665, + "mediantime":1512582146, + "nonce":432303709, + "bits":"1c099f99", + "difficulty":26.60134045579303, + "chainwork":"00000000000000000000000000000000000000000000000000092fdf1051882b", + "previousblockhash":"0000000000ccbf46cf6b78827ac1019f82598be839bce08bff00d188e75fb451", + "nextblockhash":"0000000008de9da638149042323fc05ded619a922ff1fac6e66f66fc773bd716" + } +] +``` + +*See also* + +* [GET Block/NoTxDetails](../api/http-rest-requests.md#get-blocknotxdetails) gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. The JSON object includes TXIDs for transactions within the block rather than the complete transactions [GET block](../api/remote-procedure-calls-blockchain.md#getblock) returns. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash) RPC: returns the header hash of a block at the given height in the local best block chain. +* [GetBlockHeader](../api/remote-procedure-calls-blockchain.md#getblockheader) RPC: gets a block header with a particular header hash from the local block database either as a JSON object or as a serialized block header. + +## GET MemPool/Contents + +The `GET mempool/contents` operation returns all transaction in the memory pool with detailed information. Supports only `json` as output format. + +*Request* + +``` text +GET /mempool/contents.json +``` + +*Parameters: none* + +*Result as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty +→
TXID | string : object | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order +→ →
`size` | number (int) | Required
(exactly 1) | The size of the serialized transaction in bytes +→ →
`fee` | number (bitcoins) | Required
(exactly 1) | The transaction fee paid by the transaction in decimal bitcoins +→ →
`modifiedfee` | number (bitcoins) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The transaction fee with fee deltas used for mining priority in decimal bitcoins +→ →
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format +→ →
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool +→ →
`startingpriority` | number (int) | Required
(exactly 1) | The priority of the transaction when it first entered the memory pool +→ →
`currentpriority` | number (int) | Required
(exactly 1) | The current priority of the transaction +→ →
`descendantcount` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The number of in-mempool descendant transactions (including this one) +→ →
`descendantsize` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The size of in-mempool descendants (including this one) +→ →
`descendantfees` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→ →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty +→ → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order + +*Examples from Dash Core 0.12.2* + +Get all transactions in the memory pool in JSON: + +``` bash +curl http://localhost:19998/rest/mempool/contents.json +``` + +Result (whitespace added): + +``` json +{ + "b06edec446fbcc0fc04a6e2774a843823f5238c2e15de40e61767a44f6788d32":{ + "size":225, + "fee":0.00010000, + "modifiedfee":0.00010000, + "time":1512596309, + "height":38094, + "startingpriority":1934576927.410256, + "currentpriority":1934576927.410256, + "descendantcount":1, + "descendantsize":225, + "descendantfees":10000, + "depends":[ + + ] + } +} +``` + +*See also* + +* [GET MemPool/Info](../api/http-rest-requests.md#get-mempoolinfo): returns information about the node's current transaction memory pool. +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo) RPC: returns information about the node's current transaction memory pool. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool) RPC: returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. + +## GET MemPool/Info + +The `GET mempool/info` operation returns information about the node's current transaction memory pool. Supports only `json` as output format. + +*Request* + +``` text +GET /mempool/info.json +``` + +*Parameters: none* + +*Result as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing information about the memory pool +→
`size` | number (int) | Required
(exactly 1) | The number of transactions currently in the memory pool +→
`bytes` | number (int) | Required
(exactly 1) | The total number of bytes in the transactions in the memory pool +→
`usage` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.11.0*

Total memory usage for the mempool in bytes +→
`maxmempool` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

Maximum memory usage for the mempool in bytes +→
`mempoolminfee` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The lowest fee per kilobyte paid by any transaction in the memory pool + +*Examples from Dash Core 0.12.2* + +Get memory pool info in JSON: + +``` bash +curl http://localhost:19998/rest/mempool/info.json +``` + +Result (whitespace added): + +``` json +{ + "size":1, + "bytes":1256, + "usage":3376, + "maxmempool":300000000, + "mempoolminfee":0.00000000 +} +``` + +*See also* + +* [GET MemPool/Contents](../api/http-rest-requests.md#get-mempoolcontents): returns all transaction in the memory pool with detailed information. +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo) RPC: returns information about the node's current transaction memory pool. + +## GET Tx + +The `GET tx` operation gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so this method may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. + +:::{note} +If you begin using `txindex=1` after downloading the block chain, you must rebuild your indexes by starting Dash Core with the option `-reindex`. This may take several hours to complete, during which time your node will not process new blocks or transactions. This reindex only needs to be done once. +::: + +*Request* + +``` text +GET /tx/. +``` + +*Parameter #1---the TXID of the transaction to retrieve* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | path (hex) | Required
(exactly 1) | The TXID of the transaction to get, encoded as hex in RPC byte order + +*Parameter #2---the output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | suffix | Required
(exactly 1) | Set to `.json` for decoded transaction contents in JSON, or `.bin` or `hex` for a serialized transaction in binary or hex + +*Response as JSON* + +Name | Type | Presence | Description +--- | --- | --- | --- +Result | object | Required
(exactly 1) | An object describing the request transaction +→
`txid` | string (hex) | Required
(exactly 1) | The transaction's TXID encoded as hex in RPC byte order +→
`size` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The serialized transaction size +→
`version` | number (int) | Required
(exactly 1) | The transaction format version number +→
`type` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.13.0.0*

The transaction format type +→
`locktime` | number (int) | Required
(exactly 1) | The transaction's locktime: either a Unix epoch date or block height; see the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md#locktime-parsing-rules) +→
`vin` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction. Input objects will have the same order within the array as they have in the transaction, so the first input listed will be input 0 +→ →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase +→ → →
`txid` | string | Optional
(0 or 1) | The TXID of the outpoint being spent, encoded as hex in RPC byte order. Not present if this is a coinbase transaction +→ → →
`vout` | number (int) | Optional
(0 or 1) | The output index number (vout) of the outpoint being spent. The first output in a transaction has an index of `0`. Not present if this is a coinbase transaction +→ → →
`scriptSig` | object | Optional
(0 or 1) | An object describing the signature script of this input. Not present if this is a coinbase transaction +→ → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed +→ → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex +→ → →
`coinbase` | string (hex) | Optional
(0 or 1) | The coinbase (similar to the hex field of a scriptSig) encoded as hex. Only present if this is a coinbase transaction +→ → →
`value` | number (Dash) | Optional
(exactly 1) | The number of Dash paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → →
`valueSat` | number (duffs) | Optional
(exactly 1) | The number of duffs paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types.

Only present if `spentindex` enabled +→ → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→ → →
`sequence` | number (int) | Required
(exactly 1) | The input sequence number +→
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 +→ →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs +→ → →
`value` | number (Dash) | Required
(exactly 1) | The number of Dash paid to this output. May be `0` +→ → →
`valueSat` | number (duffs) | Required
(exactly 1) | The number of duffs paid to this output. May be `0` +→ → →
`n` | number (int) | Required
(exactly 1) | The output index number of this output within this transaction +→ → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script +→ → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed +→ → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex +→ → → →
`reqSigs` | number (int) | Optional
(0 or 1) | The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) +→ → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts +→ → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types +→ → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→
`extraPayloadSize` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Size of the DIP2 extra payload. Only present if it's a DIP2 special transaction +→
`extraPayload` | string (hex) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Hex encoded DIP2 extra payload data. Only present if it's a DIP2 special transaction +→
`blockhash` | string (hex) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is the hash of that block encoded as hex in RPC byte order +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`confirmations` | number (int) | Required
(exactly 1) | If the transaction has been included in a block on the local best block chain, this is how many confirmations it has. Otherwise, this is `0` +→
`time` | number (int) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is the block header time of that block (may be in the future) +→
`blocktime` | number (int) | Optional
(0 or 1) | This field is currently identical to the time field described above + +*Examples from Dash Core 0.12.2* + +Request a transaction in hex-encoded serialized transaction format: + +``` bash +curl http://localhost:19998/rest/tx/b06edec446fbcc0fc04a6e2774a843823f5238c2e15de40e61767a44f6788d32.hex +``` + +Result (wrapped): + +``` text +0100000001c91d4bb14e061f8f6b775ca8e62ec8a66739b375f169bce1964cee\ +a2368197e5000000006a473044022050644e406be3e463d94868c617309dc021\ +174551dbb340665f48119e110a72b2022022f3cc93deeb4c44ce70bebe8e7f0f\ +69c462f120eb64b47eeb77f0a62e9bd361012102f542dde7c155717ac8df05d0\ +fc8f65e2ecc078ecad42b23462f27832b441ffa5feffffff0200e1f505000000\ +001976a91443d11ad5889532f22f069b18b24489b1f94f253188ac7dbafa0800\ +0000001976a914bb900427682b8f7cae6779fb955a610ff71d68c888acce940000 +``` + +Get the same transaction in JSON: + +``` bash +curl http://localhost:19998/rest/tx/b06edec446fbcc0fc04a6e2774a843823f5238c2e15de40e61767a44f6788d32.json +``` + +Result (whitespace added): + +``` json +{ + "txid":"b06edec446fbcc0fc04a6e2774a843823f5238c2e15de40e61767a44f6788d32", + "size":225, + "version":1, + "locktime":38094, + "vin":[ + { + "txid":"e5978136a2ee4c96e1bc69f175b33967a6c82ee6a85c776b8f1f064eb14b1dc9", + "vout":0, + "scriptSig":{ + "asm":"3044022050644e406be3e463d94868c617309dc021174551dbb340665f48119e110a72b2022022f3cc93deeb4c44ce70bebe8e7f0f69c462f120eb64b47eeb77f0a62e9bd361[ALL] 02f542dde7c155717ac8df05d0fc8f65e2ecc078ecad42b23462f27832b441ffa5", + "hex":"473044022050644e406be3e463d94868c617309dc021174551dbb340665f48119e110a72b2022022f3cc93deeb4c44ce70bebe8e7f0f69c462f120eb64b47eeb77f0a62e9bd361012102f542dde7c155717ac8df05d0fc8f65e2ecc078ecad42b23462f27832b441ffa5" + }, + "sequence":4294967294 + } + ], + "vout":[ + { + "value":1.00000000, + "valueSat":100000000, + "n":0, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 43d11ad5889532f22f069b18b24489b1f94f2531 OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a91443d11ad5889532f22f069b18b24489b1f94f253188ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "ySW2cuvm2wJ4EU5KzX4waYfFPV3xQni6Nm" + ] + } + }, + { + "value":1.50649469, + "valueSat":150649469, + "n":1, + "scriptPubKey":{ + "asm":"OP_DUP OP_HASH160 bb900427682b8f7cae6779fb955a610ff71d68c8 OP_EQUALVERIFY OP_CHECKSIG", + "hex":"76a914bb900427682b8f7cae6779fb955a610ff71d68c888ac", + "reqSigs":1, + "type":"pubkeyhash", + "addresses":[ + "ydRBjVr78ejCqXuGs2wbtYoFpGbDkqV8V4" + ] + } + } + ], + "blockhash":"0000000003b6a57e3614176e5b93caf9498009853e06d16028ebffeb361afda5", + "height":38095, + "confirmations":9, + "time":1512596315, + "blocktime":1512596315 +} +``` + +*See also* + +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) RPC: gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction) RPC: gets detailed information about an in-wallet transaction. diff --git a/docs/core/api/http-rest.md b/docs/core/api/http-rest.md new file mode 100644 index 000000000..33e7422e7 --- /dev/null +++ b/docs/core/api/http-rest.md @@ -0,0 +1,23 @@ +```{eval-rst} +.. meta:: + :title: HTTP REST + :description: Dash Core provides an unauthenticated HTTP REST interface. The interface runs on the same port as the JSON-RPC interface, by default port 9998 for mainnet and port 19998 for testnet. +``` + +# HTTP REST + +:::{attention} +A web browser can access a HTTP REST interface running on localhost, possibly allowing third parties to use cross-site scripting attacks to download your transaction and block data, reducing your privacy. If you have privacy concerns, you should not run a browser on the same computer as a REST-enabled Dash Core node. +::: + +Dash Core provides an **unauthenticated** HTTP REST interface. The interface runs on the same port as the JSON-RPC interface, by default port 9998 for [mainnet](../resources/glossary.md#mainnet) and port 19998 for [testnet](../resources/glossary.md#testnet). It must be enabled by either starting Dash Core with the `-rest` option or by specifying `rest=1` in the configuration file. Make sure that the RPC interface is also activated. Set `server=1` in `dash.conf` or supply the `-server` argument when starting Dash Core. Starting Dash Core with `dashd` automatically enables the RPC interface. + +The interface is not intended for public access and is only accessible from localhost by default. The interface uses standard [HTTP status codes](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) and returns a plain-text description of errors for debugging. + +```{toctree} +:maxdepth: 3 +:titlesonly: + +http-rest-quick-reference +http-rest-requests +``` diff --git a/docs/core/api/remote-procedure-call-quick-reference.md b/docs/core/api/remote-procedure-call-quick-reference.md new file mode 100644 index 000000000..6596b69b0 --- /dev/null +++ b/docs/core/api/remote-procedure-call-quick-reference.md @@ -0,0 +1,235 @@ +```{eval-rst} +.. _api-rpc-quick-reference: +.. meta:: + :title: Remote Procedure Call Quick Reference + :description: A quick reference guide for all the RPCs in Dash. +``` + +# Quick Reference + +## [Addressindex RPCs](../api/remote-procedure-calls-address-index.md) + +These RPCs are all Dash-specific and not found in Bitcoin Core + +* [GetAddressBalance](../api/remote-procedure-calls-address-index.md#getaddressbalance): returns the balance for address(es). +* [GetAddressDeltas](../api/remote-procedure-calls-address-index.md#getaddressdeltas): returns all changes for an address. +* [GetAddressMempool](../api/remote-procedure-calls-address-index.md#getaddressmempool): returns all mempool deltas for an address. +* [GetAddressTxids](../api/remote-procedure-calls-address-index.md#getaddresstxids): returns the txids for an address(es). +* [GetAddressUtxos](../api/remote-procedure-calls-address-index.md#getaddressutxos): returns all unspent outputs for an address. + +## [Blockchain RPCs](../api/remote-procedure-calls-blockchain.md) + +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. +* [DumpTxOutset](../api/remote-procedure-calls-blockchain.md#dumptxoutset): Write the serialized UTXO set to disk. _New in Dash Core 18.1.0_ +* [GetBestChainLock](../api/remote-procedure-calls-blockchain.md#getbestchainlock): returns the block hash of the best chainlock. _New in Dash Core 0.15.0_ +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. **Updated in Dash Core 21.0.0** +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. **Updated in Dash Core 21.0.0** +* [GetBlockCount](../api/remote-procedure-calls-blockchain.md#getblockcount): returns the number of blocks in the local best block chain. +* [GetBlockFilter](../api/remote-procedure-calls-blockchain.md#getblockfilter): retrieves a [BIP157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) content filter for a particular block. _New in Dash Core 18.0.0_ +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBlockHashes](../api/remote-procedure-calls-blockchain.md#getblockhashes): returns array of hashes of blocks within the timestamp range provided (requires `timestampindex` to be enabled). New in Dash Core 0.12.1 +* [GetBlockHeader](../api/remote-procedure-calls-blockchain.md#getblockheader): gets a block header with a particular header hash from the local block database either as a JSON object or as a serialized block header. _Updated in Dash Core 0.16.0_ +* [GetBlockHeaders](../api/remote-procedure-calls-blockchain.md#getblockheaders): returns an array of items with information about the requested number of blockheaders starting from the requested hash. New in Dash Core 0.12.1 +* [GetBlockStats](../api/remote-procedure-calls-blockchain.md#getblockstats): computes per block statistics for a given window. _Updated in Dash Core 18.0.0_ +* [GetChainTips](../api/remote-procedure-calls-blockchain.md#getchaintips): returns information about the highest-height block (tip) of each local block chain. _Updated in Dash Core 0.12.3_ +* [GetChainTxStats](../api/remote-procedure-calls-blockchain.md#getchaintxstats): compute statistics about the total number and rate of transactions in the chain. _Updated in Dash Core 18.0.0_ +* [GetDifficulty](../api/remote-procedure-calls-blockchain.md#getdifficulty): returns the proof-of-work difficulty as a multiple of the minimum difficulty. +* [GetMemPoolAncestors](../api/remote-procedure-calls-blockchain.md#getmempoolancestors): returns all in-mempool ancestors for a transaction in the mempool. **Updated in Dash Core 20.0.0** +* [GetMemPoolDescendants](../api/remote-procedure-calls-blockchain.md#getmempooldescendants): returns all in-mempool descendants for a transaction in the mempool. **Updated in Dash Core 20.0.0** +* [GetMemPoolEntry](../api/remote-procedure-calls-blockchain.md#getmempoolentry): returns mempool data for given transaction (must be in mempool). **Updated in Dash Core 20.0.0** +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. **Updated in Dash Core 20.1.0** +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. **Updated in Dash Core 20.0.0** +* [GetMerkleBlocks](../api/remote-procedure-calls-blockchain.md#getmerkleblocks): returns an array of hex-encoded merkleblocks for blocks starting from which match . _New in Dash Core 0.15.0_ +* [GetSpecialTxes](../api/remote-procedure-calls-blockchain.md#getspecialtxes): returns an array of special transactions found in the specified block _New in Dash Core 0.13.1_ +* [GetSpentInfo](../api/remote-procedure-calls-blockchain.md#getspentinfo): returns the txid and index where an output is spent (requires `spentindex` to be enabled). New in Dash Core 0.12.1 +* [GetTxOut](../api/remote-procedure-calls-blockchain.md#gettxout): returns details about an unspent transaction output (UTXO). **Updated in Dash Core 21.0.0** +* [GetTxOutProof](../api/remote-procedure-calls-blockchain.md#gettxoutproof): returns a hex-encoded proof that one or more specified transactions were included in a block. +* [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo): returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. _Updated in Dash Core 18.1.0_ +* [PreciousBlock](../api/remote-procedure-calls-blockchain.md#preciousblock): treats a block as if it were received before others with the same work. _New in Dash Core 0.12.3_ +* [PruneBlockChain](../api/remote-procedure-calls-blockchain.md#pruneblockchain): prunes the blockchain up to a specified height or timestamp. _New in Dash Core 0.12.3_ +* [SaveMemPool](../api/remote-procedure-calls-blockchain.md#savemempool): dumps the mempool to disk. _New in Dash Core 0.16.0_ +* [VerifyChain](../api/remote-procedure-calls-blockchain.md#verifychain): verifies each entry in the local block chain database. +* [VerifyTxOutProof](../api/remote-procedure-calls-blockchain.md#verifytxoutproof): verifies that a proof points to one or more transactions in a block, returning the transactions the proof commits to and throwing an RPC error if the block is not in our best block chain. + +## [Control RPCs](../api/remote-procedure-calls-control.md) + +* [Debug](../api/remote-procedure-calls-control.md#debug): changes the debug category from the console. _Updated in Dash Core 18.0.0_ +* [GetMemoryInfo](../api/remote-procedure-calls-control.md#getmemoryinfo): returns information about memory usage. _Updated in Dash Core 0.15.0_ +* [GetRPCInfo](../api/remote-procedure-calls-control.md#getrpcinfo): returns details about the RPC server. _New in Dash Core 18.0.0_ +* [Help](../api/remote-procedure-calls-control.md#help): lists all available public RPC commands, or gets help for the specified RPC. Commands which are unavailable will not be listed, such as wallet RPCs if wallet support is disabled. _Updated in Dash Core 0.17.0_ +* [Logging](../api/remote-procedure-calls-control.md#logging): gets and sets the logging configuration _Updated in Dash Core 18.0.0_ +* [Stop](../api/remote-procedure-calls-control.md#stop): safely shuts down the Dash Core server. +* [Uptime](../api/remote-procedure-calls-control.md#uptime): returns the total uptime of the server. _New in Dash Core 0.15.0_ + +## [Dash RPCs](../api/remote-procedure-calls-dash.md) + +* [GetGovernanceInfo](../api/remote-procedure-calls-dash.md#getgovernanceinfo): returns an object containing governance parameters. **Updated in Dash Core 20.0.0** +* [GetCoinJoinInfo](../api/remote-procedure-calls-dash.md#getcoinjoininfo): returns an object containing an information about CoinJoin settings and state. _New in Dash Core 0.15.0_ +* [GetSuperblockBudget](../api/remote-procedure-calls-dash.md#getsuperblockbudget): returns the absolute maximum sum of superblock payments allowed. +* [GObject](../api/remote-procedure-calls-dash.md#gobject): provides a set of commands for managing governance objects and displaying information about them. **Updated in Dash Core 20.0.0** +* [Masternode](../api/remote-procedure-calls-dash.md#masternode): provides a set of commands for managing masternodes and displaying information about them. **_Updated in Dash Core 19.2.0_** +* [MasternodeList](../api/remote-procedure-calls-dash.md#masternodelist): returns a list of masternodes in different modes. **Updated in Dash Core 20.0.0** +* [MnSync](../api/remote-procedure-calls-dash.md#mnsync): returns the sync status, updates to the next step or resets it entirely. _Updated in Dash Core 0.14.0_ +* [CoinJoin](../api/remote-procedure-calls-dash.md#coinjoin): controls the CoinJoin process. _Updated in Dash Core 0.12.3_ +* [Spork](../api/remote-procedure-calls-dash.md#spork): shows information about the current state of sporks. _Updated in Dash Core 18.1.0_ +* [SporkUpdate](../api/remote-procedure-calls-dash.md#sporkupdate): updates the value of the provided spork. _New in Dash Core 18.1.0_ +* [VoteRaw](../api/remote-procedure-calls-dash.md#voteraw): compiles and relays a governance vote with provided external signature instead of signing vote internally + +## [Evolution RPCs](../api/remote-procedure-calls-evo.md) + +* [BLS](../api/remote-procedure-calls-evo.md#bls): provides a set of commands to execute BLS-related actions. **_Updated in Dash Core 19.0.0_** +* [ProTx](../api/remote-procedure-calls-evo.md#protx): provides a set of commands to execute ProTx related actions. **Updated in Dash Core 20.1.0** +* [Quorum](../api/remote-procedure-calls-evo.md#quorum): provides a set of commands for quorums (LLMQs). **Updated in Dash Core 20.1.0** +* [SubmitChainLock](../api/remote-procedure-calls-evo.md#submitchainlock): allows the submission of a ChainLock signature. **New in Dash Core 20.1.0** +* [VerifyChainLock](../api/remote-procedure-calls-evo.md#verifychainlock): tests if a quorum signature is valid for a ChainLock. _New in Dash Core 0.17.0_ +* [VerifyISLock](../api/remote-procedure-calls-evo.md#verifyislock): tests if a quorum signature is valid for an InstantSend lock. _New in Dash Core 0.17.0_ + +## [Generating RPCs](../api/remote-procedure-calls-generating.md) + +* [GenerateBlock](../api/remote-procedure-calls-generating.md#generateblock) mines a block with a set of ordered transactions immediately to a specified address or descriptor (before the RPC call returns). _New in Dash Core 18.1.0_ +* [GenerateToAddress](../api/remote-procedure-calls-generating.md#generatetoaddress): mines blocks immediately to a specified address. _New in Dash Core 0.12.3_ +* [GenerateToDescriptor](../api/remote-procedure-calls-generating.md#generatetodescriptor): mines blocks immediately to a specified descriptor. _New in Dash Core 18.1.0_ + +## [Mining RPCs](../api/remote-procedure-calls-mining.md) + +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. **Updated in Dash Core 20.0.0** +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. _Updated in Dash Core 18.0.0_ +* [GetNetworkHashPS](../api/remote-procedure-calls-mining.md#getnetworkhashps): returns the estimated network hashes per second based on the last n blocks. +* [PrioritiseTransaction](../api/remote-procedure-calls-mining.md#prioritisetransaction): adds virtual priority or fee to a transaction, allowing it to be accepted into blocks mined by this node (or miners which use this node) with a lower priority or fee. (It can also remove virtual priority or fee, requiring the transaction have a higher priority or fee to be accepted into a locally-mined block.) _Updated in Dash Core 0.14.0_ +* [SubmitBlock](../api/remote-procedure-calls-mining.md#submitblock): accepts a block, verifies it is a valid addition to the block chain, and broadcasts it to the network. Extra parameters are ignored by Dash Core but may be used by mining pools or other programs. +* [SubmitHeader](../api/remote-procedure-calls-mining.md#submitheader): decodes the given hex data as a header and submits it as a candidate chain tip if valid. _New in Dash Core 18.0.0_ + +## [Network RPCs](../api/remote-procedure-calls-network.md) + +* [AddNode](../api/remote-procedure-calls-network.md#addnode): attempts to add or remove a node from the addnode list, or to try a connection to a node once. +* [AddPeerAddress](../api/remote-procedure-calls-network.md#addpeeraddress): adds the address of a potential peer to the address manager. **New in Dash Core 20.0.0** +* [ClearBanned](../api/remote-procedure-calls-network.md#clearbanned): clears list of banned nodes. +* [ClearDiscouraged](../api/remote-procedure-calls-network.md#cleardiscouraged): clears all discouraged nodes. **_New in Dash Core 19.0.0_** +* [DisconnectNode](../api/remote-procedure-calls-network.md#disconnectnode): immediately disconnects from a specified node. _Updated in Dash Core 0.15.0_ +* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. **Updated in Dash Core 21.0.0** +* [GetConnectionCount](../api/remote-procedure-calls-network.md#getconnectioncount): returns the number of connections to other nodes. +* [GetNetTotals](../api/remote-procedure-calls-network.md#getnettotals): returns information about network traffic, including bytes in, bytes out, and the current time. +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. **Updated in Dash Core 21.0.0** +* [GetNodeAddresses](../api/remote-procedure-calls-network.md#getnodeaddresses): returns the known addresses which can potentially be used to find new nodes in the network. **Updated in Dash Core 21.0.0** +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. **Updated in Dash Core 21.0.0** +* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all banned IPs/Subnets. **Updated in Dash Core 21.0.0** +* [Ping](../api/remote-procedure-calls-network.md#ping): sends a P2P ping message to all connected nodes to measure ping time. Results are provided by the [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo) pingtime and pingwait fields as decimal seconds. The P2P [`ping` message](../reference/p2p-network-control-messages.md#ping) is handled in a queue with all other commands, so it measures processing backlog, not just network ping. +* [SetBan](../api/remote-procedure-calls-network.md#setban): attempts add or remove a IP/Subnet from the banned list. +* [SetNetworkActive](../api/remote-procedure-calls-network.md#setnetworkactive): disables/enables all P2P network activity. + +## [Raw Transaction RPCs](../api/remote-procedure-calls-raw-transactions.md) + +* [AnalyzePSBT](../api/remote-procedure-calls-raw-transactions.md#analyzepsbt): analyzes and provides information about the current status of a PSBT and its inputs. _New in Dash Core 18.2.0_ +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combines multiple partially-signed Dash transactions into one transaction. _New in Dash Core 18.0.0_ +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. _New in Dash Core 0.15.0_ +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. _New in Dash Core 18.0.0_ +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. _New in Dash Core 18.0.0_ +* [GetAssetUnlockStatuses](../api/remote-procedure-calls-raw-transactions.md#getassetunlockstatuses): returns the status of the provided Asset Unlock indexes at the tip of the chain or at a particular block height if specified. **New in Dash Core 20.1.0** +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. _Updated in Dash Core 0.17.0_ +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. _New in Dash Core 18.0.0_ +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. **Updated in Dash Core 21.0.0** +* [DecodeScript](../api/remote-procedure-calls-raw-transactions.md#decodescript): decodes a hex-encoded P2SH redeem script. **Updated in Dash Core 21.0.0** +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. The PSBT produces a network serialized transaction if the transaction is fully signed. _New in Dash Core 18.0.0_ +* [FundRawTransaction](../api/remote-procedure-calls-raw-transactions.md#fundrawtransaction): adds inputs to a transaction until it has enough in value to meet its out value. **Updated in Dash Core 21.0.0** +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. **Updated in Dash Core 21.0.0** +* [GetRawTransactionMulti](../api/remote-procedure-calls-raw-transactions.md#getrawtransactionmulti): gets hex-encoded serialized transactions or a JSON object describing the multiple transactions. **Added in Dash Core 20.1.0** +* [GetTxChainlocks](../api/remote-procedure-calls-raw-transactions.md#gettxchainlocks): returns the block height each transaction was mined at and whether it is ChainLocked or not. **Updated in Dash Core 20.1.0** +* [JoinPSBTs](../api/remote-procedure-calls-raw-transactions.md#joinpsbts): joins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. _Updated in Dash Core 0.15.0_ +* [SignRawTransactionWithKey](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey): signs a transaction in the serialized transaction format using private keys provided in the call. _New in Dash Core 0.17.0_ +* [TestMempoolAccept](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept): returns the results of mempool acceptance tests indicating if raw transaction (serialized, hex-encoded) would be accepted by mempool. **Updated in Dash Core 20.1.0** +* [UTXOUpdatePSBT](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept): updates a PSBT with data from output descriptors, UTXOs retrieved from the UTXO set or the mempool. _Updated in Dash Core 18.1.0_ + +## [Utility RPCs](../api/remote-procedure-calls-util.md) + +* [CreateMultiSig](../api/remote-procedure-calls-util.md#createmultisig): creates a P2SH multi-signature address. **Updated in Dash Core 20.0.0** +* [DeriveAddresses](../api/remote-procedure-calls-util.md#deriveaddresses): derives one or more addresses corresponding to an output descriptor. _Updated in Dash Core 18.1.0_ +* [EstimateSmartFee](../api/remote-procedure-calls-util.md#estimatesmartfee): estimates the transaction fee per kilobyte that needs to be paid for a transaction to begin confirmation within a certain number of blocks and returns the number of blocks for which the estimate is valid. _Updated in Dash Core 0.15.0_ +* [GetDescriptorInfo](../api/remote-procedure-calls-util.md#getdescriptorinfo): analyses a descriptor. _New in Dash Core 18.0.0_ +* [GetIndexInfo](../api/remote-procedure-calls-util.md#getindexinfo): returns the status of one or all available indices currently running in the node. **New in Dash Core 20.0.0** +* [SignMessageWithPrivKey](../api/remote-procedure-calls-util.md#signmessagewithprivkey): signs a message with a given private key. _New in Dash Core 0.12.3_ +* [ValidateAddress](../api/remote-procedure-calls-util.md#validateaddress): returns information about the given Dash address. **Updated in Dash Core 20.1.0** +* [VerifyMessage](../api/remote-procedure-calls-util.md#verifymessage): verifies a signed message. + +## [Wallet RPCs](../api/remote-procedure-calls-wallet.md) + +**Note:** the wallet RPCs are only available if Dash Core was built with [wallet support](../resources/glossary.md#wallet-support), which is the default. + +* [AbandonTransaction](../api/remote-procedure-calls-wallet.md#abandontransaction): marks an in-wallet transaction and all its in-wallet descendants as abandoned. This allows their inputs to be respent. +* [AbortRescan](../api/remote-procedure-calls-wallet.md#abortrescan): stops current wallet rescan. _New in Dash Core 0.15.0_ +* [AddMultiSigAddress](../api/remote-procedure-calls-wallet.md#addmultisigaddress): adds a P2SH multisig address to the wallet. **Updated in Dash Core 20.0.0** +* [BackupWallet](../api/remote-procedure-calls-wallet.md#backupwallet): safely copies `wallet.dat` to the specified file, which can be a directory or a path with filename. +* [CreateWallet](../api/remote-procedure-calls-wallet.md#createwallet): creates and loads a new wallet. **Updated in Dash Core 21.0.0** +* [DumpHDInfo](../api/remote-procedure-calls-wallet.md#dumphdinfo): returns an object containing sensitive private info about this HD wallet New in Dash Core 0.12.2 +* [DumpPrivKey](../api/remote-procedure-calls-wallet.md#dumpprivkey): returns the wallet-import-format (WIP) private key corresponding to an address. (But does not remove it from the wallet.) +* [DumpWallet](../api/remote-procedure-calls-wallet.md#dumpwallet): creates or overwrites a file with all wallet keys in a human-readable format. _Updated in Dash Core 0.17.0_ +* [EncryptWallet](../api/remote-procedure-calls-wallet.md#encryptwallet): encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. +* [GetAddressInfo](../api/remote-procedure-calls-wallet.md#getaddressinfo): returns information about the given Dash address. **Updated in Dash Core 21.0.0** +* [GetAddressesByLabel](../api/remote-procedure-calls-wallet.md#getaddressesbylabel): returns a list of every address assigned to a particular label. _New in Dash Core 0.17.0_ +* [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. _Updated in Dash Core 18.1.0_ +* [GetBalances](../api/remote-procedure-calls-wallet.md#getbalances): returns an object with all balances denominated in DASH. _Updated in Dash Core 18.2.0_ +* [GetNewAddress](../api/remote-procedure-calls-wallet.md#getnewaddress): returns a new Dash address for receiving payments. If an account is specified, payments received with the address will be credited to that account. _Updated in Dash Core 0.17.0_ +* [GetRawChangeAddress](../api/remote-procedure-calls-wallet.md#getrawchangeaddress): returns a new Dash address for receiving change. This is for use with raw transactions, not normal use. +* [GetReceivedByAddress](../api/remote-procedure-calls-wallet.md#getreceivedbyaddress): returns the total amount received by the specified address in transactions with the specified number of confirmations. It does not count coinbase transactions. _Updated in Dash Core 0.13.0_ +* [GetReceivedByLabel](../api/remote-procedure-calls-wallet.md#getreceivedbylabel): returns the list of addresses assigned the specified label. _New in Dash Core 0.17.0_ +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. **Updated in Dash Core 20.0.0** +* [GetUnconfirmedBalance](../api/remote-procedure-calls-wallet.md#getunconfirmedbalance): returns the wallet's total unconfirmed balance. +* [GetWalletInfo](../api/remote-procedure-calls-wallet.md#getwalletinfo): provides information about the wallet. **Updated in Dash Core 20.0.0** +* [ImportAddress](../api/remote-procedure-calls-wallet.md#importaddress): adds an address or pubkey script to the wallet without the associated private key, allowing you to watch for transactions affecting that address or pubkey script without being able to spend any of its outputs. +* [ImportElectrumWallet](../api/remote-procedure-calls-wallet.md#importelectrumwallet): imports keys from an Electrum wallet export file (.csv or .json) New in Dash Core 0.12.1 +* [ImportDescriptors](../api/remote-procedure-calls-wallet.md#importdescriptors): imports multiple descriptors into the wallet. **New in Dash Core 21.0.0** +* [ImportMulti](../api/remote-procedure-calls-wallet.md#importmulti): imports addresses or scripts (with private keys, public keys, or P2SH redeem scripts) and optionally performs the minimum necessary rescan for all imports. _New in Dash Core 0.12.3_ +* [ImportPrivKey](../api/remote-procedure-calls-wallet.md#importprivkey): adds a private key to your wallet. The key should be formatted in the wallet import format created by the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey). +* [ImportPrunedFunds](../api/remote-procedure-calls-wallet.md#importprunedfunds): imports funds without the need of a rescan. Meant for use with pruned wallets. _New in Dash Core 0.12.3_ +* [ImportPubKey](../api/remote-procedure-calls-wallet.md#importpubkey): imports a public key (in hex) that can be watched as if it were in your wallet but cannot be used to spend +* [ImportWallet](../api/remote-procedure-calls-wallet.md#importwallet): imports private keys from a file in wallet dump file format (see the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet)). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes. +* [KeyPoolRefill](../api/remote-procedure-calls-wallet.md#keypoolrefill): fills the cache of unused pre-generated keys (the keypool). +* [ListAddressBalances](../api/remote-procedure-calls-wallet.md#listaddressbalances): lists addresses of this wallet and their balances _New in Dash Core 0.12.3_ +* [ListAddressGroupings](../api/remote-procedure-calls-wallet.md#listaddressgroupings): lists groups of addresses that may have had their common ownership made public by common use as inputs in the same transaction or from being used as change from a previous transaction. _Updated in Dash Core 0.17.0_ +* [ListDescriptors](../api/remote-procedure-calls-wallet.md#listdescriptors): lists descriptors imported into a descriptor-enabled wallet. **New in Dash Core 21.0.0** +* [ListLabels](../api/remote-procedure-calls-wallet.md#listlabels): returns the list of all labels, or labels that are assigned to addresses with a specific purpose. _New in Dash Core 0.17.0_ +* [ListLockUnspent](../api/remote-procedure-calls-wallet.md#listlockunspent): returns a list of temporarily unspendable (locked) outputs. +* [ListReceivedByAddress](../api/remote-procedure-calls-wallet.md#listreceivedbyaddress): lists the total number of dash received by each address. _Updated in Dash Core 0.17.0_ +* [ListReceivedByLabel](../api/remote-procedure-calls-wallet.md#listreceivedbylabel): lists the total number of dash received by each label. _New in Dash Core 0.17.0_ +* [ListSinceBlock](../api/remote-procedure-calls-wallet.md#listsinceblock): gets all transactions affecting the wallet which have occurred since a particular block, plus the header hash of a block at a particular depth. **Updated in Dash Core 20.0.0** +* [ListTransactions](../api/remote-procedure-calls-wallet.md#listtransactions): returns the most recent transactions that affect the wallet. **Updated in Dash Core 20.0.0** +* [ListUnspent](../api/remote-procedure-calls-wallet.md#listunspent): returns an array of unspent transaction outputs belonging to this wallet. _Updated in Dash Core 18.1.0_ +* [ListWalletDir](../api/remote-procedure-calls-wallet.md#listwalletdir): returns a list of wallets in the wallet directory. _New in Dash Core 18.0.0_ +* [ListWallets](../api/remote-procedure-calls-wallet.md#listwallets): returns a list of currently loaded wallets. _New in Dash Core 0.15.0_ +* [LoadWallet](../api/remote-procedure-calls-wallet.md#loadwallet): loads a wallet from a wallet file or directory. _Updated in Dash Core 18.1.0_ +* [LockUnspent](../api/remote-procedure-calls-wallet.md#lockunspent): temporarily locks or unlocks specified transaction outputs. A locked transaction output will not be chosen by automatic coin selection when spending dash. Locks are stored in memory only, so nodes start with zero locked outputs and the locked output list is always cleared when a node stops or fails. +* [RemovePrunedFunds](../api/remote-procedure-calls-wallet.md#removeprunedfunds): deletes the specified transaction from the wallet. Meant for use with pruned wallets and as a companion to importprunedfunds. _New in Dash Core 0.12.3_ +* [RescanBlockChain](../api/remote-procedure-calls-wallet.md#rescanblockchain): rescans the local blockchain for wallet related transactions. _New in Dash Core 0.16.0_ +* [ScanTxOutset](../api/remote-procedure-calls-wallet.md#scantxoutset): scans the unspent transaction output set for entries that match certain output descriptors. _New in Dash Core 18.0.0_ +* [Send](../api/remote-procedure-calls-wallet.md#send): sends a transaction with specified outputs. **New in Dash Core 21.0.0** +* [SendMany](../api/remote-procedure-calls-wallet.md#sendmany): creates and broadcasts a transaction which sends outputs to multiple addresses. **Updated in Dash Core 21.0.0** +* [SendToAddress](../api/remote-procedure-calls-wallet.md#sendtoaddress): spends an amount to a given address. **Updated in Dash Core 21.0.0** +* [SetHDSeed](../api/remote-procedure-calls-wallet.md#sethdseed): sets or generates a new HD wallet seed **New in Dash Core 21.0.0** +* [SetLabel](../api/remote-procedure-calls-wallet.md#setlabel): sets the label associated with the given address. +* [SetCoinJoinAmount](../api/remote-procedure-calls-wallet.md#setcoinjoinamount): sets the amount of DASH to be processed _New in Dash Core 0.13.0_ +* [SetCoinJoinRounds](../api/remote-procedure-calls-wallet.md#setcoinjoinrounds): sets the number of rounds to use _New in Dash Core 0.13.0_ +* [SetTxFee](../api/remote-procedure-calls-wallet.md#settxfee): sets the transaction fee per kilobyte paid by transactions created by this wallet. +* [SetWalletFlag](../api/remote-procedure-calls-wallet.md#setwalletflag): changes the state of the given wallet flag for a wallet. +* [SignMessage](../api/remote-procedure-calls-wallet.md#signmessage): signs a message with the private key of an address. +* [SignRawTransactionWithWallet](../api/remote-procedure-calls-wallet.md#signrawtransactionwithwallet): signs a transaction in the serialized transaction format using private keys found in the wallet. _New in Dash Core 0.17.0_ +* [UnloadWallet](../api/remote-procedure-calls-wallet.md#unloadwallet): unloads the wallet referenced by the request endpoint otherwise unloads the wallet specified in the argument. **Updated in Dash Core 20.0.0** +* [UpgradeToHD](../api/remote-procedure-calls-wallet.md#upgradetohd): upgrades non-HD wallets to HD. _New in Dash Core 0.17.0_ +* [UpgradeWallet](../api/remote-procedure-calls-wallet.md#upgradewallet): upgrades wallet version. **Updated in Dash Core 21.0.0** +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. Inputs will be added if supplied inputs are not enough. **Updated in Dash Core 21.0.0** +* [WalletLock](../api/remote-procedure-calls-wallet.md#walletlock): removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. +* [WalletPassphrase](../api/remote-procedure-calls-wallet.md#walletpassphrase): stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. +* [WalletPassphraseChange](../api/remote-procedure-calls-wallet.md#walletpassphrasechange): changes the wallet passphrase from 'old passphrase' to 'new passphrase'. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. _Updated in Dash Core 18.2.0_ +* [WipeWalletTxes](../api/remote-procedure-calls-wallet.md#wipewallettxes): wipes wallet transactions. **_New in Dash Core 19.3.0_** + +## [Wallet RPCs (Deprecated)](../api/remote-procedure-calls-wallet-deprecated.md) + +**Note:** the wallet RPCs are only available if Dash Core was built with [wallet support](../resources/glossary.md#wallet-support), which is the default. + +## [ZeroMQ (ZMQ) RPCs](../api/remote-procedure-calls-zmq.md) + +* [GetZmqNotifications](../api/remote-procedure-calls-zmq.md#getzmqnotifications): returns information about the active ZeroMQ notifications. _Updated in Dash Core 18.0.0_ + +## [Removed RPCs](../api/remote-procedure-calls-removed.md) + +* [GObject vote-conf](../api/remote-procedure-calls-removed.md#gobject-vote-conf): **was removed in Dash Core 20.0.0** diff --git a/docs/core/api/remote-procedure-calls-address-index.md b/docs/core/api/remote-procedure-calls-address-index.md new file mode 100644 index 000000000..94b8add04 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-address-index.md @@ -0,0 +1,279 @@ +```{eval-rst} +.. meta:: + :title: Address Index RPCs + :description: A list of all the Address Index RPCs in Dash. +``` + +# Address Index RPCs + +## GetAddressBalance + +:::{note} +Requires `-addressindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +The [`getaddressbalance` RPC](../api/remote-procedure-calls-address-index.md#getaddressbalance) returns the balance for address(es). + +*Parameter #1---an array of [addresses](../resources/glossary.md#address)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`addresses` | object | Required
(exactly 1) | An array of P2PKH or P2SH Dash address(es) +→Address | string (base58) | Required
(1 or more) | The base58check encoded address + +*Result---the current balance in [duffs](../resources/glossary.md#duffs) and the total number of duffs received (including change)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | An object listing the current balance and total amount received (including change), or an error if any address is invalid +→
`balance` | string | Required
(exactly 1) | The current balance in duffs +→
`balance_immature` | string | Required
(exactly 1) | The current immature balance in duffs +→
`balance_spendable` | string | Required
(exactly 1) | The current spendable balance in duffs +→
`received` | string | Required
(exactly 1) | The total number of duffs received (including change) + +*Example from Dash Core 0.17.0* + +Get the balance for an address: + +```bash +dash-cli getaddressbalance '{"addresses": ["yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ"]}' +``` + +Result: + +```json +{ + "balance": 876020488, + "balance_immature": 776020488, + "balance_spendable": 100000000, + "received": 876020488 +} +``` + +*See also* + +* [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. +* [GetUnconfirmedBalance](../api/remote-procedure-calls-wallet.md#getunconfirmedbalance): returns the wallet's total unconfirmed balance. + +## GetAddressDeltas + +:::{note} +Requires `-addressindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +The [`getaddressdeltas` RPC](../api/remote-procedure-calls-address-index.md#getaddressdeltas) returns all changes for an address. + +*Parameter #1---an array of addresses* + +Name | Type | Presence | Description +--- | --- | --- | --- +`addresses` | object | Required
(exactly 1) | An array of P2PKH or P2SH Dash address(es) +→Address | string (base58) | Required
(1 or more) | The base58check encoded address + +*Parameter #2---the start block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +`start` | number (int) | Optional
(exactly 1) | The start block height + +*Parameter #3---the end block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +`end` | number (int) | Optional
(exactly 1) | The end block height + +*Result---information about all changes for the address(es)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of JSON objects, with each object describing a transaction involving one of the requested addresses +→
Delta | object | Required
(1 or more) | An object describing a particular address delta +→→
`satoshis` | number | Required
(exactly 1) | The difference of duffs +→→
`txid` | string | Required
(exactly 1) | The related txid +→→
`blockindex` | number | Required
(exactly 1) | The related input or output index +→→
`height` | number | Required
(exactly 1) | The block height +→→
`address` | string | Required
(exactly 1) | The base58check encoded address + +*Example from Dash Core 0.12.2* + +Get the deltas for an address: + +```bash +dash-cli getaddressdeltas '{"addresses": ["yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ"], "start":5000, "end":7500}' +``` + +Result: + +```json +[ + { + "satoshis": 10000100, + "txid": "1fe86e463a9394d4ccd9a5ff1c6b483c95b4350ffdb055b55dc3615111e977de", + "index": 18, + "blockindex": 1, + "height": 6708, + "address": "yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ" + }, + { + "satoshis": -10000100, + "txid": "6cb4379eec45cd3bb08b8f4c3a101b8cd89795e24f2cb8288a9941a85fb114cf", + "index": 0, + "blockindex": 1, + "height": 7217, + "address": "yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ" + } +] +``` + +## GetAddressMempool + +:::{note} +Requires `-addressindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +The [`getaddressmempool` RPC](../api/remote-procedure-calls-address-index.md#getaddressmempool) returns all mempool deltas for an address. + +*Parameter #1---an array of addresses* + +Name | Type | Presence | Description +--- | --- | --- | --- +`addresses` | object | Required
(exactly 1) | An array of P2PKH or P2SH Dash address(es) +→Address | string (base58) | Required
(1 or more) | The base58check encoded address + +*Result---information about mempool deltas for the address(es)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of JSON objects, with each object describing a transaction involving one of the requested addresses +→Mempool Deltas | object | Required
(1 or more) | An object describing a particular mempool address delta +→→
`address` | string | Required
(exactly 1) | The base58check encoded address +→→
`txid` | string | Required
(exactly 1) | The related txid +→→
`index` | number | Required
(exactly 1) | The related input or output index +→→
`satoshis` | number | Required
(exactly 1) | The difference of duffs +→→
`timestamp` | string | Required
(exactly 1) | The time the transaction entered the mempool (seconds) +→→
`prevtxid` | string | Required
(exactly 1) | The previous txid (if spending) +→→
`prevout` | string | Required
(exactly 1) | The previous transaction output index (if spending) + +*Example from Dash Core 0.12.2* + +Get the deltas for an address: + +```bash +dash-cli getaddressmempool '{"addresses": ["yVcYtcKd3nSi85JFtE8ZSDPimj3VMTJB8k"]}' +``` + +Result: + +```json +[ + { + "address": "yVcYtcKd3nSi85JFtE8ZSDPimj3VMTJB8k", + "txid": "e53d871df8b26116fbc1b766172323f9c477375133eec8ea5c66f1867a61a533", + "index": 1, + "satoshis": 100000000000, + "timestamp": 1573753889 + } +] +``` + +## GetAddressTxids + +:::{note} +Requires `-addressindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +The [`getaddresstxids` RPC](../api/remote-procedure-calls-address-index.md#getaddresstxids) returns the txids for an address(es). + +*Parameter #1---an array of addresses* + +Name | Type | Presence | Description +--- | --- | --- | --- +`addresses` | object | Required
(exactly 1) | An array of P2PKH or P2SH Dash address(es) +→Address | string (base58) | Required
(1 or more) | The base58check encoded address + +*Parameter #2---the start block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +`start` | number (int) | Optional
(exactly 1) | The start block height + +*Parameter #3---the end block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +`end` | number (int) | Optional
(exactly 1) | The end block height + +*Result---information about txids for the address(es)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of txids related to the requested address(es) +→
TXID | string | Required
(1 or more) | The transaction id + +*Example from Dash Core 0.12.2* + +Get the deltas for an address: + +```bash +dash-cli getaddresstxids '{"addresses": ["yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ"], "start":5000, "end":7500}' +``` + +Result: + +```json +[ + "1fe86e463a9394d4ccd9a5ff1c6b483c95b4350ffdb055b55dc3615111e977de", + "6cb4379eec45cd3bb08b8f4c3a101b8cd89795e24f2cb8288a9941a85fb114cf" +] +``` + +## GetAddressUtxos + +:::{note} +Requires `-addressindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +The [`getaddressutxos` RPC](../api/remote-procedure-calls-address-index.md#getaddressutxos) returns all unspent outputs for an address. + +*Parameter #1---an array of addresses* + +Name | Type | Presence | Description +--- | --- | --- | --- +`addresses` | object | Required
(exactly 1) | An array of P2PKH or P2SH Dash address(es) +→Address | string (base58) | Required
(1 or more) | The base58check encoded address + +*Result---information about unspent outputs for the address(es)* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of JSON objects, with each object describing a transaction involving one of the requested addresses +→Unspent outputs | object | Required
(1 or more) | An object describing a particular unspent output for the requested address(es) +→→
`address` | string | Required
(exactly 1) | The base58check encoded address +→→
`txid` | string | Required
(exactly 1) | The output txid +→→
`outputIndex` | number | Required
(exactly 1) | The output index +→→
`script` | string | Required
(exactly 1) | The script hex encoded +→→
`satoshis` | number | Required
(exactly 1) | The number of duffs of the output +→→
`height` | number | Required
(exactly 1) | The block height + +*Example from Dash Core 0.12.2* + +Get the unspent outputs for an address: + +```bash +dash-cli getaddressutxos '{"addresses": ["yLeC3F9UxJmFaRaf5yzH7FDc7RdvBasi84"]}' +``` + +Result: + +```json +[ + { + "address": "yLeC3F9UxJmFaRaf5yzH7FDc7RdvBasi84", + "txid": "ef7bcd083db8c9551ca295698c3b7a6811288fae9944018d2a660a0f939bdb35", + "outputIndex": 0, + "script": "76a914038b8a73338c8f9c22024338198d63ff7c4cb4c088ac", + "satoshis": 1000010000, + "height": 7683 + } +] +``` diff --git a/docs/core/api/remote-procedure-calls-blockchain.md b/docs/core/api/remote-procedure-calls-blockchain.md new file mode 100644 index 000000000..b98ec3a3d --- /dev/null +++ b/docs/core/api/remote-procedure-calls-blockchain.md @@ -0,0 +1,2300 @@ +```{eval-rst} +.. meta:: + :title: Blockchain RPCs + :description: A list of all the Blockchain RPCs in Dash. +``` + +# Blockchain RPCs + +## GetBestBlockHash + +The [`getbestblockhash` RPC](../api/remote-procedure-calls-blockchain.md#getbestblockhash) returns the header hash of the most recent block on the best blockchain. + +*Parameters: none* + +*Result---hash of the tip from the best block chain* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex) | Required
(exactly 1) | The hash of the block header from the most recent block on the best block chain, encoded as hex in RPC byte order + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getbestblockhash +``` + +Result: + +``` text +00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. + +## DumpTxOutset + +Write the serialized UTXO set to disk. + +*Parameter #1---path to output file* + +Name | Type | Presence | Description +--- | --- | --- | --- +path | string (hex) | Required
(exactly 1) | Path to the output file. If relative, will be prefixed by datadir. + +*Result* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred +→
`coins_written` | number (int) | Required
(exactly 1) | the number of coins written in the snapshot +→
`base_hash` | string (hex) | Required
(exactly 1) | the hash of the base of the snapshot +→
`base_height` | number (int) | Required
(exactly 1) | the height of the base of the snapshot +→
`path` | string (str) | Required
(exactly 1) | the absolute path that the snapshot was written to + +*Example from Dash Core 18.1.0* + +> dash-cli dumptxoutset a + +Result: + +``` json +{ + "coins_written": 4313775, + "base_hash": "000000000000000ef8f6b8f9b73ae4c516b961b7bbc01945b48d84b954ae68a1", + "base_height": 1412676, + "path": "/Users/username/Library/Application Support/DashCore/a" +} +``` + +## GetBestChainLock + +The [`getbestchainlock` RPC](../api/remote-procedure-calls-blockchain.md#getbestchainlock) returns the information about the best ChainLock. + +Throws an error if there is no known ChainLock yet. + +*Parameters: none* + +*Result* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred +→
`blockhash` | string (hex) | Required
(exactly 1) | The hash of the block encoded as hex in RPC byte order +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`signature` | string (hex) | Required
(exactly 1) | _Added in Dash Core 0.17.0_

The BLS signature of the ChainLock +→
`known_block` | boolean | Required
(exactly 1) | True if the block is known by this node + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet getbestchainlock +``` + +Result: + +``` json +{ + "blockhash": "00000c0e7a866e67444813858b976886d839aff28f56dc178c92ed1390c97f4e", + "height": 405044, + "signature": "960ead08adcc3fcf5e576f9e6ad290251325db900d19d961f5ece398b5389390b8a44e8986199c201ac348a89bc8534a0f7153c61c54157a241c521131025e5054b7c4298065069e478abdaea4d6c861848061e32c0d903ddeb5ee6036e8ddcf", + "known_block": true +} +``` + +*See also: none* + +```{eval-rst} +.. _api-rpc-blockchain-getblock: +``` + +## GetBlock + +The [`getblock` RPC](../api/remote-procedure-calls-blockchain.md#getblock) gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. + +*Parameter #1---block hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block Hash | string (hex) | Required
(exactly 1) | The hash of the header of the block to get, encoded as hex in RPC byte order + +*Parameter #2---whether to get JSON or hex output* + +Name | Type | Presence | Description +--- | --- | --- | --- +Verbosity | number (int) | Optional
(0 or 1) | Set to one of the following verbosity levels:
• `0` - Get the block as a string in the hex-encoded serialized block format;
• `1` - Get the decoded block as a JSON object (default)
• `2` - Get the decoded block as a JSON object with transaction details + +*Result (if verbosity was `0`)---a serialized block* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex)/null | Required
(exactly 1) | The requested block as a serialized block, encoded as hex, or JSON `null` if an error occurred + +*Result (if verbosity was `1` or omitted)---a JSON block with transaction hashes* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred +→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→
`versionHex` | string (hex) | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

The block version formatted in hexadecimal +→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→
`time` | number (int) | Required
(exactly 1) | The value of the *time* field in the block header, indicating approximately when the block was created +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median block time in Unix epoch time +→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`nTx` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*

The number of transactions in the block +→
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block +→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order +→
`chainlock` | bool | Required
(exactly 1) | *Added in Dash Core 0.14.0*

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) +→
`size` | number (int) | Required
(exactly 1) | The size of this block in serialized block format, counted in bytes +→
`tx` | array | Required
(exactly 1) | An array containing the TXIDs of all transactions in this block. The transactions appear in the array in the same order they appear in the serialized block +→ →
TXID | string (hex) | Required
(1 or more) | The TXID of a transaction in this block, encoded as hex in RPC byte order +→
`cbTx` | object | Required
(exactly 1) | Coinbase special transaction details +→ →
`version` | number (int) | Required
(exactly 1) | The version of the Coinbase special transaction (CbTx) +→ →
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→ →
`merkleRootMNList` | string (hex) | Required
(exactly 1) | The merkle root for the masternode list +→ →
`merkleRootQuorums` | string (hex) | Required
(exactly 1) | The merkle root for the quorum list +→ →
`bestCLHeightDiff` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The best ChainLock height difference +→ →
`bestCLSignature` | string (hex) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The best ChainLock signature +→ →
`creditPoolBalance` | number (real) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The balance of the credit pool + +*Result (if verbosity was `2`---a JSON block with full transaction details* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred +→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→
`versionHex` | string (hex) | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

The block version formatted in hexadecimal +→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→
`time` | number (int) | Required
(exactly 1) | The value of the *time* field in the block header, indicating approximately when the block was created +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median block time in Unix epoch time +→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block +→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order +→
`chainlock` | bool | Required
(exactly 1) | *Added in Dash Core 0.14.0*

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) +→
`size` | number (int) | Required
(exactly 1) | The size of this block in serialized block format, counted in bytes +→
`tx` | array | Required
(exactly 1) | An array containing the details for all transactions in this block. The transactions appear in the array in the same order they appear in the serialized block +→ →
`txid` | string (hex) | Required
(exactly 1) | The transaction's TXID encoded as hex in RPC byte order +→ →
`size` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The serialized transaction size +→ →
`version` | number (int) | Required
(exactly 1) | The transaction format version number +→ →
`type` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.13.0.0*

The transaction format type +→ →
`locktime` | number (int) | Required
(exactly 1) | The transaction's locktime: either a Unix epoch date or block height; see the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md#locktime-parsing-rules) +→ →
`vin` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction. Input objects will have the same order within the array as they have in the transaction, so the first input listed will be input 0 +→ → →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase +→ → → →
`txid` | string | Optional
(0 or 1) | The TXID of the outpoint being spent, encoded as hex in RPC byte order. Not present if this is a coinbase transaction +→ → → →
`vout` | number (int) | Optional
(0 or 1) | The output index number (vout) of the outpoint being spent. The first output in a transaction has an index of `0`. Not present if this is a coinbase transaction +→ → → →
`scriptSig` | object | Optional
(0 or 1) | An object describing the signature script of this input. Not present if this is a coinbase transaction +→ → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed +→ → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex +→ → → →
`coinbase` | string (hex) | Optional
(0 or 1) | The coinbase (similar to the hex field of a scriptSig) encoded as hex. Only present if this is a coinbase transaction +→ → → →
`value` | number (Dash) | Optional
(exactly 1) | The number of Dash paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → → →
`valueSat` | number (duffs) | Optional
(exactly 1) | The number of duffs paid to this output. May be `0`.

Only present if `spentindex` enabled +→ → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types.

Only present if `spentindex` enabled +→ → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→ → → →
`sequence` | number (int) | Required
(exactly 1) | The input sequence number +→ →
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 +→ → →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs +→ → → →
`value` | number (Dash) | Required
(exactly 1) | The number of Dash paid to this output. May be `0` +→ → → →
`valueSat` | number (duffs) | Required
(exactly 1) | The number of duffs paid to this output. May be `0` +→ → → →
`n` | number (int) | Required
(exactly 1) | The output index number of this output within this transaction +→ → → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script +→ → → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed +→ → → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex +→ → → → →
`reqSigs` | number (int) | Optional
(0 or 1) | The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) +→ → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts +→ → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types +→ → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→ →
`extraPayloadSize` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Size of the DIP2 extra payload. Only present if it's a DIP2 special transaction +→ →
`extraPayload` | string (hex) | Optional
(0 or 1) | *Added in Dash Core 0.13.0.0*

Hex encoded DIP2 extra payload data. Only present if it's a DIP2 special transaction +→ →
`fee` | number | Optional
(0 or 1) | The transaction fee in DASH, omitted if block undo data is not available +→ →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) +→ →
`instantlock_internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock +→
`cbTx` | object | Required
(exactly 1) | Coinbase special transaction details +→ →
`version` | number (int) | Required
(exactly 1) | The version of the Coinbase special transaction (CbTx) +→ →
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→ →
`merkleRootMNList` | string (hex) | Required
(exactly 1) | The merkle root for the masternode list +→ →
`merkleRootQuorums` | string (hex) | Required
(exactly 1) | The merkle root for the quorum list +→ →
`bestCLHeightDiff` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The best ChainLock height difference +→ →
`bestCLSignature` | string (hex) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The best ChainLock signature +→ →
`creditPoolBalance` | number (real) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The balance of the credit pool + +*Example from Dash Core 21.0.0* + +Get a block in raw hex: + +``` bash +dash-cli -testnet getblock \ + 00000379fb0a60210eb58e736775784b4e0491ae23b65f7916988f9d780a9f93 \ + 0 +``` + +Result (wrapped): + +``` text +00000020fdd8c7fa1c64fe932918d0a5c40209ab155f738291dec38c9e39690c\ +22000000cac98c66d5f8828ec72b68a24d61e354a19434fa0569707b90e5cd47\ +fefdd7653d425d6541f3031e468a050001030005000100000000000000000000\ +00000000000000000000000000000000000000000000ffffffff060326ff0d01\ +01ffffffff0283706e04000000001976a914c69a0bda7daaae481be8def95e5f\ +347a1d00a4b488ac89514b0d000000001976a91421eca01872dbfce4bf20886a\ +004f6caaa69c1ff788ac00000000af030026ff0d00581474bac547d8c933eb30\ +4e1c98d241bf807a85ea706591dacee405b3e7d3fac4c4566f175ccb5e3ee12f\ +0e869d2bb1ede63112975c8d147f8c072bd63960fe009849edd3f5f7c4ddfa54\ +dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bb\ +c2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299\ +c225e3ee290a7c96a448b83ed97f1e9ed34be1da354566da8a0202000000 +``` + +Get the same block in JSON: + +``` bash +dash-cli -testnet getblock \ + 00000379fb0a60210eb58e736775784b4e0491ae23b65f7916988f9d780a9f93 +``` + +Result: + +``` json +{ + "hash": "00000379fb0a60210eb58e736775784b4e0491ae23b65f7916988f9d780a9f93", + "confirmations": 107991, + "height": 917286, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "65d7fdfe47cde5907b706905fa3494a154e3614da2682bc78e82f8d5668cc9ca", + "time": 1700610621, + "mediantime": 1700609994, + "nonce": 363078, + "bits": "1e03f341", + "difficulty": 0.0009888562457268011, + "chainwork": "00000000000000000000000000000000000000000000000002d68d38fa5ef014", + "nTx": 1, + "previousblockhash": "000000220c69399e8cc3de9182735f15ab0902c4a5d0182993fe641cfac7d8fd", + "nextblockhash": "0000039bbed5dba71339bf917be5a797123919f02d1d9bda78cae3ab5d38985e", + "chainlock": true, + "size": 382, + "tx": [ + "65d7fdfe47cde5907b706905fa3494a154e3614da2682bc78e82f8d5668cc9ca" + ], + "cbTx": { + "version": 3, + "height": 917286, + "merkleRootMNList": "fad3e7b305e4ceda916570ea857a80bf41d2981c4e30eb33c9d847c5ba741458", + "merkleRootQuorums": "fe6039d62b078c7f148d5c971231e6edb12b9d860e2fe13e5ecb5c176f56c4c4", + "bestCLHeightDiff": 0, + "bestCLSignature": "9849edd3f5f7c4ddfa54dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bbc2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299c225e3ee290a7c96a448b83ed97f1e9ed34be1da3545", + "creditPoolBalance": 86.32588902 + } +} +``` + +Get the same block in JSON with transaction details: + +``` bash +dash-cli -testnet getblock \ + 00000379fb0a60210eb58e736775784b4e0491ae23b65f7916988f9d780a9f93 2 +``` + +Result: + +``` json +{ + "hash": "00000379fb0a60210eb58e736775784b4e0491ae23b65f7916988f9d780a9f93", + "confirmations": 107993, + "height": 917286, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "65d7fdfe47cde5907b706905fa3494a154e3614da2682bc78e82f8d5668cc9ca", + "time": 1700610621, + "mediantime": 1700609994, + "nonce": 363078, + "bits": "1e03f341", + "difficulty": 0.0009888562457268011, + "chainwork": "00000000000000000000000000000000000000000000000002d68d38fa5ef014", + "nTx": 1, + "previousblockhash": "000000220c69399e8cc3de9182735f15ab0902c4a5d0182993fe641cfac7d8fd", + "nextblockhash": "0000039bbed5dba71339bf917be5a797123919f02d1d9bda78cae3ab5d38985e", + "chainlock": true, + "size": 382, + "tx": [ + { + "txid": "65d7fdfe47cde5907b706905fa3494a154e3614da2682bc78e82f8d5668cc9ca", + "version": 3, + "type": 5, + "size": 301, + "locktime": 0, + "vin": [ + { + "coinbase": "0326ff0d0101", + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 0.74346627, + "valueSat": 74346627, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 c69a0bda7daaae481be8def95e5f347a1d00a4b4 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914c69a0bda7daaae481be8def95e5f347a1d00a4b488ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yeRZBWYfeNE4yVUHV4ZLs83Ppn9aMRH57A" + ] + } + }, + { + "value": 2.23039881, + "valueSat": 223039881, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 21eca01872dbfce4bf20886a004f6caaa69c1ff7 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91421eca01872dbfce4bf20886a004f6caaa69c1ff788ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yPQpcZ1EdtQXWHzNjZuvVCKXuESW5wZ5x1" + ] + } + } + ], + "extraPayloadSize": 175, + "extraPayload": "030026ff0d00581474bac547d8c933eb304e1c98d241bf807a85ea706591dacee405b3e7d3fac4c4566f175ccb5e3ee12f0e869d2bb1ede63112975c8d147f8c072bd63960fe009849edd3f5f7c4ddfa54dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bbc2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299c225e3ee290a7c96a448b83ed97f1e9ed34be1da354566da8a0202000000", + "cbTx": { + "version": 3, + "height": 917286, + "merkleRootMNList": "fad3e7b305e4ceda916570ea857a80bf41d2981c4e30eb33c9d847c5ba741458", + "merkleRootQuorums": "fe6039d62b078c7f148d5c971231e6edb12b9d860e2fe13e5ecb5c176f56c4c4", + "bestCLHeightDiff": 0, + "bestCLSignature": "9849edd3f5f7c4ddfa54dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bbc2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299c225e3ee290a7c96a448b83ed97f1e9ed34be1da3545", + "creditPoolBalance": 86.32588902 + }, + "hex": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff060326ff0d0101ffffffff0283706e04000000001976a914c69a0bda7daaae481be8def95e5f347a1d00a4b488ac89514b0d000000001976a91421eca01872dbfce4bf20886a004f6caaa69c1ff788ac00000000af030026ff0d00581474bac547d8c933eb304e1c98d241bf807a85ea706591dacee405b3e7d3fac4c4566f175ccb5e3ee12f0e869d2bb1ede63112975c8d147f8c072bd63960fe009849edd3f5f7c4ddfa54dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bbc2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299c225e3ee290a7c96a448b83ed97f1e9ed34be1da354566da8a0202000000", + "instantlock": true, + "instantlock_internal": false + } + ], + "cbTx": { + "version": 3, + "height": 917286, + "merkleRootMNList": "fad3e7b305e4ceda916570ea857a80bf41d2981c4e30eb33c9d847c5ba741458", + "merkleRootQuorums": "fe6039d62b078c7f148d5c971231e6edb12b9d860e2fe13e5ecb5c176f56c4c4", + "bestCLHeightDiff": 0, + "bestCLSignature": "9849edd3f5f7c4ddfa54dd43b06a8a6ca9043c6a6498cf0d757902e69301f780a5d6190ac0da904420bbc2e8079f590d0ebca384512f1c61910b51336e401759734189de9bdb9d26d299c225e3ee290a7c96a448b83ed97f1e9ed34be1da3545", + "creditPoolBalance": 86.32588902 + } +} +``` + +*See also* + +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. + +## GetBlockChainInfo + +The [`getblockchaininfo` RPC](../api/remote-procedure-calls-blockchain.md#getblockchaininfo) provides information about the current state of the block chain. + +*Parameters: none* + +*Result---A JSON object providing information about the block chain* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the current state of the local block chain +→
`chain` | string | Required
(exactly 1) | The name of the block chain. Either `main` for mainnet, `test` for testnet, `regtest` for regtest, or `devnet-` for devnets +→
`blocks` | number (int) | Required
(exactly 1) | The number of validated blocks in the local best block chain. For a new node with just the hardcoded genesis block, this will be 0 +→
`headers` | number (int) | Required
(exactly 1) | The number of validated headers in the local best headers chain. For a new node with just the hardcoded genesis block, this will be zero. This number may be higher than the number of *blocks* +→
`bestblockhash` | string (hex) | Required
(exactly 1) | The hash of the header of the highest validated block in the best block chain, encoded as hex in RPC byte order. This is identical to the string returned by the [`getbestblockhash` RPC](../api/remote-procedure-calls-blockchain.md#getbestblockhash) +→
`difficulty` | number (real) | Required
(exactly 1) | The difficulty of the highest-height block in the best block chain +→
`time` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.1.0**

The block time expressed in UNIX epoch time +→
`mediantime` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The median time of the 11 blocks before the most recent block on the blockchain. Used for validating transaction locktime under BIP113 +→
`verificationprogress` | number (real) | Required
(exactly 1) | Estimate of what percentage of the block chain transactions have been verified so far, starting at 0.0 and increasing to 1.0 for fully verified. May slightly exceed 1.0 when fully synced to account for transactions in the memory pool which have been verified before being included in a block +→
`initialblockdownload` | boolean | Required
(exactly 1) | *Added in Dash Core 0.16.0*

An estimate of whether this node is in [Initial Block Download](../guide/p2p-network-initial-block-download.md) mode (*debug information*) +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes checked from the genesis block to this block, encoded as big-endian hex +→
`size_on_disk` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*

The estimated size of the block and undo files on disk +→
`pruned` | bool | Required
(exactly 1) | *Added in Bitcoin Core 0.11.0*

Indicates if the blocks are subject to pruning +→
`pruneheight` | number (int) | Optional
(0 or 1) | *Added in Bitcoin Core 0.11.0*

The lowest-height complete block stored if pruning is activated +→
`automatic_pruning` | bool | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Whether automatic pruning is enabled (only present if pruning is enabled) +→
`prune_target_size` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.16.0*

The target size used by pruning (only present if automatic pruning is enabled) +→
`softforks` | object | Required
(exactly 1) | **Revised significantly in Dash Core 20.0.0**

An object with each key describing a current or previous soft fork +→ →
Softfork | object | Required
(0 or more) | The name of a specific softfork +→ → →
`type` | string | Required | One of "buried", "bip9" +→ → →
`bip9` | object | Optional | Status of bip9 softforks (only for "bip9" type) +→ → → →
`status` | string | Required | One of "defined", "started", "locked_in", "active", "failed" +→ → → →
`bit` | numeric | Optional | The bit (0-28) in the block version field used to signal this softfork (only for "started" status) +→ → → →
`start_time` | numeric | Required | The minimum median time past of a block at which the bit gains its meaning +→ → → →
`timeout` | numeric | Required | The median time past of a block at which the deployment is considered failed if not yet locked in +→ → → →
`since` | numeric | Required | Height of the first block to which the status applies +→ → → →
`activation_height` | numeric | Optional | Expected activation height for this softfork (only for "locked_in" `status`) +→ → → →
`min_activation_height` | numeric | Optional | Minimum height of blocks for which the rules may be enforced +→ → → →
`ehf` | bool | Required | `true` for EHF activated hard forks +→ → → →
`ehf_height` | numeric | Optional | The minimum height at which miner's signals for the deployment matter. Below this height miner signaling cannot trigger hard fork lock-in. Not returned if `ehf` is `false` or if the minimum height is not known yet. +→ → → →
`statistics` | string : object | Required
(exactly 1) | *Added in Dash Core 0.15.0*

Numeric statistics about BIP9 signaling for a softfork (only for \started\" status)" +→ → → → →
`period` | numeric
(int) | Optional
(0 or 1) | *Added in Dash Core 0.15.0*

The length in blocks of the BIP9 signaling period. Field is only shown when status is `started` +→ → → → →
`threshold` | numeric
(int) | Optional
(0 or 1) | *Added in Dash Core 0.15.0*

The number of blocks with the version bit set required to activate the feature. Field is only shown when status is `started` +→ → → → →
`elapsed` | numeric
(int) | Optional
(0 or 1) | *Added in Dash Core 0.15.0*

The number of blocks elapsed since the beginning of the current period. Field is only shown when status is `started` +→ → → → →
`count` | numeric
(int) | Optional
(0 or 1) | *Added in Dash Core 0.15.0*

The number of blocks with the version bit set in the current period. Field is only shown when status is `started` +→ → → → →
`possible` | bool | Optional
(0 or 1) | *Added in Bitcoin Core 0.11.0*

Returns false if there are not enough blocks left in this period to pass activation threshold. Field is only shown when status is `started` +→ → →
`height` | numeric | Optional | Height of the first block at which the rules are or will be enforced (only for "buried" type, or "bip9" type with "active" status) +→ → →
`active` | boolean | Required | True if the rules are enforced for the mempool and the next block +→
`warnings` | string | Optional
(0 or 1) | *Added in Dash Core 0.16.0*

Returns any network and blockchain warnings + +*Example from Dash Core 21.0.0* + +``` bash +dash-cli -testnet getblockchaininfo +``` + +Result: + +``` json +{ + "chain": "test", + "blocks": 1025413, + "headers": 1025413, + "bestblockhash": "000000a7f4dbe0865dbbfacf24d8cdb2914fc0ba2d24131ed7ea0b181bec532f", + "difficulty": 0.002316476131335342, + "time": 1715629755, + "mediantime": 1715628900, + "verificationprogress": 0.9999996933131421, + "initialblockdownload": false, + "chainwork": "000000000000000000000000000000000000000000000000030928dd71247c3d", + "size_on_disk": 3508237778, + "pruned": false, + "softforks": { + "bip34": { + "type": "buried", + "active": true, + "height": 76 + }, + "bip66": { + "type": "buried", + "active": true, + "height": 2075 + }, + "bip65": { + "type": "buried", + "active": true, + "height": 2431 + }, + "bip147": { + "type": "buried", + "active": true, + "height": 4300 + }, + "csv": { + "type": "buried", + "active": true, + "height": 8064 + }, + "dip0001": { + "type": "buried", + "active": true, + "height": 5500 + }, + "dip0003": { + "type": "buried", + "active": true, + "height": 7000 + }, + "dip0008": { + "type": "buried", + "active": true, + "height": 78800 + }, + "dip0020": { + "type": "buried", + "active": true, + "height": 414100 + }, + "dip0024": { + "type": "buried", + "active": true, + "height": 769700 + }, + "realloc": { + "type": "buried", + "active": true, + "height": 387500 + }, + "v19": { + "type": "buried", + "active": true, + "height": 850100 + }, + "v20": { + "type": "bip9", + "bip9": { + "status": "active", + "start_time": 1693526400, + "timeout": 9223372036854775807, + "ehf": false, + "since": 905100, + "min_activation_height": 0 + }, + "height": 905100, + "active": true + }, + "mn_rr": { + "type": "bip9", + "bip9": { + "status": "defined", + "start_time": 1693526400, + "timeout": 9223372036854775807, + "ehf": true, + "since": 0, + "min_activation_height": 0 + }, + "active": false + } + }, + "warnings": "Make sure to encrypt your wallet and delete all non-encrypted backups after you have verified that the wallet works!" +} +``` + +*See also* + +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. +* [GetWalletInfo](../api/remote-procedure-calls-wallet.md#getwalletinfo): provides information about the wallet. + +## GetBlockCount + +The [`getblockcount` RPC](../api/remote-procedure-calls-blockchain.md#getblockcount) returns the number of blocks in the local best block chain. + +*Parameters: none* + +*Result---the number of blocks in the local best block chain* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | number (int) | Required
(exactly 1) | The number of blocks in the local best block chain. For a new node with only the hardcoded genesis block, this number will be 0 + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getblockcount +``` + +Result: + +``` text +4627 +``` + +*See also* + +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. + +## GetBlockHash + +The [`getblockhash` RPC](../api/remote-procedure-calls-blockchain.md#getblockhash) returns the header hash of a block at the given height in the local best block chain. + +*Parameter---a block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block Height | number (int) | Required
(exactly 1) | The height of the block whose header hash should be returned. The height of the hardcoded genesis block is 0 + +*Result---the block header hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex)/null | Required
(exactly 1) | The hash of the block at the requested height, encoded as hex in RPC byte order, or JSON `null` if an error occurred + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getblockhash 4000 +``` + +Result: + +``` text +00000ce22113f3eb8636e225d6a1691e132fdd587aed993e1bc9b07a0235eea4 +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. + +## GetBlockFilter + +*Added in Dash Core 18.0.0* + +The [`getblockfilter` RPC](../api/remote-procedure-calls-blockchain.md#getblockfilter) retrieves a [BIP157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) content filter for a particular block. + +:::{note} +Requires the `-blockfilterindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +*Parameter #1---blockhash* + +Name | Type | Presence | Description +--- | --- | --- | --- +Hash | string | Required
(exactly 1) | The hash of the block + +*Parameter #2---filtertype* + +Name | Type | Presence | Description +--- | --- | --- | --- +Filter type | string | Optional
(0 or 1) | The type name of the filter (default: basic). + +*Result---A JSON object with the encoded filter data* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | The hex-encoded filter data. +→
`filter` | string (hex) | Required
(exactly 1) | The hex-encoded filter data +→
`header` | string (hex) | Required
(exactly 1) | The hex-encoded filter header + +*Example from Dash Core 18.0.0* + +``` bash +dash-cli -testnet getblockfilter 0000004bb972bddf8d5b2bce517db07ff4c69a04e74e9c0bd2caa11ee23d0323 basic +``` + +Result: + +``` json +{ + "filter": "038c72a18c696aca7a", + "header": "f80b699589d1bfb1b269f948e9114034686c110273b01b6e4c0026ade1d6b968" +} +``` + +## GetBlockHashes + +:::{note} +Requires `timestampindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +*Added in Dash Core 0.12.1* + +The [`getblockhashes` RPC](../api/remote-procedure-calls-blockchain.md#getblockhashes) returns array of hashes of blocks within the timestamp range provided (requires `timestampindex` to be enabled). + +*Parameter #1---high block timestamp* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block Timestamp | number (int) | Required
(exactly 1) | The block timestamp for the newest block hash that should be returned. + +*Parameter #2---low block timestamp* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block Timestamp | number (int) | Required
(exactly 1) | The block timestamp for the oldest block hash that should be returned. + +*Result---the block header hashes in the give time range* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | The hashes of the blocks in the requested time range +→
`hash` | string (hex) | Required
(1 or more) | The hash of a block in the chain, encoded as hex in RPC byte order + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getblockhashes 1507555793 1507554793 +``` + +Result: + +``` json +[ + "0000000010a16c6fbc6bd5cdc238c2beabcda334e97fde1500d59be4e6fc4b89", + "000000009910885e811230c403e55aac6547d6df04ee671b2e8348524f73cab8", + "000000004bbb3828db1c4d4491760336cec215087819ab656336f30d4095e3d2", + "00000000ad2df2149aca2261a9a87c41e139dfe8f73d91db7ec0c1837fee21a0", + "0000000074068a9e3a271d165da3deb28bc3f8c751dde97f460d8078d92a9d06" +] +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. + +```{eval-rst} +.. _api-rpc-blockchain-getblockheader: +``` + +## GetBlockHeader + +*Added in Bitcoin Core 0.12.0* + +The [`getblockheader` RPC](../api/remote-procedure-calls-blockchain.md#getblockheader) gets a block header with a particular header hash from the local block database either as a JSON object or as a serialized block header. + +*Parameter #1---header hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | string (hex) | Required
(exactly 1) | The hash of the block header to get, encoded as hex in RPC byte order + +*Parameter #2---JSON or hex output* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | bool | Optional
(0 or 1) | Set to `false` to get the block header in serialized block format; set to `true` (the default) to get the decoded block header as a JSON object + +*Result (if format was `false`)---a serialized block header* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex)/null | Required
(exactly 1) | The requested block header as a serialized block, encoded as hex, or JSON `null` if an error occurred + +*Result (if format was `true` or omitted)---a JSON block header* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred +→
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→
`time` | number (int) | Required
(exactly 1) | The time of the block +→
`mediantime` | number (int) | Required
(exactly 1) | The computed median time of the previous 11 blocks. Used for validating transaction locktime under BIP113 +→
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block +→
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order + +*Changes from Bitcoin - Following items not present in Dash result* + +Name | Type | Presence | Description +--- | --- | --- | --- +→
`versionHex` | number (hex) | Required
(exactly 1) | This block's hex version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) + +*Example from Dash Core 0.16.0* + +Get a block header in raw hex: + +``` bash +dash-cli -testnet getblockheader \ + 00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b \ + false +``` + +Result (wrapped): + +``` text +00000020272e374a06c87a0ce0e6ee1a0754c98b9ec2493e7c0ac7ba41a0\ +730000000000568b3c4156090db4d8db5447762e95dd1d4c921c96801a9\ +086720ded85266325916cc05caa94001c5caf3595 +``` + +Get the same block in JSON: + +``` bash +dash-cli -testnet getblockheader \ + 00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b +``` + +Result: + +``` json +{ + "hash": "00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b", + "confirmations": 212900, + "height": 86190, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56", + "time": 1556114577, + "mediantime": 1556113720, + "nonce": 2503323484, + "bits": "1c0094aa", + "difficulty": 440.8261075201009, + "chainwork": "0000000000000000000000000000000000000000000000000045ab6f9403a8e7", + "nTx": 1, + "previousblockhash": "000000000073a041bac70a7c3e49c29e8bc954071aeee6e00c7ac8064a372e27", + "nextblockhash": "00000000001c6c962639a1aad4cd069f315560a824d489418dc1f26b50a58aed", + "chainlock": true +} +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBlockHashes](../api/remote-procedure-calls-blockchain.md#getblockhashes): returns array of hashes of blocks within the timestamp range provided (requires `timestampindex` to be enabled). +* [GetBlockHeaders](../api/remote-procedure-calls-blockchain.md#getblockheaders): returns an array of items with information about the requested number of blockheaders starting from the requested hash. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. + +```{eval-rst} +.. _api-rpc-blockchain-getblockheaders: +``` + +## GetBlockHeaders + +*Added in Dash Core 0.12.1* + +The [`getblockheaders` RPC](../api/remote-procedure-calls-blockchain.md#getblockheaders) returns an array of items with information about the requested number of blockheaders starting from the requested hash. + +*Parameter #1---header hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | string (hex) | Required
(exactly 1) | The hash of the block header to get, encoded as hex in RPC byte order + +*Parameter #2---number of headers to return* + +Name | Type | Presence | Description +--- | --- | --- | --- +Count | number | Optional
(exactly 1) | The number of block headers to get + +*Parameter #3---JSON or hex output* + +Name | Type | Presence | Description +--- | --- | --- | --- +Verbose | bool | Optional
(0 or 1) | Set to `false` to get the block headers in serialized block format; set to `true` (the default) to get the decoded block headers as a JSON object + +*Result (if format was `false`)---a serialized block header* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | The requested block header(s) as a serialized block +→
`header` | string (hex) | Required
(1 or more) | The block header encoded as hex in RPC byte order + +*Result (if format was `true` or omitted)---a JSON block header* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of objects each containing a block header, or JSON `null` if an error occurred +→
Block Header | object/null | Required
(exactly 1) | An object containing a block header +→ →
`hash` | string (hex) | Required
(exactly 1) | The hash of this block's block header encoded as hex in RPC byte order. This is the same as the hash provided in parameter #1 +→ →
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transactions in this block have, starting at 1 when this block is at the tip of the best block chain. This score will be -1 if the the block is not part of the best block chain +→ →
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain +→ →
`version` | number (int) | Required
(exactly 1) | This block's version number. See [block version numbers](../reference/block-chain-block-headers.md#block-versions) +→ →
`merkleroot` | string (hex) | Required
(exactly 1) | The merkle root for this block, encoded as hex in RPC byte order +→ →
`time` | number (int) | Required
(exactly 1) | The time of the block +→ →
`mediantime` | number (int) | Required
(exactly 1) | The computed median time of the previous 11 blocks. Used for validating transaction locktime under BIP113 +→ →
`nonce` | number (int) | Required
(exactly 1) | The nonce which was successful at turning this particular block into one that could be added to the best block chain +→ →
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass +→ →
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex +→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→ →
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block +→ →
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order + +*Example from Dash Core 0.16.0* + +Get two block headers in raw hex: + +``` bash +dash-cli -testnet getblockheaders \ + 00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b \ + 2 false +``` + +Result (wrapped): + +``` text +[ + "00000020272e374a06c87a0ce0e6ee1a0754c98b9ec2493e7c0ac7ba41a0730000000\ + 000568b3c4156090db4d8db5447762e95dd1d4c921c96801a9086720ded8526632591\ + 6cc05caa94001c5caf3595", + "000000202be60663802ead0740cb6d6e49ee7824481280f03c71369eb90f7b00000000\ + 006abd277facc8cf02886d88662dbcc2adb6d8de7a491915e74bed4d835656a4f1f26d\ + c05ced93001ccf81cabc" +] +``` + +Get the same two block headers in JSON: + +``` bash +dash-cli -testnet getblockheader \ + 00000000eb0af5aec7b673975a22593dc0cc763f71ba8de26292410273437078 \ + 2 true +``` + +Result: + +``` json +[ + { + "hash": "00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b", + "confirmations": 212910, + "height": 86190, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56", + "time": 1556114577, + "mediantime": 1556113720, + "nonce": 2503323484, + "bits": "1c0094aa", + "difficulty": 440.8261075201009, + "chainwork": "0000000000000000000000000000000000000000000000000045ab6f9403a8e7", + "nTx": 1, + "previousblockhash": "000000000073a041bac70a7c3e49c29e8bc954071aeee6e00c7ac8064a372e27", + "nextblockhash": "00000000001c6c962639a1aad4cd069f315560a824d489418dc1f26b50a58aed", + "chainlock": true + }, + { + "hash": "00000000001c6c962639a1aad4cd069f315560a824d489418dc1f26b50a58aed", + "confirmations": 212909, + "height": 86191, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "f1a45656834ded4be71519497aded8b6adc2bc2d66886d8802cfc8ac7f27bd6a", + "time": 1556114930, + "mediantime": 1556113903, + "nonce": 3167388111, + "bits": "1c0093ed", + "difficulty": 443.0262219757585, + "chainwork": "0000000000000000000000000000000000000000000000000045ad2a9c752d18", + "nTx": 1, + "previousblockhash": "00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b", + "nextblockhash": "000000000076a17beb1bb56e6ec53579f8a604d2363c9a4f8ca3f63e6aca3423", + "chainlock": true + } +] +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. +* [GetBlockHashes](../api/remote-procedure-calls-blockchain.md#getblockhashes): returns array of hashes of blocks within the timestamp range provided (requires `timestampindex` to be enabled). +* [GetBlockHeader](../api/remote-procedure-calls-blockchain.md#getblockheader): gets a block header with a particular header hash from the local block database either as a JSON object or as a serialized block header. +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. + +## GetBlockStats + +The [`getblockstats` RPC](../api/remote-procedure-calls-blockchain.md#getblockstats) computes per block statistics for a given window. + +This RPC won't work for some heights if pruning is enabled. Since Dash Core 18.1, `-txindex` is no longer required and it works for all non-pruned blocks. + +*Parameter #1---hash_or_height* + +Name | Type | Presence | Description +--- | --- | --- | --- +hash_or_height | string or numeric | Required
(exactly 1) | The block hash or height of the target block + +*Parameter #2---stats* + +Name | Type | Presence | Description +--- | --- | --- | --- +stats | array | optional | Values to plot, by default all values (see result below) + +*Result---a JSON object containing the requested statistics* + +:::{note} +All amounts are in duffs. +::: + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing stats for the requested block, or JSON `null` if an error occurred +→
`avgfee` | numeric | Required
(exactly 1) | Average fee in the block +→
`avgfeerate` | numeric | Required
(exactly 1) | Average feerate (in duffs per byte) +→
`avgtxsize` | numeric | Required
(exactly 1) | Average transaction size +→
`blockhash` | string (hex) | Required
(exactly 1) | The block hash (to check for potential reorgs) +→
`feerate_percentiles` | array (num) | Required
(exactly 1) | _Added in Dash Core 18.0.0_
Feerates at the 10th, 25th, 50th, 75th, and 90th percentile weight unit, which are in duffs per byte. +→ →
`10th_percentile_feerate` | numeric | Required
(exactly 1) | The 10th percentile feerate +→ →
`25th_percentile_feerate` | numeric | Required
(exactly 1) | The 25th percentile feerate +→ →
`50th_percentile_feerate` | numeric | Required
(exactly 1) | The 50th percentile feerate +→ →
`75th_percentile_feerate` | numeric | Required
(exactly 1) | The 75th percentile feerate +→ →
`90th_percentile_feerate` | numeric | Required
(exactly 1) | The 90th percentile feerate +→
`height` | numeric | Required
(exactly 1) | The height of the block +→
`ins` | numeric | Required
(exactly 1) | The number of inputs (excluding coinbase) +→
`maxfee` | numeric | Required
(exactly 1) | Maximum fee in the block +→
`maxfeerate` | numeric | Required
(exactly 1) | Maximum feerate (in duffs per byte) +→
`maxtxsize` | numeric | Required
(exactly 1) | Maximum transaction size +→
`medianfee` | numeric | Required
(exactly 1) | Truncated median fee in the block +→
~~medianfeerate~~ | ~~numeric~~ | ~~Required (exactly 1)~~ | **Removed in Dash Core 18.0.0**
~~Truncated median feerate (in duffs per byte)~~ +→
`mediantime` | numeric | Required
(exactly 1) | The block median time past +→
`mediantxsize` | numeric | Required
(exactly 1) | Truncated median transaction size +→
`minfee` | numeric | Required
(exactly 1) | Minimum fee in the block +→
`minfeerate` | numeric | Required
(exactly 1) | Minimum feerate (in duffs per byte) +→
`mintxsize` | numeric | Required
(exactly 1) | Minimum transaction size +→
`outs` | numeric | Required
(exactly 1) | The number of outputs +→
`subsidy` | numeric | Required
(exactly 1) | The block subsidy +→
`time` | number (real) | Required
(exactly 1) | The block time +→
`total_out` | numeric | Required
(exactly 1) | Total amount in all outputs (excluding coinbase and thus reward [i.e. subsidy + totalfee]) +→
`total_size` | numeric | Required
(exactly 1) | Total size of all non-coinbase transactions +→
`totalfee` | numeric | Required
(exactly 1) | The fee total +→
`txs` | numeric | Required
(exactly 1) | The number of transactions (including coinbase) +→
`utxo_increase` | numeric | Required
(exactly 1) | The increase/decrease in the number of unspent outputs +→
`utxo_size_inc` | numeric | Required
(exactly 1) | The increase/decrease in size for the utxo index (not discounting op_return and similar) + +*Example from Dash Core 18.0.0* + +``` bash +dash-cli getblockstats 1000 '["minfeerate","avgfeerate"]' +``` + +Result: + +``` json +{ + "avgfeerate": 0, + "minfeerate": 0 +} +``` + +*See also: none* + +## GetChainTips + +The [`getchaintips` RPC](../api/remote-procedure-calls-blockchain.md#getchaintips) returns information about the highest-height block (tip) of each local block chain. + +*Parameters: none* + +*Result---an array of block chain tips* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of JSON objects, with each object describing a chain tip. At least one tip---the local best block chain---will always be present +→
Tip | object | Required
(1 or more) | An object describing a particular chain tip. The first object will always describe the active chain (the local best block chain) +→ →
`height` | number (int) | Required
(exactly 1) | The height of the highest block in the chain. A new node with only the genesis block will have a single tip with height of 0 +→ →
`hash` | string (hex) | Required
(exactly 1) | The hash of the highest block in the chain, encoded as hex in RPC byte order +→
`difficulty` | number (real) | Required
(exactly 1) | The difficulty of the highest-height block in the best block chain (Added in Dash Core 0.12.1) +→
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes checked from the genesis block to this block, encoded as big-endian hex (Added in Dash Core 0.12.1) +→ →
`branchlen` | number (int) | Required
(exactly 1) | The number of blocks that are on this chain but not on the main chain. For the local best block chain, this will be `0`; for all other chains, it will be at least `1` +→ →
`forkpoint` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.12.3*

Block hash of the last common block between this tip and the main chain +→ →
`status` | string | Required
(exactly 1) | The status of this chain. Valid values are:
• `active` for the local best block chain
• `invalid` for a chain that contains one or more invalid blocks
• `headers-only` for a chain with valid headers whose corresponding blocks both haven't been validated and aren't stored locally
• `valid-headers` for a chain with valid headers whose corresponding blocks are stored locally, but which haven't been fully validated
• `valid-fork` for a chain which is fully validated but which isn't part of the local best block chain (it was probably the local best block chain at some point)
• `unknown` for a chain whose reason for not being the active chain is unknown + +*Example from Dash Core 0.12.3* + +``` bash +dash-cli -testnet getchaintips +``` + +``` json +[ + { + "height": 110192, + "hash": "000000000c6007f40c3b68a77b0e1319a89c0504ae1b391d071cf49fa7591dee", + "difficulty": 18.38631407059958, + "chainwork": "000000000000000000000000000000000000000000000000002cbd2546718747", + "branchlen": 0, + "forkpoint": "000000000c6007f40c3b68a77b0e1319a89c0504ae1b391d071cf49fa7591dee", + "status": "active" + } +] +``` + +*See also* + +* [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. + +## GetChainTxStats + +The [`getchaintxstats` RPC](../api/remote-procedure-calls-blockchain.md#getchaintxstats) compute statistics about the total number and rate of transactions in the chain. + +*Parameter #1---nblocks* + +Name | Type | Presence | Description +--- | --- | --- | --- +nblocks | number (int) | Optional | Size of the window in number of blocks (default: one month). + +*Parameter #2---blockhash* + +Name | Type | Presence | Description +--- | --- | --- | --- +blockhash | string | Optional | The hash of the block that ends the window. + +*Result--statistics about transactions* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Object containing transaction statistics +→
`time` | number (int) | Required
(exactly 1) | The timestamp for the statistics in UNIX format +→
`txcount` | number (int) | Required
(exactly 1) | The total number of transactions in the chain up to that point +→
`window_final_block_hash` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.17.0*

The hash of the final block in the window +→
`window_block_count` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Size of the window in number of blocks +→
`window_final_block_height` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

Height of the final block in window +→
`window_tx_count` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.16.0*

The number of transactions in the window. Only returned if `window_block_count` is > 0 +→
`window_interval` | number (int) | Optional
(0 or 1) | *Added in Dash Core 0.16.0*

The elapsed time in the window in seconds. Only returned if `window_block_count` is > 0 +→
`txrate` | number (int) | Optional
(0 or 1) | The average rate of transactions per second in the window. Only returned if `window_interval` is > 0 + +*Example from Dash Core 18.0.0* + +``` bash +dash-cli -testnet getchaintxstats +``` + +Result: + +``` json +{ + "time": 1634200935, + "txcount": 5255650, + "window_final_block_hash": "0000013524141f0e54137d266088c3d042cca340eabc4393414d7d0560866239", + "window_final_block_height": 593815, + "window_block_count": 17280, + "window_tx_count": 33384, + "window_interval": 2417430, + "txrate": 0.0138097070028915 +} + +``` + +*See also: none* + +## GetDifficulty + +The [`getdifficulty` RPC](../api/remote-procedure-calls-blockchain.md#getdifficulty) returns the proof-of-work difficulty as a multiple of the minimum difficulty. + +*Parameters: none* + +*Result---the current difficulty* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | number (real) | Required
(exactly 1) | The difficulty of creating a block with the same target threshold (nBits) as the highest-height block in the local best block chain. The number is a a multiple of the minimum difficulty + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getdifficulty +``` + +Result: + +``` text +1.069156225528583 +``` + +*See also* + +* [GetNetworkHashPS](../api/remote-procedure-calls-mining.md#getnetworkhashps): returns the estimated network hashes per second based on the last n blocks. +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. + +```{eval-rst} +.. _api-rpc-blockchain-getmempoolancestors: +``` + +## GetMemPoolAncestors + +*Added in Dash Core 0.12.3* + +The [`getmempoolancestors` RPC](../api/remote-procedure-calls-blockchain.md#getmempoolancestors) returns all in-mempool ancestors for a transaction in the mempool. + +*Parameter #1---a transaction identifier (TXID)* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string (hex) | Required
(exactly 1) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Parameter #2---desired output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | bool | Optional
(0 or 1) | Set to `true` to get json objects describing each transaction in the memory pool; set to `false` (the default) to only get an array of TXIDs + +*Result---list of ancestor transactions* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of TXIDs belonging to transactions in the memory pool. The array may be empty if there are no transactions in the memory pool +→
TXID | string | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Result (format: `true`)---a JSON object describing each transaction* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty +→
TXID | string : object | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order +→ →
`size` | number (int) | Required
(exactly 1) | The size of the serialized transaction in bytes +→ →
`fee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee paid by the transaction in decimal bitcoins +→ →
`modifiedfee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee with fee deltas used for mining priority in decimal bitcoins +→ →
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format +→ →
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool +→ →
`descendantcount` | number (int) | Required
(exactly 1) | The number of in-mempool descendant transactions (including this one) +→ →
`descendantsize` | number (int) | Required
(exactly 1) | The size of in-mempool descendants (including this one) +→ →
`descendantfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→ →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) +→ →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) +→ →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) +→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty +→ → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order +→ →
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction +→ → →
TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions spending from this transaction +→ →
`unbroadcast` | bool | Required
(exactly 1) | **Added in Dash Core 20.0.0**
True if this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers) +→ →
`instantlock` | bool | Required
(exactly 1) | Set to `true` if this transaction was locked via [InstantSend](../resources/glossary.md#instantsend) + +*Examples from Dash Core 20.0.0* + +The default (`false`): + +``` bash +dash-cli getmempoolancestors c32b5d5d94a6d151b69bfd25d77e5b538dffba2445b957c81fcf9df1b90f4ba1 +``` + +Result: + +``` json +[ + "d64eb30e5435e7a4564df9d06525a8ab48858fdaf111661d1e7874a72cebc132" +] +``` + +Verbose output (`true`): + +``` bash +dash-cli getmempoolancestors c32b5d5d94a6d151b69bfd25d77e5b538dffba2445b957c81fcf9df1b90f4ba1 true +``` + +Result: + +``` json +{ + "177826190c3fd38a93a381a9b5ad7d955c3f2cf886f7c6f0d58647fb868cf9f5": { + "fees": { + "base": 0.00000226, + "modified": 0.00000226, + "ancestor": 0.00000226, + "descendant": 0.00003226 + }, + "vsize": 226, + "fee": 0.00000226, + "modifiedfee": 0.00000226, + "time": 1690318336, + "height": 1909978, + "descendantcount": 6, + "descendantsize": 1648, + "descendantfees": 3226, + "ancestorcount": 1, + "ancestorsize": 226, + "ancestorfees": 226, + "depends": [ + ], + "spentby": [ + "127cfa4cd892ad78b9c1227bebfef2bb5a8a06636b659a734c0a5787004934ca" + ], + "instantlock": "true", + "unbroadcast": false + } +} +``` + +*See also* + +* [GetMemPoolDescendants](../api/remote-procedure-calls-blockchain.md#getmempooldescendants): returns all in-mempool descendants for a transaction in the mempool. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. + +```{eval-rst} +.. _api-rpc-blockchain-getmempooldescendants: +``` + +## GetMemPoolDescendants + +*Added in Dash Core 0.12.3* + +The [`getmempooldescendants` RPC](../api/remote-procedure-calls-blockchain.md#getmempooldescendants) returns all in-mempool descendants for a transaction in the mempool. + +*Parameter #1---a transaction identifier (TXID)* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string (hex) | Required
(exactly 1) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Parameter #2---desired output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | bool | Optional
(0 or 1) | Set to `true` to get json objects describing each transaction in the memory pool; set to `false` (the default) to only get an array of TXIDs + +*Result---list of descendant transactions* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of TXIDs belonging to transactions in the memory pool. The array may be empty if there are no transactions in the memory pool +→
TXID | string | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Result (format: `true`)---a JSON object describing each transaction* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty +→
TXID | string : object | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order +→ →
`size` | number (int) | Required
(exactly 1) | The size of the serialized transaction in bytes +→ →
`fee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee paid by the transaction in decimal bitcoins +→ →
`modifiedfee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee with fee deltas used for mining priority in decimal bitcoins +→ →
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format +→ →
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool +→ →
`descendantcount` | number (int) | Required
(exactly 1) | The number of in-mempool descendant transactions (including this one) +→ →
`descendantsize` | number (int) | Required
(exactly 1) | The size of in-mempool descendants (including this one) +→ →
`descendantfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→ →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) +→ →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) +→ →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) +→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty +→ → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order +→ →
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction +→ → →
TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions spending from this transaction +→ →
`unbroadcast` | bool | Required
(exactly 1) | **Added in Dash Core 20.0.0**
True if this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers) +→ →
`instantlock` | bool | Required
(exactly 1) | Set to `true` if this transaction was locked via [InstantSend](../resources/glossary.md#instantsend) + +*Examples from Dash Core 20.0.0* + +The default (`false`): + +``` bash +dash-cli getmempooldescendants 414735b9b4da8232299b25510628e321ba7d2adfb042f7c6437ad3b0f7793b80 +``` + +Result: + +``` json +[ + "94445715afd59a7ecc2fd6d62e42905194e91633e8f54b459f605fe0d780fe99" +] +``` + +Verbose output (`true`): + +``` bash +dash-cli getmempooldescendants 414735b9b4da8232299b25510628e321ba7d2adfb042f7c6437ad3b0f7793b80 true +``` + +Result: + +``` json +{ + "94445715afd59a7ecc2fd6d62e42905194e91633e8f54b459f605fe0d780fe99": { + "fees": { + "base": 0.00000225, + "modified": 0.00000225, + "ancestor": 0.00000450, + "descendant": 0.00000225 + }, + "vsize": 225, + "fee": 0.00000225, + "modifiedfee": 0.00000225, + "time": 1690906537, + "height": 879144, + "descendantcount": 1, + "descendantsize": 225, + "descendantfees": 225, + "ancestorcount": 2, + "ancestorsize": 450, + "ancestorfees": 450, + "depends": [ + "414735b9b4da8232299b25510628e321ba7d2adfb042f7c6437ad3b0f7793b80" + ], + "spentby": [ + ], + "instantlock": "true", + "unbroadcast": false + } +} +``` + +*See also* + +* [GetMemPoolAncestors](../api/remote-procedure-calls-blockchain.md#getmempoolancestors): returns all in-mempool ancestors for a transaction in the mempool. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. + +```{eval-rst} +.. _api-rpc-blockchain-getmempoolentry: +``` + +## GetMemPoolEntry + +*Added in Dash Core 0.14.0* + +The [`getmempoolentry` RPC](../api/remote-procedure-calls-blockchain.md#getmempoolentry) returns mempool data for given transaction (must be in mempool). + +*Parameter #1---a transaction identifier (TXID)* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string (hex) | Required
(exactly 1) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Result ---a JSON object describing the transaction* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty +→
`vsize` | number (int) | Required
(exactly 1) | The virtual transaction size. This can be different from actual serialized size for high-sigop transactions. +→
`fee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee paid by the transaction in decimal bitcoins +→
`modifiedfee` | number (bitcoins) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee with fee deltas used for mining priority in decimal bitcoins +→
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format +→
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool +→
`descendantcount` | number (int) | Required
(exactly 1) | The number of in-mempool descendant transactions (including this one) +→
`descendantsize` | number (int) | Required
(exactly 1) | The size of in-mempool descendants (including this one) +→
`descendantfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) +→
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) +→
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) +→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty +→ →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order +→
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction +→ →
TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions spending from this transaction +→
`unbroadcast` | bool | Required
(exactly 1) | **Added in Dash Core 20.0.0**
True if this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers) +→
`instantlock` | bool | Required
(exactly 1) | Set to `true` if this transaction was locked via [InstantSend](../resources/glossary.md#instantsend) + +*Example from Dash Core 20.0.0* + +``` bash +dash-cli getmempoolentry 33136ead40c8ad0019be7ab8d8e430c1e336fd6f7fcfe204096c0da28d9a6225 +``` + +Result: + +``` json +{ + "fees": { + "base": 0.00009350, + "modified": 0.00009350, + "ancestor": 0.00009350, + "descendant": 0.00009350 + }, + "vsize": 374, + "fee": 0.00009350, + "modifiedfee": 0.00009350, + "time": 1690317662, + "height": 1909971, + "descendantcount": 1, + "descendantsize": 374, + "descendantfees": 9350, + "ancestorcount": 1, + "ancestorsize": 374, + "ancestorfees": 9350, + "depends": [ + ], + "spentby": [ + ], + "instantlock": "true", + "unbroadcast": false +} +``` + +*See also* + +* [GetMemPoolAncestors](../api/remote-procedure-calls-blockchain.md#getmempoolancestors): returns all in-mempool ancestors for a transaction in the mempool. +* [GetMemPoolDescendants](../api/remote-procedure-calls-blockchain.md#getmempooldescendants): returns all in-mempool descendants for a transaction in the mempool. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. + +## GetMemPoolInfo + +The [`getmempoolinfo` RPC](../api/remote-procedure-calls-blockchain.md#getmempoolinfo) returns information about the node's current transaction memory pool. + +*Parameters: none* + +*Result---information about the transaction memory pool* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing information about the memory pool +→
`loaded` | boolean | Required
(exactly 1) | True if the mempool is fully loaded +→
`size` | number (int) | Required
(exactly 1) | The number of transactions currently in the memory pool +→
`bytes` | number (int) | Required
(exactly 1) | The total number of bytes in the transactions in the memory pool +→
`usage` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.11.0*

Total memory usage for the mempool in bytes +`total_fee` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.1.0**

Total fees for the mempool in DASH, ignoring fees modified through prioritizetransaction +→
`maxmempool` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

Maximum memory usage for the mempool in bytes +→
`mempoolminfee` | number | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The lowest fee per kilobyte paid by any transaction in the memory pool +→
`mempoolminfee` | number | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Minimum fee rate in DASH/kB for tx to be accepted. Is the maximum of minrelaytxfee and minimum mempool fee +→
`minrelaytxfee` | number (int) | Required
(exactly 1) | *Added in Dash Core 20.0.0*

Current minimum relay fee for transactions +→
`instantsendlocks` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.15.0*

Number of InstantSend locked transactions not yet in a block +→
`unbroadcastcount` | number (int) | Required
(exactly 1) | *Added in Dash Core 20.0.0*

Current number of transactions that haven't passed initial broadcast yet + +*Example from Dash Core 20.1.0* + +``` bash +dash-cli -testnet getmempoolinfo +``` + +Result: + +``` json + +{ + "loaded": true, + "size": 3, + "bytes": 1116, + "usage": 5072, + "total_fee": 0.00001116, + "maxmempool": 300000000, + "mempoolminfee": 0.00001000, + "minrelaytxfee": 0.00001000, + "instantsendlocks": 3, + "unbroadcastcount": 0 +} +``` + +*See also* + +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. +* [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo): returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. + +```{eval-rst} +.. _api-rpc-blockchain-getrawmempool: +``` + +## GetRawMemPool + +The [`getrawmempool` RPC](../api/remote-procedure-calls-blockchain.md#getrawmempool) returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. + +*Parameter---desired output format* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | bool | Optional
(0 or 1) | Set to `true` to get verbose output describing each transaction in the memory pool; set to `false` (the default) to only get an array of TXIDs for transactions in the memory pool + +*Result (format `false`)---an array of TXIDs* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of TXIDs belonging to transactions in the memory pool. The array may be empty if there are no transactions in the memory pool +→
TXID | string | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order + +*Result (format: `true`)---a JSON object describing each transaction* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty +→
TXID | string : object | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order +→ →
`size` | number (int) | Required
(exactly 1) | The size of the serialized transaction in bytes +→ →
`fee` | amount (Dash) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee paid by the transaction in decimal Dash +→ →
`modifiedfee` | amount (Dash) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee with fee deltas used for mining priority in decimal Dash +→ →
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format +→ →
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool +→ →
`descendantcount` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The number of in-mempool descendant transactions (including this one) +→ →
`descendantsize` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The size of in-mempool descendants (including this one) +→ →
`descendantfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→ →
`ancestorcount` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0*

The number of in-mempool ancestor transactions (including this one) +→ →
`ancestorsize` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0*

The size of in-mempool ancestors (including this one) +→ →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) +→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty +→ → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order +→ →
`spentby` | array | Required
(exactly 1) | _Added in Dash Core 0.17.0_
An array of unconfirmed transactions spending outputs from this transaction +→ → →
TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions spending from this transaction +→ →
`unbroadcast` | bool | Required
(exactly 1) | **Added in Dash Core 20.0.0**
True if this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers) +→ →
`instantlock` | bool | Required
(exactly 1) | *Added in Dash Core 0.12.3*

Set to `true` for locked [InstantSend](../resources/glossary.md#instantsend) transactions (masternode quorum has locked the transaction inputs via `isdlock` message). Set to `false` if the masternodes have not approved the [InstantSend](../resources/glossary.md#instantsend) transaction + +*Examples from Dash Core 20.0.0* + +The default (`false`): + +``` bash +dash-cli getrawmempool +``` + +Result: + +``` json +[ + "16f9a964f1bafbf2a745c2add0da31330b2ee521c2d411416d59c25343b9fb92", + "664e9ca96802ec014469e0d2c34cc7c7e49c4a5a72613614ee97ebd193104376", + "bbbfff097dff060a44622d6569c6f11d13ec29d3c204318ec2c2b8bf5b888487", + "9e6cd0b8feb804b796a6a74e12c45d93c1ea39d3fd205b463e26c70f7f2063e9", + "d541e8776b42ab9dc9a722bf38f99f0b38be0325193ebaf1576119e3dbc00a49", + "4d1d77c26cf1184ff26d27cbbc78f95eada99965920c6bceeb508194bb7217e2", + "e1eafdf61c1062a8e82fd6c42baa0a95f24b8f75fb81db94c4b9e41afc0405d2", + "f4696ff8a75a0235fe7c9062a895a6e364fd7b3941b41a66efa513176bf3cb21", + "8614e7a3f4208f69823f09e02c66a22813cac8de7bc05828c3847e39c6d8e323", + "b8c9eea215addedd8f162e6c4881dd74a14dbd05c820d5149e29990ee5b869dd", + "0a8ccaf37b2652b6ac400922be8cd4ea91267d19ec8e11e20f848d8e62bdef77", + "bc0b7a1d1ee9976652949ef014637d107e8154d00484c62fc3a69cc004367244", + "5446f81969179087b5b490d20b156d13a9d63d7a6d9f618ccda903722b0dab34", + "50caf79821d946b46db0bb64d0e9d354680ce2b94257d5c7a28a1f65fefde226", + "76e018d092d1cd8c4e2074ef6225e38f1d7cc5264980b0d1b5e484f944affa06", + "b86f0408ae8c3126da6458df0c64b1bf19c2f512b40e5811b3130c9fecbc316d", + "52d8e1ea95fcb1b9156ec7ff2ab82ae3e3040cf8328f86b4d96974990527cd90", + "43619b452edc8647cbfe740b55a0c8f9716f6bd6bb258b3c7cb6e0be204a57d3", + "a77d001facacf7d00b2721d246b6790c12018e6e89d6cd543478a84e63bb498a", + "e4a409ee2fbb94925bdea0fa5a3040550fa85063c6343fba3c7b88122fba365f" +] +``` + +Verbose output (`true`): + +``` bash +dash-cli getrawmempool true +``` + +Result: + +``` json +"0994e854166beb6f15630e7b5aba0ef0e57b2a7235957bcbb8000c09449e9eba": { + "fees": { + "base": 0.00000225, + "modified": 0.00000225, + "ancestor": 0.00000225, + "descendant": 0.00000225 + }, + "vsize": 225, + "fee": 0.00000225, + "modifiedfee": 0.00000225, + "time": 1690318205, + "height": 1909975, + "descendantcount": 1, + "descendantsize": 225, + "descendantfees": 225, + "ancestorcount": 1, + "ancestorsize": 225, + "ancestorfees": 225, + "depends": [ + ], + "spentby": [ + ], + "instantlock": "false", + "unbroadcast": false + } +``` + +*See also* + +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. +* [GetMemPoolEntry](../api/remote-procedure-calls-blockchain.md#getmempoolentry): returns mempool data for given transaction (must be in mempool). +* [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo): returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. + +## GetMerkleBlocks + +*Added in Dash Core 0.15.0* + +The [`getmerkleblocks` RPC](../api/remote-procedure-calls-blockchain.md#getmerkleblocks) returns an array of hex-encoded merkleblocks for blocks starting from which match . + +*Parameter #1---filter* + +Name | Type | Presence | Description +--- | --- | --- | --- +filter | string | Required
(exactly 1) | The hex encoded bloom filter + +*Parameter #2---hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +hash | string | Required
(exactly 1) | The block hash + +*Parameter #3---count* + +Name | Type | Presence | Description +--- | --- | --- | --- +count | number (int) | Optional
Default/max=2000 | + +*Result---the list of merkleblocks* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array of merkleblocks +→
Merkle Block | string (hex) | Optional
(1 or more) | A serialized, hex-encoded merkleblock + +*Example from Dash Core 0.15.0* + +``` bash +dash-cli getmerkleblocks \ + "2303028005802040100040000008008400048141010000f8400420800080025004000004130000000000000001" \ + "00000000007e1432d2af52e8463278bf556b55cf5049262f25634557e2e91202" + 2000 +``` + +Result (truncated): + +``` json +[ + "000000202c...aefc440107", + "0000002058...9a17830103" +] +``` + +*See also: none* + +## GetSpecialTxes + +*Added in Dash Core 0.13.1* + +The [`getspecialtxes` RPC](../api/remote-procedure-calls-blockchain.md#getspecialtxes) returns an array of special transactions found in the specified block + +*Parameter #1---Block hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +`blockhash` | string | Required
(exactly 1) | The block hash. + +*Parameter #2---Special transaction type* + +Name | Type | Presence | Description +--- | --- | --- | --- +type | int | Optional
(0 or 1) | Filter special txes by type, -1 means all types (default: -1) + +*Parameter #3---Result limit* + +Name | Type | Presence | Description +--- | --- | --- | --- +count | int | Optional
(0 or 1) | The number of transactions to return (default: 10) + +*Parameter #4---Results to skip* + +Name | Type | Presence | Description +--- | --- | --- | --- +skip | int | Optional
(0 or 1) | The number of transactions to skip (default: 0) + +*Parameter #5---Verbosity* + +Name | Type | Presence | Description +--- | --- | --- | --- +verbosity | int | Optional
(0 or 1) | 0 for hashes, 1 for hex-encoded data, and 2 for JSON object
(default: 0) + +*Result (if `verbosity` was `0`)---An array of transaction IDs* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex): array | Required
(exactly 1) | Array of special transaction hashes + +*Result (if `verbosity` was `1`)---An array of serialized transactions* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex): array | Required
(exactly 1) | Array of serialized, hex-encoded data for the special transaction(s) + +*Result (if `verbosity` was `2`)---An array of JSON objects* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (hex): array of ojbects | Required
(exactly 1) | Array of special transaction objects in the format of the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) + +*Example from Dash Core 0.13.1* + +List of Special Transactions hashes. + +``` bash +dash-cli -testnet getspecialtxes \ +0000003db0006ecaccdf5ae2cfa9d94406ef40ff65b9ec34668b87fca3da9226 +``` + +Result: + +``` json +[ + "1572a15f56307e413afe3cb7ea0017a1a3fd6d89c6c5f258cc17b2888a8e7fff", + "89a6dc42063e4a792ec225db64dd9426742a5d1738e8821625d2ab920a6187b2", + "fa3b3b0d3522becb02ddd15dd075f3d6ecc6a5a50b43c6c9f6d4703a9a8509d5" +] +``` + +List of Provider Registration Special Transactions (type: 1) in serialized, hex-encoded format. + +``` bash +dash-cli -testnet getspecialtxes \ +0000003db0006ecaccdf5ae2cfa9d94406ef40ff65b9ec34668b87fca3da9226 1 10 0 1 +``` + +Result: + +``` json +[ + "0300010001ea721d7420a9b58025894d08f9fecc73b7b87ed09277fa99dad5aa028ea357e1000000006b48304502210093c409672eed335f80630d7108c108d0b85ebe4d8be0758f8a3745f617c4b57302203175063605552c89f6de7f3dadc1773d5ef773b7cc0ccf98e6c5555ea75ba307012102b21d19fec95d9863c5b12fafeb60530e1cfc51d83f49ea9bca7192abb8b83e46feffffff01c4bb609a010000001976a9142efe9f9d3b36b133364d3cccbd27db75a0fbdcb788ac00000000fd120101000000000031567fbaf591ae9d2d0e9050bebce6a311cfd900616f851a3a630aa65e53f6940000000000000000000000000000ffffad3d1ee74a43c1ad3af209f75deaeb9216fc8339fd48d376f9b007ffa44583c9908f4aaca8dd97990c56043e475723f90940ef5fd7d493152540f25f58fb8c965ee5e1be4f850a661476c1ad3af209f75deaeb9216fc8339fd48d376f9b0e8031976a91454bbd7bd7c21553612d60ab16579e51efbcb135288acc281e8bf5a0dd22dfc9f1edeef9ef248f965a79210d997da37fb3e1dec76d1a4412096809bc005c860a0215cb008e3044b972688443b0b7a31ac5a04b728e63b1b5c5489e33dd666435f93c646523ad8a1d935a58957026749cbd0a9bf7e09a77388", + "03000100012354b77c0f261f3d5b8424cbe67c2f27130f01c531732a08b8ae3f28aaa1b1fb000000006a473044022058323d3d9114492a7a7d350d5e3127d2dc550563968319987079c98f19ed519202204160cfe81adf1f41301136a3cbe03697baa1b14c3103b66bd839ace503dbf2630121026f83a8dad6b4695b136c399405b31d4031fd6631c469673d71eda479157ef9dcfeffffff0106b8609a010000001976a9142a855dc127bfdd5cc0ab73b71ff126e49aa409c488ac00000000fd1201010000000000b60dcb8bab5aba47435942c36ca4ee74ea5b662f4d7c7b528ce341915b2d5aec0100000000000000000000000000ffffad3d1ee74a428d3433cb6b9a1a29fdf07613172bbfdab744889689e308c9d2d8a3cb35f9d7bb7220b1eca82c952b82111119670dacae18a509628c775287e4e796128cd6379b80dffd7d8d3433cb6b9a1a29fdf07613172bbfdab744889610271976a91454bbd7bd7c21553612d60ab16579e51efbcb135288ac512010a2b992d7d5c1e1f999852855cc55162800025cfdf3b56c74e4734a2d97411f858532607cbd8848452dab1f216650def1d11a5abf3fa464c9ffcc7fec894a012a4b70ee5d3b983b5fe640f04a7f3e4fe67fbb5b7cccb71afa37888ad6cca48e" +] +``` + +List of Coinbase Special Transactions (type: 5) in JSON format. + +``` bash +dash-cli -testnet getspecialtxes \ +00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b 5 10 0 2 +``` + +Result: + +``` json +[ + { + "txid": "25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56", + "size": 229, + "version": 3, + "type": 5, + "locktime": 0, + "vin": [ + { + "coinbase": "03ae50011a4d696e656420627920416e74506f6f6c2021000b01201da9196f0000000007000000", + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cbd7bfcc50351180132b2c0698cb90ad74c473c7 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cbd7bfcc50351180132b2c0698cb90ad74c473c788ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yeuGUfPMrbEqAS2Pw1wonYgEPbM4LAA9LK" + ] + } + }, + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 88a060bc2dfe05780ae4dcb6c98b12436c35a939 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91488a060bc2dfe05780ae4dcb6c98b12436c35a93988ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yYmrsYP3XYMZr1cGtha3QzmuNB1C7CfyhV" + ] + } + } + ], + "extraPayloadSize": 70, + "extraPayload": "0200ae50010078e5c08b39960887bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f9245e20cfd5d830382ac634d434725ca6349ab5db920a3", + "cbTx": { + "version": 2, + "height": 86190, + "merkleRootMNList": "877392defa24888af72aa15f92b6609e71db1b385c1895bf870896398bc0e578", + "merkleRootQuorums": "a320b95dab4963ca2547434d63ac8203835dfd0ce245924fa83dc6bab6ac57c7" + }, + "instantlock": false, + "chainlock": false + } +] +``` + +*See also:* + +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. + +## GetSpentInfo + +:::{note} +Requires `spentindex` Dash Core command-line/configuration-file parameter to be enabled. +::: + +*Added in Dash Core 0.12.1* + +The [`getspentinfo` RPC](../api/remote-procedure-calls-blockchain.md#getspentinfo) returns the txid and index where an output is spent (requires `spentindex` to be enabled). + +*Parameter #1---the TXID of the output* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string (hex) | Required
(exactly 1) | The TXID of the transaction containing the relevant output, encoded as hex in RPC byte order + +*Parameter #2---the start block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +Index | number (int) | Required
(exactly 1) | The block height to begin looking in + +*Result---the TXID and spending input index* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | Information about the spent output. If output wasn't found or if an error occurred, this will be JSON `null` +→
`txid` | string | Required
(exactly 1) | The output txid +→
`index` | number | Required
(exactly 1) | The spending input index + +*Example from Dash Core 0.12.2* + +Get the txid and index where an output is spent: + +``` bash +dash-cli getspentinfo \ + ''' + { + "txid": "0456aaf51a8df21dd47c2a06ede046a5bf7403bcb95d14d1d71b178c189fb933", \ + "index": 0 + } + ''' +``` + +Result: + +``` json +{ + "txid": "14e874421350840e9d43965967c5a989e7d41ad361ef37484ee67d01d433ecfa", + "index": 1, + "height": 7742 +} +``` + +*See also: none* + +## GetTxOut + +The [`gettxout` RPC](../api/remote-procedure-calls-blockchain.md#gettxout) returns details about an unspent transaction output (UTXO). + +*Parameter #1---the TXID of the output to get* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string (hex) | Required
(exactly 1) | The TXID of the transaction containing the output to get, encoded as hex in RPC byte order + +*Parameter #2---the output index number (vout) of the output to get* + +Name | Type | Presence | Description +--- | --- | --- | --- +Vout | number (int) | Required
(exactly 1) | The output index number (vout) of the output within the transaction; the first output in a transaction is vout 0 + +*Parameter #3---whether to display unconfirmed outputs from the memory pool* + +Name | Type | Presence | Description +--- | --- | --- | --- +Unconfirmed | bool | Optional
(0 or 1) | Set to `true` to display unconfirmed outputs from the memory pool; set to `false` (the default) to only display outputs from confirmed transactions + +*Result---a description of the output* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | Information about the output. If output wasn't found, if it was spent, or if an error occurred, this will be JSON `null` +→
`bestblock` | string (hex) | Required
(exactly 1) | The hash of the header of the block on the local best block chain which includes this transaction. The hash will encoded as hex in RPC byte order. If the transaction is not part of a block, the string will be empty +→
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations received for the transaction containing this output or `0` if the transaction hasn't been confirmed yet +→
`value` | number (Dash) | Required
(exactly 1) | The amount of Dash spent to this output. May be `0` +→
`scriptPubKey` | string : object | Optional
(0 or 1) | An object with information about the pubkey script. This may be `null` if there was no pubkey script +→ →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed +→ →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex +→ →
`reqSigs` | number (int) | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) +→ →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts +→ →
`address` | string | Optional
(0 or 1) | Dash address (only if a well-defined address exists) +→ →
`addresses` | string : array | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types +→ → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address +→
`coinbase` | bool | Required
(exactly 1) | Set to `true` if the transaction output belonged to a coinbase transaction; set to `false` for all other transactions. Coinbase transactions need to have 101 confirmations before their outputs can be spent + +*Example from Dash Core 0.15.0* + +Get the UTXO from the following transaction from the first output index ("0"), +searching the memory pool if necessary. + +``` bash +dash-cli -testnet gettxout \ + e0a06b47f0de6f3851a228d5ac377ac38b495adf04298c43e951e679c5b0aa8f \ + 0 true +``` + +Result: + +``` json +{ + "bestblock": "000000005651f6d7859793dee07d476a2f2a7338e66bbb41caf4b544c5b0318d", + "confirmations": 2, + "value": 25.00000000, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 b66266c5017a759817f3bb99e8d9124bf5bb2e74 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914b66266c5017a759817f3bb99e8d9124bf5bb2e7488ac", + "type": "pubkeyhash", + "address": "ycwoiAibTjpwnoCZSX7S4kiB2H8wULw9qo" + }, + "coinbase": false +} +``` + +*See also* + +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. + +## GetTxOutProof + +The [`gettxoutproof` RPC](../api/remote-procedure-calls-blockchain.md#gettxoutproof) returns a hex-encoded proof that one or more specified transactions were included in a block. + +NOTE: By default this function only works when there is an +unspent output in the UTXO set for this transaction. To make it always work, +you need to maintain a transaction index, using the `-txindex` command line option, or +specify the block in which the transaction is included in manually (by block header hash). + +*Parameter #1---the transaction hashes to prove* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXIDs | array | Required
(exactly 1) | A JSON array of txids to filter +→
`txid` | string | Required
(1 or more) | TXIDs of the transactions to generate proof for. All transactions must be in the same block + +*Parameter #2---the block to look for txids in* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header hash | string | Optional
(0 or 1) | If specified, looks for txid in the block with this hash + +*Result---serialized, hex-encoded data for the proof* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string | Required
(exactly 1) | A string that is a serialized, hex-encoded data for the proof + +*Example from Dash Core 0.12.2* + +Get the hex-encoded proof that "txid" was included in block 000000012d774f3c7668f32bc448efeb93b317f312dd863679de3a007d47817f: + +``` bash +dash-cli gettxoutproof \ + ''' + [ + "e0a06b47f0de6f3851a228d5ac377ac38b495adf04298c43e951e679c5b0aa8f" + ] + ''' \ + '000000012d774f3c7668f32bc448efeb93b317f312dd863679de3a007d47817f' +``` + +Result (wrapped): + +``` text +01000020ed72cc6a7294782a7711d8fa7ef74716ef062dc50bb0820f7eec923801000000\ +aa5d17c5128043803b67c7ab03e4d3ffbc9604b54f877f1c5cf9ed3adeaa19b2cd7ed659\ +f838011d10a70a480200000002033c89c2baecba9fc983c85dcf365c2d9cc93aca1dee2e\ +5ac18124464056542e8faab0c579e651e9438c2904df5a498bc37a37acd528a251386fde\ +f0476ba0e00105 +``` + +*See also* + +* [VerifyTxOutProof](../api/remote-procedure-calls-blockchain.md#verifytxoutproof): verifies that a proof points to one or more transactions in a block, returning the transactions the proof commits to and throwing an RPC error if the block is not in our best block chain. +* [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock): A description of the + format used for the proof. + +## GetTxOutSetInfo + +The [`gettxoutsetinfo` RPC](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo) returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. + +*Parameter #1---Selecting UTXO set hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +hash_type | string | Optional
(0 or 1) | Which UTXO set hash should be calculated. Options: 'hash_serialized_2' (the legacy algorithm), 'muhash', 'none'. + +*Result---statistics about the UTXO set* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the UTXO set +→
`height` | number (int) | Required
(exactly 1) | The height of the local best block chain. A new node with only the hardcoded genesis block will have a height of 0 +→
`bestblock` | string (hex) | Required
(exactly 1) | The hash of the header of the highest block on the local best block chain, encoded as hex in RPC byte order +→
`transactions` | number (int) | Required
(exactly 1) | The number of transactions with unspent outputs +→
`txouts` | number (int) | Required
(exactly 1) | The number of unspent transaction outputs +→
`bogosize` | number (int) | Required
(exactly 1) | A meaningless metric for UTXO set size +→
`hash_serialized_2` | string (hex) | Optional
(exactly 1) | The serialized hash (only present if 'hash_serialized_2' hash_type is chosen) +→
`muhash` | string (hex) | Optional
(exactly 1) | A SHA256(SHA256()) The serialized hash (only present if 'muhash' hash_type is chosen). +→
`disk_size` | number (int) | Required
(exactly 1) | The estimated size of the chainstate on disk +→
`total_amount` | number (Dash) | Required
(exactly 1) | The total amount of Dash in the UTXO set + +*Example from Dash Core 0.15.0* + +``` bash +dash-cli -testnet gettxoutsetinfo +``` + +Result: + +``` json +{ + "height": 159358, + "bestblock": "0000000000a705ef74a1fc134ea1eba49af8eead40b3df1fc4fb40f5940a0d60", + "transactions": 187542, + "txouts": 366996, + "bogosize": 28344374, + "hash_serialized_2": "d7326bdc2d9cb7d91580bfd47d6c2972ab1776c2c33c787873a5fd01986c9377", + "disk_size": 21513509, + "total_amount": 7517185.08574437 +} +``` + +*See also* + +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. + +## PreciousBlock + +*Added in Dash Core 0.12.3 / Bitcoin Core 0.14.0* + +The [`preciousblock` RPC](../api/remote-procedure-calls-blockchain.md#preciousblock) treats a block as if it were received before others with the same work. A later `preciousblock` call can override the effect of an earlier one. The effects of `preciousblock` are not retained across restarts. + +*Parameter #1---the block hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +Header Hash | string (hex) | Required
(exactly 1) | The hash of the block to mark as precious + +*Result---`null` or error on failure* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | null | Required
(exactly 1) | JSON `null`. The JSON-RPC error field will be set only if you entered an invalid block hash + +*Example from Dash Core 0.12.3* + +``` bash +dash-cli preciousblock 00000000034d77e287b63922a94f12e8c4ab9e\ +1d8056060fd51f6153ea5dc757 +``` + +Result (no output from `dash-cli` because result is set to `null`). + +## PruneBlockChain + +*Added in Dash Core 0.12.3 / Bitcoin Core 0.14.0* + +The [`pruneblockchain` RPC](../api/remote-procedure-calls-blockchain.md#pruneblockchain) prunes the blockchain up to a specified height or timestamp. The `-prune` option needs to be enabled (disabled by default). + +*Parameter #1---the block height or timestamp* + +Name | Type | Presence | Description +--- | --- | --- | --- +Height | number (int) | Required
(exactly 1) | The block height to prune up to. May be set to a particular height, or a unix timestamp to prune blocks whose block time is at least 2 hours older than the provided timestamp + +*Result---the height of the last block pruned* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | number (int) | Required
(exactly 1) | The height of the last block pruned + +*Example from Dash Core 0.12.3* + +``` bash +dash-cli pruneblockchain 413555 +``` + +Result: + +``` text +413555 +``` + +*See also* + +* [ImportPrunedFunds](../api/remote-procedure-calls-wallet.md#importprunedfunds): imports funds without the need of a rescan. Meant for use with pruned wallets. + +## SaveMemPool + +The [`savemempool` RPC](../api/remote-procedure-calls-blockchain.md#savemempool) dumps the mempool to disk. + +*Parameters: none* + +*Example from Dash Core 0.16.0* + +``` bash +dash-cli savemempool +``` + +Result (no output from dash-cli). + +*See also: none* + +## VerifyChain + +The [`verifychain` RPC](../api/remote-procedure-calls-blockchain.md#verifychain) verifies each entry in the local block chain database. + +*Parameter #1---how thoroughly to check each block* + +Name | Type | Presence | Description +--- | --- | --- | --- +Check Level | number (int) | Optional
(0 or 1) | How thoroughly to check each block, from 0 to 4. Default is the level set with the `-checklevel` command line argument; if that isn't set, the default is `3`. Each higher level includes the tests from the lower levels

Levels are:
**0.** Read from disk to ensure the files are accessible
**1.** Ensure each block is valid
**2.** Make sure undo files can be read from disk and are in a valid format
**3.** Test each block undo to ensure it results in correct state
**4.** After undoing blocks, reconnect them to ensure they reconnect correctly + +*Parameter #2---the number of blocks to check* + +Name | Type | Presence | Description +--- | --- | --- | --- +Number Of Blocks | number (int) | Optional
(0 or 1) | The number of blocks to verify. Set to `0` to check all blocks. Defaults to the value of the `-checkblocks` command-line argument; if that isn't set, the default is `288` + +*Result---verification results* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | bool | Required
(exactly 1) | Set to `true` if verified; set to `false` if verification failed for any reason + +*Example from Dash Core 0.12.2* + +Verify the most recent 400 blocks in the most through way: + +``` bash +dash-cli -testnet verifychain 4 400 +``` + +Result (took < 1 second on a mobile workstation; it would've taken much longer on mainnet): + +``` json +true +``` + +*See also* + +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. +* [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo): returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. + +## VerifyTxOutProof + +The [`verifytxoutproof` RPC](../api/remote-procedure-calls-blockchain.md#verifytxoutproof) verifies that a proof points to one or more transactions in a block, returning the transactions the proof commits to and throwing an RPC error if the block is not in our best block chain. + +*Parameter #1---The hex-encoded proof generated by gettxoutproof* + +Name | Type | Presence | Description +--- | --- | --- | --- +`proof` | string | Required | A hex-encoded proof + +*Result---txid(s) which the proof commits to* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string | Required
(exactly 1) | The txid(s) which the proof commits to, or empty array if the proof cannot be validated + +*Example from Dash Core 0.12.2* + +Verify a proof: + +``` bash +dash-cli verifytxoutproof \ +01000020ed72cc6a7294782a7711d8fa7ef74716ef062dc50bb0820f7eec923801000000\ +aa5d17c5128043803b67c7ab03e4d3ffbc9604b54f877f1c5cf9ed3adeaa19b2cd7ed659\ +f838011d10a70a480200000002033c89c2baecba9fc983c85dcf365c2d9cc93aca1dee2e\ +5ac18124464056542e8faab0c579e651e9438c2904df5a498bc37a37acd528a251386fde\ +f0476ba0e00105 +``` + +Result: + +``` json +[ +"e0a06b47f0de6f3851a228d5ac377ac38b495adf04298c43e951e679c5b0aa8f" +] +``` + +*See also* + +* [GetTxOutProof](../api/remote-procedure-calls-blockchain.md#gettxoutproof): returns a hex-encoded proof that one or more specified transactions were included in a block. +* [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock): A description of the format used for the proof. diff --git a/docs/core/api/remote-procedure-calls-control.md b/docs/core/api/remote-procedure-calls-control.md new file mode 100644 index 000000000..221582301 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-control.md @@ -0,0 +1,374 @@ +```{eval-rst} +.. meta:: + :title: Control RPCs + :description: A list of all the Control RPCs in Dash. +``` + +# Control RPCs + +## Debug + +The [`debug` RPC](../api/remote-procedure-calls-control.md#debug) changes the debug category from the console. + +*Parameter #1---debug category* + +Name | Type | Presence | Description +--- | --- | --- | --- +Debug category | string | Required
(1 or more) | The debug category to activate. Use a `+` to specify multiple categories. Categories are shown in the [table below](#debug-logging-categories).

Note: No error will be thrown even if the specified category doesn't match any of the above + +### Debug logging categories + +| Type | Category | +| - | - | +| Special | • `0` or `none` - Disables all categories
• `1` or `all` - Enables all categories
• `dash` - Enables/disables all Dash categories | +| Standard | `addrman`, `bench`, `cmpctblock`, `coindb`, `estimatefee`, `http`, `i2p`, `ipc`, `leveldb`, `libevent`, `lock`, `mempool`, `mempoolrej`, `net`, `netconn`, `proxy`, `prune`, `qt`, `rand`, `reindex`, `rpc`, `selectcoins`, `tor`, `validation`, `walletdb`, `zmq`| +| Dash | `chainlocks`, `coinjoin`, `creditpool`, `ehf`, `gobject`, `instantsend`, `llmq`, `llmq-dkg`, `llmq-sigs`, `mnpayments`, `mnsync`, `spork` | + +Note: `libevent` logging is configured on startup and cannot be modified by this RPC during runtime. + +*Example from Dash Core 20.0.1* + +```bash +dash-cli -testnet debug "net+mempool" +``` + +Result: + +```text +Debug mode: net+mempool +``` + +*See also* + +* [Logging](../api/remote-procedure-calls-control.md#logging): gets and sets the logging configuration + +## GetMemoryInfo + +*Added in Dash Core 0.12.3 / Bitcoin Core 0.14.0* + +The [`getmemoryinfo` RPC](../api/remote-procedure-calls-control.md#getmemoryinfo) returns information about memory usage. + +*Parameter #1---mode* + +Name | Type | Presence | Description +--- | --- | --- | --- +mode| string | Optional
Default: `stats` | *Added in Dash Core 0.15.0*

Determines what kind of information is returned.
- `stats` returns general statistics about memory usage in the daemon.
- `mallocinfo` returns an XML string describing low-level heap state (only available if compiled with glibc 2.10+). + +*Result---information about memory usage* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | An object containing information about memory usage +→
`locked` | string : object | Required
(exactly 1) | An object containing information about locked memory manager +→→
`used` | number (int) | Required
(exactly 1) | Number of bytes used +→→
`free` | number (int) | Required
(exactly 1) | Number of bytes available in current arenas +→→
`total` | number (int) | Required
(exactly 1) | Total number of bytes managed +→→
`locked` | number (int) | Required
(exactly 1) | Amount of bytes that succeeded locking +→→
`chunks_used` | number (int) | Required
(exactly 1) | Number allocated chunks +→→
`chunks_free` | number (int) | Required
(exactly 1) | Number unused chunks + +*Example from Dash Core 0.12.3* + +```bash +dash-cli getmemoryinfo +``` + +Result: + +```json +{ + "locked": { + "used": 1146240, + "free": 426624, + "total": 1572864, + "locked": 1572864, + "chunks_used": 16368, + "chunks_free": 7 + } +} +``` + +*See also* + +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. + +## GetRPCInfo + +*Added in Dash Core 18.0.0* + +The [`getrpcinfo` RPC](#getrpcinfo) returns details about the RPC server. + +*Parameters: none* + +*Result---information about the RPC server* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | An object containing information about the RPC server +→
`active_commands` | array of objects | Required
(exactly 1) | An object containing information about active RPC commands +→→
Active command | object | Optional
(0 or more) | Information about a currently active command +→→→
`method` | number (int) | Required
(exactly 1) | Name of the command +→→→
`duration` | number (int) | Required
(exactly 1) | Number of microseconds the command has been active + +*Example from Dash Core 18.0.0* + +```bash +dash-cli getrpcinfo +``` + +Result: + +```json +{ + "active_commands": [ + { + "method": "generate", + "duration": 5226138 + }, + { + "method": "getrpcinfo", + "duration": 5 + } + ] +} + +``` + +*See also: none* + +## Help + +The [`help` RPC](../api/remote-procedure-calls-control.md#help) lists all available public RPC commands, or gets help for the specified RPC. Commands which are unavailable will not be listed, such as wallet RPCs if wallet support is disabled. + +*Parameter #1---the name of the RPC to get help for* + +Name | Type | Presence | Description +--- | --- | --- | --- +RPC | string | Optional
(0 or 1) | The name of the RPC to get help for. If omitted, Dash Core 0.10x will display an alphabetical list of commands; Dash Core 0.11.0 will display a categorized list of commands + +*Parameter #2---the name of the subcommand to get help for* + +Name | Type | Presence | Description +--- | --- | --- | --- +Sub-command | string | Optional
(0 or 1) | The subcommand to get help on. Please note that not all subcommands support this at the moment + +*Result---a list of RPCs or detailed help for a specific RPC* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string | Required
(exactly 1) | The help text for the specified RPC or the list of commands. The `dash-cli` command will parse this text and format it as human-readable text + +*Example from Dash Core 0.17.0* + +Command to get help about the [`help` RPC](../api/remote-procedure-calls-control.md#help): + +```bash +dash-cli -testnet help help +``` + +Result: + +```text +help ( "command" "subcommand" ) + +List all commands, or get help for a specified command. + +Arguments: +1. "command" (string, optional) The command to get help on +2. "subcommand" (string, optional) The subcommand to get help on. Please note that not all subcommands support this at the moment + +Result: +"text" (string) The help text +``` + +*See also* + +* The [RPC Quick Reference](../api/remote-procedure-call-quick-reference.md) + +## Logging + +The [`logging` RPC](../api/remote-procedure-calls-control.md#logging) gets and sets the logging configuration. When called without an argument, returns the list of categories with status that are currently being debug logged or not. When called with arguments, adds or removes categories from debug logging and return the lists above. The arguments are evaluated in order "include", "exclude". If an item is both included and excluded, it will thus end up being excluded. + +*Parameter #1---include categories* + +Name | Type | Presence | Description +--- | --- | --- | --- +`include` | array of strings | Optional
(0 or 1) | Enable debugging for these categories + +*Parameter #2---exclude categories* + +Name | Type | Presence | Description +--- | --- | --- | --- +`exclude` | array of strings | Optional
(0 or 1) | Enable debugging for these categories + +The categories are: + +| Type | Category | +| - | - | +| Special | • `0` or `none` - Disables all categories
• `1` or `all` - Enables all categories
• `dash` - Enables/disables all Dash categories | +| Standard | `addrman`, `bench`, `cmpctblock`, `coindb`, `estimatefee`, `http`, `i2p`, `ipc`, `leveldb`, `libevent`, `lock`, `mempool`, `mempoolrej`, `net`, `netconn`, `proxy`, `prune`, `qt`, `rand`, `reindex`, `rpc`, `selectcoins`, `tor`, `validation`, `walletdb`, `zmq`| +| Dash | `chainlocks`, `coinjoin`, `creditpool`, `ehf`, `gobject`, `instantsend`, `llmq`, `llmq-dkg`, `llmq-sigs`, `mnpayments`, `mnsync`, `spork` | + +*Result---a list of the logging categories that are active* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A JSON object show a list of the logging categories that are active + +*Example from Dash Core 21.1.0* + +Include a category in logging + +```bash +dash-cli -testnet logging '["llmq", "chainlocks"]' +``` + +Result: + +```json +{ + "addrman": false, + "bench": false, + "chainlocks": true, + "cmpctblock": false, + "coindb": false, + "coinjoin": false, + "creditpool": false, + "ehf": false, + "estimatefee": false, + "gobject": false, + "http": false, + "i2p": false, + "instantsend": false, + "leveldb": false, + "libevent": false, + "llmq": true, + "llmq-dkg": false, + "llmq-sigs": false, + "lock": false, + "mempool": false, + "mempoolrej": false, + "mnpayments": false, + "mnsync": false, + "net": false, + "netconn": false, + "proxy": false, + "prune": false, + "qt": false, + "rand": false, + "reindex": false, + "rpc": false, + "selectcoins": false, + "spork": false, + "tor": false, + "validation": false, + "walletdb": false, + "zmq": false +} +``` + +Excluding a previously included category (without including any new ones): + +```bash +dash-cli -testnet logging '[]' '["chainlocks"]' +``` + +Result: + +```json +{ + "addrman": false, + "bench": false, + "chainlocks": false, + "cmpctblock": false, + "coindb": false, + "coinjoin": false, + "creditpool": false, + "ehf": false, + "estimatefee": false, + "gobject": false, + "http": false, + "i2p": false, + "instantsend": false, + "leveldb": false, + "libevent": false, + "llmq": true, + "llmq-dkg": false, + "llmq-sigs": false, + "lock": false, + "mempool": false, + "mempoolrej": false, + "mnpayments": false, + "mnsync": false, + "net": false, + "netconn": false, + "proxy": false, + "prune": false, + "qt": false, + "rand": false, + "reindex": false, + "rpc": false, + "selectcoins": false, + "spork": false, + "tor": false, + "validation": false, + "walletdb": false, + "zmq": false +} +``` + +*See also* + +* [Debug](../api/remote-procedure-calls-control.md#debug): changes the debug category from the console. + +## Stop + +The [`stop` RPC](../api/remote-procedure-calls-control.md#stop) safely shuts down the Dash Core server. + +*Parameters: none* + +*Result---the server is safely shut down* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string | Required
(exactly 1) | The string \Dash Core server stopping\"" + +*Example from Dash Core 0.12.2* + +```bash +dash-cli -testnet stop +``` + +Result: + +```text +Dash Core server stopping +``` + +*See also: none* + +## Uptime + +The [`uptime` RPC](../api/remote-procedure-calls-control.md#uptime) returns the total uptime of the server. + +*Parameters: none* + +*Result* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | number (int) | Required
(exactly 1) | The number of seconds that the server has been running + +*Example from Dash Core 0.15.0* + +```bash +dash-cli -testnet uptime +``` + +Result: + +```text +5500 +``` + +*See also: none* diff --git a/docs/core/api/remote-procedure-calls-dash.md b/docs/core/api/remote-procedure-calls-dash.md new file mode 100644 index 000000000..ce56bdfbe --- /dev/null +++ b/docs/core/api/remote-procedure-calls-dash.md @@ -0,0 +1,1929 @@ +```{eval-rst} +.. meta:: + :title: Dash RPCs + :description: A list of remote procedure calls that classify under Dash RPCs. +``` + +# Dash RPCs + +## GetGovernanceInfo + +The [`getgovernanceinfo` RPC](#getgovernanceinfo) returns an object containing governance parameters. + +*Parameters: none* + +*Result---information about the governance system* + +| Name | Type | Presence | Description | +| ------------------------------- | ------------ | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | Information about the governance system | +| →
`governanceminquorum` | number (int) | Required
(exactly 1) | The absolute minimum number of votes needed to trigger a governance action | +| →
`proposalfee` | number (int) | Required
(exactly 1) | The collateral transaction fee which must be paid to create a proposal in Dash | +| →
`superblockcycle` | number (int) | Required
(exactly 1) | The number of blocks between superblocks | +| →
`superblockmaturitywindow` | number (int) | Required
(exactly 1) | The superblock trigger creation window | +| →
`lastsuperblock` | number (int) | Required
(exactly 1) | The block number of the last superblock | +| →
`nextsuperblock` | number (int) | Required
(exactly 1) | The block number of the next superblock | +| →
`fundingthreshold` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The number of absolute yes votes required for a proposal to be passing | +| →
`governancebudget` | number (real) | Required
(exactly 1) | **Added in Dash Core 20.0.0**
The governance budget for the next superblock in DASH | + +*Example from Dash Core 20.0.0* + +``` bash +dash-cli -testnet getgovernanceinfo +``` + +Result: + +``` json +{ + "governanceminquorum": 1, + "proposalfee": 1.00000000, + "superblockcycle": 24, + "superblockmaturitywindow": 8, + "lastsuperblock": 916632, + "nextsuperblock": 916656, + "fundingthreshold": 21, + "governancebudget": 44.60797584 +} +``` + +*See also:* + +* [GObject](#gobject): provides a set of commands for managing governance objects and displaying information about them. + +**** + +## GetCoinJoinInfo + +The [`getcoinjoininfo` RPC](#getcoinjoininfo) returns an object containing an information about CoinJoin settings and state (previously named `getprivatesendinfo` prior to Dash Core 0.17.0). + +*Parameters: none* + +*Result---(for regular nodes) information about the pool* + +| Name | Type | Presence | Description | +| ------------------------ | --------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Information about the pool | +| →
`enabled` | bool | Required
(exactly 1) | Whether CoinJoin functionality is enabled | +| →
`multisession` | bool | Required
(exactly 1) | Whether CoinJoin multisession option is enabled | +| →
`max_sessions` | number (int) | Required
(exactly 1) | How many parallel sessions can there be at once | +| →
`max_rounds` | number (int) | Required
(exactly 1) | How many rounds to process | +| →
`max_amount` | number (int) | Required
(exactly 1) | How many DASH to keep processed | +| →
`max_denoms` | number (int) | Required
(exactly 1) | **Removed in Dash Core 0.16.0**
How many inputs of each denominated amount to create | +| →
`denoms_goal` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
How many inputs of each denominated amount to target | +| →
`denoms_hardcap` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Maximum limit of how many inputs of each denominated amount to create | +| →
`queue_size` | number (int) | Required
(exactly 1) | How many queues there are currently on the network | +| →
`running` | bool | Required
(exactly 1) | Whether CoinJoin is currently running | +| →
`sessions` | array of json objects | Required
(exactly 1) | Information about session(s) | +| → →
Session | object | Optional
(1 or more) | Information for a session | +| → → →
`protxhash` | string | Required
(exactly 1) | The ProTxHash of the masternode | +| → → →
`outpoint` | string (txid-index) | Required
(exactly 1) | The outpoint of the masternode | +| → → →
`service` | string (host:port) | Required
(exactly 1) | The IP address and port of the masternode | +| → → →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | +| → → →
`state` | string | Required
(exactly 1) | Current state of the session | +| → → →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | +| →
`keys_left` | number (int) | Required
(exactly 1) | How many new keys are left since last automatic backup | +| →
`warnings` | string | Optional
(exactly 1) | Any warnings | + +*Result---(for masternodes) information about the pool* + +| Name | Type | Presence | Description | +| -------------------- | ------------ | ----------------------- | -------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Information about the pool | +| →
`queue_size` | number (int) | Required
(exactly 1) | How many queues there are currently on the network | +| →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | +| →
`state` | string | Required
(exactly 1) | Current state of the session | +| →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | + +*Example from Dash Core 0.17.0 (regular node)* + +``` bash +dash-cli -testnet getcoinjoininfo +``` + +Result: + +``` json +{ + "enabled": true, + "multisession": true, + "max_sessions": 4, + "max_rounds": 16, + "max_amount": 2000, + "denoms_goal": 50, + "denoms_hardcap": 300, + "queue_size": 3, + "running": true, + "sessions": [ + { + "protxhash": "0515c9a411df0f1bd9940d9a2e4f6d739c29c52fc8c045c383f1ff6acc87c7b7", + "outpoint": "0a6520a6ef523de71fd0ca70441e1fd648483f094442d986b24e2c9391be61cf-29", + "service": "54.170.119.85:26216", + "denomination": 10.00010000, + "state": "QUEUE", + "entries_count": 0 + } + ], + "keys_left": 998, + "warnings": "" +} +``` + +*See also: none* + +## GetSuperblockBudget + +The [`getsuperblockbudget` RPC](#getsuperblockbudget) returns the absolute maximum sum of superblock payments allowed. + +*Parameter #1---block index* + +| Name | Type | Presence | Description | +| ----- | ------------ | ----------------------- | -------------------- | +| index | number (int) | Required
(exactly 1) | The superblock index | + +*Result---maximum sum of superblock payments* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ---------------------------------------------------------------- | +| `result` | number (int) | Required
(exactly 1) | The absolute maximum sum of superblock payments allowed, in DASH | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet getsuperblockbudget 7392 +``` + +Result: + +``` text +367.20 +``` + +*See also:* + +* [GetGovernanceInfo](#getgovernanceinfo): returns an object containing governance parameters. + +## GObject + +The [`gobject` RPC](#gobject) provides a set of commands for managing governance objects and displaying information about them. + +### GObject Check + +The `gobject check` RPC validates governance object data (*proposals only*). + +*Parameter #1---object data (hex)* + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | ---------------------------------------------- | +| `data-hex` | string (hex) | Required
(exactly 1) | The data (hex) of a governance proposal object | + +*Result---governance object status* + +| Name | Type | Presence | Description | +| -------------------- | ------ | ----------------------- | ------------------------------- | +| Result | object | Required
(exactly 1) | Object containing status | +| →
`Object Status` | string | Required
(exactly 1) | Status of the governance object | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet gobject check 7b22656e645f65706f6368223a3135363034353730\ +35352c226e616d65223a2274657374222c227061796d656e745f61646472657373223a22796\ +4354b4d52457333474c4d65366d544a597233597248316a75774e777246436642222c227061\ +796d656e745f616d6f756e74223a352c2273746172745f65706f6368223a313536303435333\ +439302c2274797065223a312c2275726c223a22687474703a2f2f746573742e636f6d227d +``` + +Result: + +``` json +{ + "Object status": "OK" +} +``` + +### GObject Count + +The `gobject count` RPC returns the count of governance objects and votes. + +*Parameter #1---mode* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `mode` | string | Optional
(exactly 1) | Result return format:
`json` (default)
`all` - Default before Dash Core 0.12.3 (for backwards compatibility) | + +**Command Mode - `json`** + +*Result---count of governance objects and votes* + +| Name | Type | Presence | Description | +| -------------------- | ------ | ----------------------- | --------------------------------------- | +| Result | object | Required
(exactly 1) | Information about the governance object | +| →
`objects_total` | int | Required
(exactly 1) | Total object count | +| →
`proposals` | int | Required
(exactly 1) | Proposal count | +| →
`triggers` | int | Required
(exactly 1) | Trigger count | +| →
`other` | int | Required
(exactly 1) | Non-proposal/trigger count | +| →
`erased` | int | Required
(exactly 1) | Erased count | +| →
`votes` | int | Required
(exactly 1) | Vote count | + +_Example from Dash Core 0.14.0 (mode: `json`/default)_ + +``` bash +dash-cli -testnet gobject count +``` + +Result (wrapped): + +``` json +{ + "objects_total": 3, + "proposals": 3, + "triggers": 0, + "other": 0, + "erased": 4, + "votes": 18 +} +``` + +**Command Mode - `all`** + +*Result---count of governance objects and votes* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ----------------------------------------- | +| `result` | string | Required
(exactly 1) | The count of governance objects and votes | + +_Example from Dash Core 0.14.0 (mode: `all`)_ + +``` bash +dash-cli -testnet gobject count all +``` + +Result (wrapped): + +``` text +Governance Objects: 177 (Proposals: 177, Triggers: 0, Other: 0; Erased: 5), \ +Votes: 9680 +``` + +### GObject Deserialize + +The `gobject deserialize` RPC deserializes a governance object from a hex string to JSON. + +*Parameter #1---object data (hex)* + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | ------------------------------------- | +| `hex_data` | string (hex) | Required
(exactly 1) | The data (hex) of a governance object | + +**Results** + +The result output varies depending on the type of governance object being deserialized. Examples are shown below for both proposal and trigger object types. + +**Result - Proposal** + +*Result---governance proposal object deserialized to JSON* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Array of governance objects | +| → →
`end_epoch` | string | Required
(exactly 1) | Governance object info as string | +| → →
`name` | string | Required
(exactly 1) | Proposal name | +| → →
`payment_address` | string | Required
(exactly 1) | Proposal payment address.
***Support for P2SH addresses (e.g. multisig) added in Dash Core v18.0.0.*** | +| → →
`payment_amount` | string | Required
(exactly 1) | Proposal payment amount | +| → →
`start_epoch` | int | Required
(exactly 1) | Proposal start | +| → →
`type` | int | Required
(exactly 1) | Object type | +| → →
`url` | string | Required
(exactly 1) | Proposal URL | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet gobject deserialize 7b22656e645f65706f6368223a313536303435\ +373035352c226e616d65223a2274657374222c227061796d656e745f61646472657373223a22\ +7964354b4d52457333474c4d65366d544a597233597248316a75774e777246436642222c2270\ +61796d656e745f616d6f756e74223a352c2273746172745f65706f6368223a31353630343533\ +3439302c2274797065223a312c2275726c223a22687474703a2f2f746573742e636f6d227d +``` + +Result: + +``` json +{ + "end_epoch": 1560457055, + "name": "test", + "payment_address": "yd5KMREs3GLMe6mTJYr3YrH1juwNwrFCfB", + "payment_amount": 5, + "start_epoch": 1560453490, + "type": 1, + "url": "http://test.com" +} +``` + +**Result - Trigger** + +*Result---governance trigger object deserialized to JSON* + +| Name | Type | Presence | Description | +| --------------------------- | ------------ | ----------------------- | -------------------------------- | +| Result | object | Required
(exactly 1) | Array of governance objects | +| → →
`event_block_height` | int | Required
(exactly 1) | Block height to activate trigger | +| → →
`payment_addresses` | string | Required
(exactly 1) | Proposal payment address | +| → →
`payment_amounts` | string | Required
(exactly 1) | Proposal payment amount | +| → →
`proposal_hashes` | string (hex) | Required
(exactly 1) | Proposal hashes | +| → →
`type` | int | Required
(exactly 1) | Object type | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet gobject deserialize 7b226576656e745f626c6f636b5f68656967687\ +4223a203131393539322c20227061796d656e745f616464726573736573223a20227954686d6e\ +75565a316765516e79776f456147627079333362695435473573587a62222c20227061796d656\ +e745f616d6f756e7473223a2022312e3335393631393331222c202270726f706f73616c5f6861\ +73686573223a20223836333966636464653131626432373032373663396330333564366435346\ +3653962393138323465366466373532636164376464646331616532663734386435222c202274\ +797065223a20327d +``` + +Result (wrapped): + +``` json +{ + "event_block_height": 119592, + "payment_addresses": "yThmnuVZ1geQnywoEaGbpy33biT5G5sXzb", + "payment_amounts": "1.35961931", + "proposal_hashes": "8639fcdde11bd270276c9c035d6d54ce9b91824e6df752cad7dddc1ae2f748d5", + "type": 2 +} +``` + +### GObject Diff + +The `gobject diff` RPC Lists governance objects differences since last diff. + +*Parameter #1---signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `signal` | string | Optional
(exactly 1) | Type of governance object signal:
• `valid`
• `funding`
• `delete`
• `endorsed`
• `all` (*DEFAULT*) | + +*Parameter #2---type* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------ | +| `type` | string | Optional
(exactly 1) | Type of governance object signal:
• `proposals`
• `triggers`
• `all` (*DEFAULT*) | + +*Result---governance objects* + +| Name | Type | Presence | Description | +| -------------------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Information about the governance object | +| →
Governance Object(s) | object | Required
(1 or more) | Key: Governance object hash
Values: Governance object details | +| → →
`DataHex` | string (hex) | Required
(exactly 1) | Governance object info as hex string | +| → →
`DataString` | string | Required
(exactly 1) | Governance object info as string | +| → →
`Hash` | string (hex) | Required
(exactly 1) | Hash of this governance object | +| → →
`CollateralHash` | string (hex) | Required
(exactly 1) | Hash of the collateral payment transaction | +| → →
`ObjectType` | number | Required
(exactly 1) | Object types:
`1` - Unknown
`2` - Proposal
`3` - Trigger | +| → →
`CreationTime` | number | Required
(exactly 1) | Object creation time as Unix epoch time | +| → →
`SigningMasternode` | string (hex) | Optional
(0 or 1) | Signing masternode's vin (only present in triggers) | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`fLocalValidity` | boolean | Required
(exactly 1) | Valid by the blockchain | +| →
`IsValidReason` | string | Required
(exactly 1) | `fLocalValidity` error result. Empty if no error returned. | +| →
`fCachedValid` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as a valid and understood governance object (e.g, the serialized data is correct format, etc) | +| →
`fCachedFunding` | boolean | Required
(exactly 1) | Minimum network support has been reached for this object to be funded (doesn't mean it will be for sure though) | +| →
`fCachedDelete` | boolean | Required
(exactly 1) | Minimum network support has been reached saying this object should be deleted from the system entirely | +| →
`fCachedEndorsed` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as endorsed | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject diff all all +``` + +Result (truncated): + +``` json +{ + "17c2bd32005c5168a52f9b5caa74d875ee8a6867a6109f36923887ef6c36b301": { + "DataHex": "5b5b2270726f706f73616c222c7b22656e645f65706f6368223a2231353037343533353731222c226e616d65223a227465737470726f706f73616c5f2d5f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334353637383931353037323634343939222c227061796d656e745f61646472657373223a2279697355653636445352487048504233514245426764574746637068435933626234222c227061796d656e745f616d6f756e74223a2232222c2273746172745f65706f6368223a2231353037323634343939222c2274797065223a312c2275726c223a2268747470733a2f2f7777772e6461736863656e7472616c2e6f72672f702f746573745f70726f706f73616c5f31353037323634343939227d5d5d", + "DataString": "[[\"proposal\",{\"end_epoch\":\"1507453571\",\"name\":\"testproposal\",\"payment_address\":\"yisUe66DSRHpHPB3QBEBgdWGFcphCY3bb4\",\"payment_amount\":\"2\",\"start_epoch\":\"1507264499\",\"type\":1,\"url\":\"https://www.dashcentral.org/p/test_proposal_1507264499\"}]]", + "Hash": "17c2bd32005c5168a52f9b5caa74d875ee8a6867a6109f36923887ef6c36b301", + "CollateralHash": "a25c44b57931afd74530ce39741f91456446a8fd794d2f1c58c42d6f492647ad", + "ObjectType": 1, + "CreationTime": 1507264499, + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0, + "fBlockchainValidity": true, + "IsValidReason": "", + "fCachedValid": true, + "fCachedFunding": false, + "fCachedDelete": false, + "fCachedEndorsed": false + } +} +``` + +### GObject Get + +The `gobject get` RPC returns a governance object by hash. + +*Parameter #1---object hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ------------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | The hash of a governance object | + +*Result---governance object details* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Information about the governance object | +| →
`DataHex` | string (hex) | Required
(exactly 1) | Governance object info as hex string | +| →
`DataString` | string | Required
(exactly 1) | Governance object info as string | +| →
`Hash` | string (hex) | Required
(exactly 1) | Hash of this governance object | +| →
`CollateralHash` | string (hex) | Required
(exactly 1) | Hash of the collateral payment transaction | +| →
`ObjectType` | number | Required
(exactly 1) | Object types:
`1` - Unknown
`2` - Proposal
`3` - Trigger | +| →
`CreationTime` | number | Required
(exactly 1) | Object creation time as Unix epoch time | +| →
`FundingResult` | object | Required
(exactly 1) | Funding vote details | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`ValidResult` | object | Required
(exactly 1) | Object validity vote details | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`DeleteResult` | object | Required
(exactly 1) | Delete vote details | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`EndorsedResult` | object | Required
(exactly 1) | Endorsed vote details | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`fLocalValidity` | boolean | Required
(exactly 1) | Valid by the blockchain | +| →
`IsValidReason` | string | Required
(exactly 1) | `fLocalValidity` error result. Empty if no error returned. | +| →
`fCachedValid` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as a valid and understood governance object (e.g, the serialized data is correct format, etc) | +| →
`fCachedFunding` | boolean | Required
(exactly 1) | Minimum network support has been reached for this object to be funded (doesn't mean it will be for sure though) | +| →
`fCachedDelete` | boolean | Required
(exactly 1) | Minimum network support has been reached saying this object should be deleted from the system entirely | +| →
`fCachedEndorsed` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as endorsed | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject get \ + 42253a7bec554b97a65d2889e6cb9a1cf308b3d47a778c704bf9cdc1fe1bf6ff +``` + +Result (wrapped): + +``` json +{ + "DataHex": "5b5b2270726f706f73616c222c7b22656e645f65706f6368223a2231353037343339353130222c226e616d65223a227465737470726f706f73616c5f2d5f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334353637383931353037323530343338222c227061796d656e745f61646472657373223a22795668577955345933756456784d5234464b3333556741534a41436831436835516a222c227061796d656e745f616d6f756e74223a2232222c2273746172745f65706f6368223a2231353037323530343338222c2274797065223a312c2275726c223a2268747470733a2f2f7777772e6461736863656e7472616c2e6f72672f702f746573745f70726f706f73616c5f31353037323530343338227d5d5d", + "DataString": "[[\"proposal\",{\"end_epoch\":\"1507439510\",\"name\":\"testproposal_-_abcdefghijklmnopqrstuvwxyz01234567891507250438\",\"payment_address\":\"yVhWyU4Y3udVxMR4FK33UgASJACh1Ch5Qj\",\"payment_amount\":\"2\",\"start_epoch\":\"1507250438\",\"type\":1,\"url\":\"https://www.dashcentral.org/p/test_proposal_1507250438\"}]]", + "Hash": "42253a7bec554b97a65d2889e6cb9a1cf308b3d47a778c704bf9cdc1fe1bf6ff", + "CollateralHash": "cb09bd0310c0a67cde9387ad4d8908a7ad9f5d89c5afd58e9332b8bd26a646c7", + "ObjectType": 1, + "CreationTime": 1507246694, + "FundingResult": { + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0 + }, + "ValidResult": { + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0 + }, + "DeleteResult": { + "AbsoluteYesCount": 31, + "YesCount": 31, + "NoCount": 0, + "AbstainCount": 0 + }, + "EndorsedResult": { + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0 + }, + "fLocalValidity": true, + "IsValidReason": "", + "fCachedValid": true, + "fCachedFunding": false, + "fCachedDelete": false, + "fCachedEndorsed": false +} +``` + +### GObject Getcurrentvotes + +The `gobject getcurrentvotes` RPC gets only current (tallying) votes for a governance object hash (does not include old votes). + +*Parameter #1---object hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ------------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | The hash of a governance object | + +*Parameter #2---transaction ID* + +| Name | Type | Presence | Description | +| ------ | ------ | -------------------- | ------------------------------------------------ | +| `txid` | string | Optional
(0 or 1) | The transaction ID of the masternode collateral. | + +*Parameter #3---output index* + +| Name | Type | Presence | Description | +| ------ | ------ | -------------------- | -------------------------------------------------------------------- | +| `vout` | string | Optional
(0 or 1) | Masternode collateral output index. This is required if txid present | + +*Result---votes for specified governance* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | The governance object votes | +| →
Vote Info | string | Required
(1 or more) | Key: vote-hash

Value: vinMasternode, time, outcome, vote signal, and vote weight (1 vote / 1000 DASH collateral) | + +*Example from Dash Core 19.0.0* + +``` bash +dash-cli -testnet gobject getcurrentvotes 78941af577f639ac94440e4855a1ed8f\ + 696f1506d1c0bed4f4b68f05be26d3ca +``` + +Result (truncated): + +``` json +{ + "174aaba65982d25a23f437e2a66ec3836146ba7b7ce5b3fe2d5476907f7079d9": "2eab488e3a7b030303de0d18e357ce17a9fc6b8876705d61076bbe923b2e5fc8-1:1509354047:YES:DELETE:1", + "444d4d871ec35479804f060c733f516908382642ec2dfce6044a59fcadfdcd60": "18e496fe85b61ac9a5fcaec1ef683c7e3fc9bce4a83c883608427ecfb1002fca-1:1508866932:YES:FUNDING:4", + "d49a472c62e9d8105931829fc50ef6c6ce04a230507646ee0eaa615e863ef3a0": "18e496fe85b61ac9a5fcaec1ef683c7e3fc9bce4a83c883608427ecfb1002fca-1:1509117071:YES:DELETE:1", + "78442507441d4524d2493b8568d130415c1eb394adb2fe38d6ffeb199115bc5d": "3df7fb192e21c34da99bdd10c34e58ecaf3f3c37d6b2289f0ffedba5050188cc-1:1509312524:YES:DELETE:4", + "aa4dc9d3b9e74e8c1ffc725b737d07f8a32e43c64907e4bea19e64a86135f08a": "af9f5646ace92f76b3a01b0abe08716a0a7ded64074c2d2e712c93174b9013d1-1:1508866932:YES:FUNDING:1", +} +``` + +### GObject List + +The `gobject list` RPC Lists governance objects (can be filtered by signal and/or object type). + +*Parameter #1---signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `signal` | string | Optional
(exactly 1) | Type of governance object signal:
• `valid`
• `funding`
• `delete`
• `endorsed`
• `all` (*DEFAULT*) | + +*Parameter #2---type* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------ | +| `type` | string | Optional
(exactly 1) | Type of governance object signal:
• `proposals`
• `triggers`
• `all` (*DEFAULT*) | + +*Result---governance objects* + +| Name | Type | Presence | Description | +| -------------------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Information about the governance object | +| →
Governance Object(s) | object | Required
(1 or more) | Key: Governance object hash
Values: Governance object details | +| → →
`DataHex` | string (hex) | Required
(exactly 1) | Governance object info as hex string | +| → →
`DataString` | string | Required
(exactly 1) | Governance object info as string | +| → →
`Hash` | string (hex) | Required
(exactly 1) | Hash of this governance object | +| → →
`CollateralHash` | string (hex) | Required
(exactly 1) | Hash of the collateral payment transaction | +| → →
`ObjectType` | number | Required
(exactly 1) | Object types:
`1` - Unknown
`2` - Proposal
`3` - Trigger | +| → →
`CreationTime` | number | Required
(exactly 1) | Object creation time as Unix epoch time | +| → →
`SigningMasternode` | string (hex) | Optional
(0 or 1) | Signing masternode's vin (only present in triggers) | +| → →
`AbsoluteYesCount` | number | Required
(exactly 1) | Number of `Yes` votes minus number of `No` votes | +| → →
`YesCount` | number | Required
(exactly 1) | Number of `Yes` votes | +| → →
`NoCount` | number | Required
(exactly 1) | Number of `No` votes | +| → →
`AbstainCount` | number | Required
(exactly 1) | Number of `Abstain` votes | +| →
`fLocalValidity` | boolean | Required
(exactly 1) | Valid by the blockchain | +| →
`IsValidReason` | string | Required
(exactly 1) | `fLocalValidity` error result. Empty if no error returned. | +| →
`fCachedValid` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as a valid and understood governance object (e.g, the serialized data is correct format, etc) | +| →
`fCachedFunding` | boolean | Required
(exactly 1) | Minimum network support has been reached for this object to be funded (doesn't mean it will be for sure though) | +| →
`fCachedDelete` | boolean | Required
(exactly 1) | Minimum network support has been reached saying this object should be deleted from the system entirely | +| →
`fCachedEndorsed` | boolean | Required
(exactly 1) | Minimum network support has been reached flagging this object as endorsed | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject list all proposals +``` + +Result (truncated): + +``` json +{ + "b370fa1afd61aca9aa879abea3087e29656a670478f281d4196efb4e7e893ffe": { + "DataHex": "5b5b2270726f706f73616c222c7b22656e645f65706f6368223a2231353037343430303338222c226e616d65223a227465737470726f706f73616c5f2d5f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334353637383931353037323530393636222c227061796d656e745f61646472657373223a2279544c636f506d4e315963654432534345474d6b6e34395753565a4277626f646e6e222c227061796d656e745f616d6f756e74223a2232222c2273746172745f65706f6368223a2231353037323530393636222c2274797065223a312c2275726c223a2268747470733a2f2f7777772e6461736863656e7472616c2e6f72672f702f746573745f70726f706f73616c5f31353037323530393636227d5d5d", + "DataString": "[[\"proposal\",{\"end_epoch\":\"1507440038\",\"name\":\"testproposal_-_abcdefghijklmnopqrstuvwxyz01234567891507250966\",\"payment_address\":\"yTLcoPmN1YceD2SCEGMkn49WSVZBwbodnn\",\"payment_amount\":\"2\",\"start_epoch\":\"1507250966\",\"type\":1,\"url\":\"https://www.dashcentral.org/p/test_proposal_1507250966\"}]]", + "Hash": "b370fa1afd61aca9aa879abea3087e29656a670478f281d4196efb4e7e893ffe", + "CollateralHash": "a51ea89c14735f8b5df37cd846b3561494cc616d4a741e4ef83b368d45c960ba", + "ObjectType": 1, + "CreationTime": 1507250966, + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0, + "fBlockchainValidity": true, + "IsValidReason": "", + "fCachedValid": true, + "fCachedFunding": false, + "fCachedDelete": false, + "fCachedEndorsed": false + }, + "906ae4dbd285e1025832ac9b3160073ecbfeef094d34cf81b3d797a349c720ff": { + "DataHex": "5b5b2270726f706f73616c222c7b22656e645f65706f6368223a2231353037343534383935222c226e616d65223a227465737470726f706f73616c5f2d5f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334353637383931353037323635383233222c227061796d656e745f61646472657373223a2279664e68484c4c695936577a5a646a51766137324a64395134313468516578514c68222c227061796d656e745f616d6f756e74223a2232222c2273746172745f65706f6368223a2231353037323635383233222c2274797065223a312c2275726c223a2268747470733a2f2f7777772e6461736863656e7472616c2e6f72672f702f746573745f70726f706f73616c5f31353037323635383233227d5d5d", + "DataString": "[[\"proposal\",{\"end_epoch\":\"1507454895\",\"name\":\"testproposal_-_abcdefghijklmnopqrstuvwxyz01234567891507265823\",\"payment_address\":\"yfNhHLLiY6WzZdjQva72Jd9Q414hQexQLh\",\"payment_amount\":\"2\",\"start_epoch\":\"1507265823\",\"type\":1,\"url\":\"https://www.dashcentral.org/p/test_proposal_1507265823\"}]]", + "Hash": "906ae4dbd285e1025832ac9b3160073ecbfeef094d34cf81b3d797a349c720ff", + "CollateralHash": "1707470c4372ba048b72945365b4bb71afc8a986e0755c1f1e8a37bba21fde83", + "ObjectType": 1, + "CreationTime": 1507265823, + "AbsoluteYesCount": 0, + "YesCount": 0, + "NoCount": 0, + "AbstainCount": 0, + "fBlockchainValidity": true, + "IsValidReason": "", + "fCachedValid": true, + "fCachedFunding": false, + "fCachedDelete": false, + "fCachedEndorsed": false + } +} +``` + +```{eval-rst} +.. _api-rpc-dash-gobject-prepare: +``` + +### GObject Prepare + +The `gobject prepare` RPC prepares a governance object by signing and creating a collateral transaction. Dash Core v18.0.0 added support for directing proposal payouts to P2SH addresses such as multisig. + +*Parameter #1---parent hash* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ---------------------------------------------------------------------- | +| `parent-hash` | string (hex) | Required
(exactly 1) | Hash of the parent object. Usually the root node which has a hash of 0 | + +*Parameter #2---revision* + +| Name | Type | Presence | Description | +| ---------- | ---- | ----------------------- | ---------------------- | +| `revision` | int | Required
(exactly 1) | Object revision number | + +*Parameter #3---time* + +| Name | Type | Presence | Description | +| ------ | ------- | ----------------------- | ----------------------------- | +| `time` | int64_t | Required
(exactly 1) | Create time (Unix epoch time) | + +*Parameter #4---data* + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data-hex` | string (hex) | Required
(exactly 1) | **Updated in Dash Core 0.14.0 to require all new proposals to use JSON serialization.**

Object data (JSON object with governance details). Additional details regarding this are provided in an example below. | + +*Parameter #5---use-IS* + +| Name | Type | Presence | Description | +| -------- | ------- | -------------------- | ----------------------------------------------- | +| `use-IS` | boolean | Optional
(0 or 1) | *Deprecated and ignored since Dash Core 0.15.0* | + +*Parameter #6---outputHash* + +| Name | Type | Presence | Description | +| ------------ | ------------ | -------------------- | ------------------------------------------------------------------------------------ | +| `outputHash` | string (hex) | Optional
(0 or 1) | *Added in Dash Core 0.13.0*

The single output to submit the proposal fee from | + +*Parameter #7---outputIndex* + +| Name | Type | Presence | Description | +| ------------- | ------- | -------------------- | -------------------------------------------------------------------------------------------------------- | +| `outputIndex` | numeric | Optional
(0 or 1) | *Added in Dash Core 0.13.0*

The output index (required if the `outputHash` parameter is provided) | + +*Result---collateral transaction ID* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | --------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Transaction ID for the collateral transaction | + +**Details of the `data-hex` field:** + +The `data-hex` field is comprised of a JSON object as described in [GObject Deserialize](#gobject-deserialize) which is serialized to hex. + +An example of a proposal JSON object is shown here: + +``` json +{ + "end_epoch": 1560457055, + "name": "test", + "payment_address": "yd5KMREs3GLMe6mTJYr3YrH1juwNwrFCfB", + "payment_amount": 5, + "start_epoch": 1560453490, + "type": 1, + "url": "http://test.com" +} +``` + +To serialize the object, first remove all spaces from the JSON object as shown below: + +``` json +{"end_epoch":1560457055,"name":"test","payment_address":"yd5KMREs3GLMe6mTJYr3YrH1juwNwrFCfB","payment_amount":5,"start_epoch":1560453490,"type":1,"url":"http://test.com"} +``` + +Then convert the string to its hex equivalent as shown below. This is what will be used for the `data-hex` field of the `gobject prepare` command: + +``` bash +7b22656e645f65706f6368223a313536303435373035352c226e616d65223a2274657374222c\ +227061796d656e745f61646472657373223a227964354b4d52457333474c4d65366d544a5972\ +33597248316a75774e777246436642222c227061796d656e745f616d6f756e74223a352c2273\ +746172745f65706f6368223a313536303435333439302c2274797065223a312c2275726c223a\ +22687474703a2f2f746573742e636f6d227d +``` + +*Example from Dash Core 0.14.0* + +``` bash +gobject prepare 0 1 1560449223 7b22656e645f65706f6368223a3135363034353730353\ +52c226e616d65223a2274657374222c227061796d656e745f61646472657373223a227964354\ +b4d52457333474c4d65366d544a597233597248316a75774e777246436642222c227061796d6\ +56e745f616d6f756e74223a352c2273746172745f65706f6368223a313536303435333439302\ +c2274797065223a312c2275726c223a22687474703a2f2f746573742e636f6d227d +``` + +Result (Collateral Transaction ID): + +``` bash +3fd758e7a5761bb07b2850b8ba432ef42c1ea80f0921d2eab0682697dda78262 +``` + +*See also:* + +* [GObject List-Prepared](#gobject-list-prepared): returns a list of governance objects prepared by this wallet + +### GObject List-Prepared + +The `gobject list-prepared` RPC returns a list of governance objects prepared by this wallet with [`gobject prepare`](#gobject-prepare) sorted by their creation time. + +*Parameter #1---count* + +| Name | Type | Presence | Description | +| ------- | ------------ | -------------------- | ----------------------------------- | +| `count` | number (int) | Optional
(0 or 1) | Maximum number of objects to return | + +*Result---list of governance objects* + +| Name | Type | Presence | Description | +| -------------------------- | ------------ | ----------------------- | ---------------------------------------------------------------------- | +| `result` | array | Required
(exactly 1) | List of governance objects | +| →
Governance Object | object | Required
(0 or more) | Proposal object | +| → →
`objectHash` | string (hex) | Required
(exactly 1) | Proposal object hash | +| → →
`parentHash` | string (hex) | Required
(exactly 1) | Hash of the parent object. Usually the root node which has a hash of 0 | +| → →
`collateralHash` | string (hex) | Required
(exactly 1) | Hash of the collateral payment transaction | +| → →
`createdAt` | number (int) | Required
(exactly 1) | Proposal creation time as Unix epoch time | +| → →
`revision` | number (int) | Required
(exactly 1) | Proposal revision number | +| → →
`data` | object | Required
(exactly 1) | Object containing governance object data | +| → → →
`end_epoch` | string | Required
(exactly 1) | Governance object info as string | +| → → →
`name` | string | Required
(exactly 1) | Proposal name | +| → → →
`payment_address` | string | Required
(exactly 1) | Proposal payment address | +| → → →
`payment_amount` | string | Required
(exactly 1) | Proposal payment amount | +| → → →
`start_epoch` | number (int) | Required
(exactly 1) | Proposal start | +| → → →
`type` | number (int) | Required
(exactly 1) | Object type | +| → → →
`url` | string | Required
(exactly 1) | Proposal URL | +| → → →
`hex` | string (hex) | Required
(exactly 1) | Governance object data as hex | + +*Example from Dash Core 0.17.0* + +``` bash +gobject list-prepared +``` + +Result (Collateral Transaction ID): + +``` json +[ + { + "objectHash": "307cde2e485968548cd1a19473bf48f788c16178d82f63cbe849c33988d9592b", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "collateralHash": "987570add8979576cb8a4ee510df448fd2ae7097628b7980559489ecb116b0fa", + "createdAt": 1608143561, + "revision": 1, + "data": { + "end_epoch": 1608151237, + "name": "test", + "payment_address": "yd5KMREs3GLMe6mTJYr3YrH1juwNwrFCfB", + "payment_amount": 5, + "start_epoch": 1608147672, + "type": 1, + "url": "https://www.dash.org", + "hex": "7b22656e645f65706f6368223a313630383135313233372c226e616d65223a2274657374222c227061796d656e745f61646472657373223a227964354b4d52457333474c4d65366d544a597233597248316a75774e777246436642222c227061796d656e745f616d6f756e74223a352c2273746172745f65706f6368223a313630383134373637322c2274797065223a312c2275726c223a2268747470733a2f2f7777772e646173682e6f7267227d" + } + } +] +``` + +*See also:* + +* [GObject Prepared](#gobject-prepare): prepares a governance object by signing and creating a collateral transaction + +```{eval-rst} +.. _api-rpc-dash-gobject-submit: +``` + +### GObject Submit + +The `gobject submit` RPC submits a governance object to network (objects must first be prepared via `gobject prepare`). + +Note: Parameters 1-4 should be the same values as the ones used for `gobject +prepare`. + +*Parameter #1---parent hash* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ---------------------------------------------------------------------- | +| `parent-hash` | string (hex) | Required
(exactly 1) | Hash of the parent object. Usually the root node which has a hash of 0 | + +*Parameter #2---revision* + +| Name | Type | Presence | Description | +| ---------- | ---- | ----------------------- | ---------------------- | +| `revision` | int | Required
(exactly 1) | Object revision number | + +*Parameter #3---time* + +| Name | Type | Presence | Description | +| ------ | ------- | ----------------------- | ----------- | +| `time` | int64_t | Required
(exactly 1) | Create time | + +*Parameter #4---data* + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data-hex` | string (hex) | Required
(exactly 1) | **Updated in Dash Core 0.14.0 to require all new proposals to use JSON serialization.**

Object data (JSON object with governance details). See [GObject Prepare](#gobject-prepare) for additional details about this field. | + +*Parameter #5---fee transaction ID* + +| Name | Type | Presence | Description | +| ------ | ------------ | ----------------------- | ------------------------------------------------------------- | +| `data` | string (hex) | Required
(exactly 1) | **Updated in Dash Core 20.0.0 to remove support for trigger objects.**

Fee transaction ID - required for all objects | + +*Result---governance object hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ---------------------- | +| `result` | string (hex) | Required
(exactly 1) | Governance object hash | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet gobject submit 0 1 1560449223 7b22656e645f65706f6368223a3\ +13536303435373035352c226e616d65223a2274657374222c227061796d656e745f61646472\ +657373223a227964354b4d52457333474c4d65366d544a597233597248316a75774e7772464\ +36642222c227061796d656e745f616d6f756e74223a352c2273746172745f65706f6368223a\ +313536303435333439302c2274797065223a312c2275726c223a22687474703a2f2f7465737\ +42e636f6d227d \ +3fd758e7a5761bb07b2850b8ba432ef42c1ea80f0921d2eab0682697dda78262 +``` + +Result (Governance Object Hash): + +``` bash +e353b2ab5f7e7cb24b95e00e153ec2a6339249672f18b8e8e144aa711678710d +``` + +*See also:* + +* [GObject Prepared](#gobject-prepare): prepares a governance object by signing and creating a collateral transaction + +### GObject Vote-alias + +The `gobject vote-alias` RPC votes on a governance object by masternode alias (using masternode.conf setup). + +*Parameter #1---governance hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ----------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | Hash of the governance object | + +*Parameter #2---vote signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------------------------- | +| `signal` | string | Required
(exactly 1) | Vote signal: `funding`, `valid`, or `delete` | + +*Parameter #3---vote outcome* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | --------------------------------------- | +| `outcome` | string | Required
(exactly 1) | Vote outcome: `yes`, `no`, or `abstain` | + +*Parameter #4---masternode alias* + +| Name | Type | Presence | Description | +| ------- | ------ | ----------------------- | -------------------------- | +| `alias` | string | Required
(exactly 1) | Alias of voting masternode | + +*Result---votes for specified governance* + +| Name | Type | Presence | Description | +| ----------------------- | ------ | ----------------------- | ----------------------------------------- | +| Result | object | Required
(exactly 1) | The governance object votes | +| →
`overall` | string | Required
(1 or more) | Reports number of vote successes/failures | +| →
`detail` | object | Required
(exactly 1) | Vote details | +| → →
Masternode Alias | object | Required
(1 or more) | Name of the masternode alias | +| → → →
`result` | string | Required
(exactly 1) | Vote result | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject vote-alias \ +0bf97bce78b3b642c36d4ca8e9265f8f66de8774c220221f57739c1956413e2b \ +funding yes MN01 +``` + +Result: + +``` json +{ + "overall": "Voted successfully 1 time(s) and failed 0 time(s).", + "detail": { + "MN01": { + "result": "success" + } + } +} +``` + +### GObject Vote-many + +The `gobject vote-many` RPC votes on a governance object by all masternodes (using masternode.conf setup). + +*Parameter #1---governance hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ----------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | Hash of the governance object | + +*Parameter #2---vote signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------------------------- | +| `signal` | string | Required
(exactly 1) | Vote signal: `funding`, `valid`, or `delete` | + +*Parameter #3---vote outcome* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | --------------------------------------- | +| `outcome` | string | Required
(exactly 1) | Vote outcome: `yes`, `no`, or `abstain` | + +*Parameter #4---masternode alias* + +| Name | Type | Presence | Description | +| ------- | ------ | ----------------------- | -------------------------- | +| `alias` | string | Required
(exactly 1) | Alias of voting masternode | + +*Result---votes for specified governance* + +| Name | Type | Presence | Description | +| ----------------------- | ------ | ----------------------- | ----------------------------------------- | +| Result | object | Required
(exactly 1) | The governance object votes | +| →
`overall` | string | Required
(1 or more) | Reports number of vote successes/failures | +| →
`detail` | object | Required
(exactly 1) | Vote details | +| → →
Masternode Alias | object | Required
(1 or more) | Name of the masternode alias | +| → → →
`result` | string | Required
(exactly 1) | Vote result | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject vote-many \ +0bf97bce78b3b642c36d4ca8e9265f8f66de8774c220221f57739c1956413e2b funding yes +``` + +``` json +{ + "overall": "Voted successfully 1 time(s) and failed 0 time(s).", + "detail": { + "MN01": { + "result": "success" + } + } +} +``` + +*See also:* + +* [GetGovernanceInfo](#getgovernanceinfo): returns an object containing governance parameters. +* [GetSuperblockBudget](#getsuperblockbudget): returns the absolute maximum sum of superblock payments allowed. + +## Masternode + +The [`masternode` RPC](#masternode) provides a set of commands for managing masternodes and displaying information about them. + +### Masternode Count + +The `masternode count` RPC prints the number of all known masternodes. + +*Parameters: none* + +*Result---number of known masternodes* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ---------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Masternode count by mode | +| →
`total` | int | Required
(exactly 1) | Count of all masternodes | +| →
`enabled` | int | Required
(exactly 1) | Count of enabled masternodes | +| →
`detailed` | object | Required
(exactly 1) | *Added in Dash Core 19.0*
Breakdown of regular masternodes and evonodes | +| →→
`regular` | object | Required
(exactly 1) | Breakdown of regular masternodes | +| →→→
`total` | int | Required
(exactly 1) | Number of total regular masternodes | +| →→→
`enabled` | int | Required
(exactly 1) | Number of enabled regular masternodes | +| →→
`evo` | object | Required
(exactly 1) | Breakdown of evonodes | +| →→→
`total` | int | Required
(exactly 1) | Number of total evonodes | +| →→→
`enabled` | int | Required
(exactly 1) | Number of enabled evonodes | + +*Example from Dash Core 20.0.0* + +``` bash +dash-cli -testnet masternode count +``` + +Result: + +``` bash +{ + "total": 516, + "enabled": 116, + "detailed": { + "regular": { + "total": 478, + "enabled": 83 + }, + "evo": { + "total": 38, + "enabled": 33 + } + } +} +``` + +### Masternode Current + +:::{deprecated} 0.17.0 +This RPC has been deprecated and will be removed in a future version of Dash Core +::: + +The `masternode current` RPC prints info on current masternode winner to be paid the next block (calculated locally). + +*Parameters: none* + +*Result---current winning masternode info* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Winning masternode info | +| →
`height` | int | Required
(exactly 1) | Block height | +| →
`IP:port` | string | Required
(exactly 1) | The IP address/port of the masternode | +| →
`proTxHash` | string | Required
(exactly 1) | The masternode's Provider Registration transaction hash | +| →
`outpoint` | string | Required
(exactly 1) | The masternode's outpoint | +| →
`payee` | string | Required
(exactly 1) | Payee address | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet masternode current +``` + +Result: + +``` json +{ + "height": 76179, + "IP:port": "34.242.53.163:26155", + "proTxHash": "9de76b8291d00026ab0af86306023c7b90f8e9229dc04916fe1335bf5e11f15d", + "outpoint": "9de76b8291d00026ab0af86306023c7b90f8e9229dc04916fe1335bf5e11f15d-1", + "payee": "yZnU7YJJgGQKvKPQFqXJ4k4DGSsRMhgLXx" +} +``` + +### Masternode List + +The `masternode list` prints a list of all known masternodes. + +This RPC uses the same parameters and returns the same data as +[masternodelist](#masternodelist). Please reference it for full details. + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet masternode list \ + rank f6c83fd96bfaa47887c4587cceadeb9af6238a2c86fe36b883c4d7a6867eab0f +``` + +Result: + +``` json +{ + "f6c83fd96bfaa47887c4587cceadeb9af6238a2c86fe36b883c4d7a6867eab0f-1": 11 +} +``` + +### Masternode Outputs + +The `masternode outputs` RPC prints masternode compatible outputs. + +*Parameters: none* + +*Result---masternode outputs* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | ----------------------------------------- | +| Result | array | Required
(exactly 1) | Masternode compatible outputs | +| →
Output | string | Required
(0 or more) | Masternode compatible output (TXID:Index) | + +*Example from Dash Core 18.1.0* + +``` bash +dash-cli -testnet masternode outputs +``` + +Result: + +``` json +[ + "f6c83fd96bfaa47887c4587cceadeb9af6238a2c86fe36b883c4d7a6867eab0f-1" +] +``` + +### Masternode Payments + +The `masternode payments` RPC prints an array of deterministic masternodes and their payments for the specified block. + +By default, payment information is returned for only the chain tip. More block winners can be requested via the optional `count` parameter. + +*Parameter #1---block hash* + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | --------------------------------------------- | +| Block Hash | string (hex) | Optional
(exactly 1) | The hash of the starting block (default: tip) | + +*Parameter #2---count* + +| Name | Type | Presence | Description | +| ----- | ------------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| Count | number (int) | Optional
(exactly 1) | The number of blocks to return (default: 1). Will return previous blocks if is negative. Both 1 and -1 correspond to the chain tip. | + +. +*Result---masternode payments* + +| Name | Type | Presence | Description | +| :------------------ | :--------------- | :---------------------- | :----------------------------------------------- | +| Result | array of objects | Required
(exactly 1) | List of masternode payment info | +| →
Block Payment | object | Optional
(0 or more) | Masternode payment info for a block | +| →→
`height` | number (int) | Required
(exactly 1) | The height of the block | +| →→
`blockhash` | number (int) | Required
(exactly 1) | The hash of the block | +| →→
`amount` | number (int) | Required
(exactly 1) | Amount received in this block by all masternodes | +| →→
`masternodes` | array of objects | Required
(exactly 1) | Masternodes that received payments in this block | +| →→→
Masternode | object | Required
(1 or more) | Masternode info | +| →→→→
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the corresponding ProRegTx | +| →→→→
`amount` | number (int) | Required
(exactly 1) | Amount received by this masternode | +| →→→→
`payees` | array of objects | Required
(exactly 1) | Payees who received a share of this payment | +| →→→→→
Payee | objects | Required
(1 or more) | Payee info | +| →→→→→→
`address` | string | Required
(1 or more) | Payee address | +| →→→→→→
`script` | string | Required
(exactly 1) | Payee scriptPubKey | +| →→→→→→
`amount` | number (int) | Required
(exactly 1) | Amount received by this payee | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet masternode payments +``` + +Result (block 407822): + +``` json +[ + { + "height": 407822, + "blockhash": "0000030ae0ca262af12918eac9069e61c481e17ac65a26c87ee44427699c3f3a", + "amount": 1253571429, + "masternodes": [ + { + "proTxHash": "c865b48a09801c61dce5804f28fe994c72577254ea1859cf1c37fe92b428e757", + "amount": 1253571429, + "payees": [ + { + "address": "yP72QU7PMG8wNQVTtaQrCLVKCmbuDeAK91", + "script": "76a9141e8efb321d5cad77e28e4e6b51546932579d02f588ac", + "amount": 1253571429 + } + ] + } + ] + } +] +``` + +*See also:* + +* [Masternode Winner](#masternode-winner): prints info on the next masternode winner to vote for. +* [Masternode Winners](#masternode-winners): prints the list of masternode winners. + +### Masternode Status + +The `masternode status` RPC prints masternode status information. + +*Parameters: none* + +*Result---masternode status info* + +| Name | Type | Presence | Description | +| ------------------------------ | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Masternode status info | +| →
`outpoint` | string | Required
(exactly 1) | The masternode's outpoint | +| →
`service` | string | Required
(exactly 1) | The IP address/port of the masternode | +| →
`proTxHash` | string (hex) | Optional
(0 or 1) | The masternode's ProRegTx hash | +| →
`type` | string | Required
(exactly 1) | *Added in Dash Core 19.0*
The type of masternode | +| →
`collateralHash` | string (hex) | Optional
(0 or 1) | The masternode's collateral hash | +| →
`collateralIndex` | int | Optional
(0 or 1) | Index of the collateral | +| →
`dmnState` | object | Optional
(0 or 1) | Deterministic Masternode State | +| → →
`version` | int | Required
(exactly 1) | **Added in Dash Core 19.2.0**
The version of the most recent ProRegTx or ProUpRegTx | +| → →
`service` | string | Required
(exactly 1) | The IP address/port of the masternode | +| → →
`registeredHeight` | int | Required
(exactly 1) | Block height at which the masternode was registered | +| → →
`lastPaidHeight` | int | Required
(exactly 1) | Block height at which the masternode was last paid | +| → →
`PoSePenalty` | int | Required
(exactly 1) | Current proof-of-service penalty | +| → →
`PoSeRevivedHeight` | int | Required
(exactly 1) | Block height at which the masternode was last revived from a PoSe ban | +| → →
`PoSeBanHeight` | int | Required
(exactly 1) | Block height at which the masternode was last PoSe banned | +| → →
`revocationReason` | int | Required
(exactly 1) | Reason code for of masternode operator key revocation | +| → →
`ownerAddress` | string | Required
(exactly 1) | The owner address | +| → →
`votingAddress` | string | Required
(exactly 1) | The voting address | +| → →
`platformNodeId` | string | Optional
(0 or 1) | **Added in Dash Core 19.0.0**
Platform P2P node ID, derived from P2P public key (evonodes only) | +| → →
`platformP2PPort` | int | Optional
(0 or 1) | **Added in Dash Core 19.0.0**
Platform P2P port (evonodes only) | +| → →
`platformHTTPPort` | int | Optional
(0 or 1) | **Added in Dash Core 19.0.0**
TCP port of Platform HTTP/API interface (evonodes only) | +| → →
`payoutAddress` | string | Required
(exactly 1) | The payout address | +| → →
`pubKeyOperator` | string | Required
(exactly 1) | The operator public key | +| → →
`operatorPayoutAddress` | string | Optional
(0 or 1) | The operator payout address | +| →
`state` | string | Required
(exactly 1) | The masternode's state. Valid states are:
• `WAITING_FOR_PROTX`
• `POSE_BANNED`
• `REMOVED`
• `OPERATOR_KEY_CHANGED`
• `PROTX_IP_CHANGED`
• `READY`
• `ERROR`
• `UNKNOWN` | +| →
`status` | string | Required
(exactly 1) | The masternode's status (description based on current state) | + +*Example from Dash Core 19.2.0* + +``` bash +dash-cli -testnet masternode status +``` + +Result: + +``` json +{ + "outpoint": "6ce8545e25d4f03aba1527062d9583ae01827c65b234bd979aca5954c6ae3a59-27", + "service": "34.214.48.68:19999", + "proTxHash": "9cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c", + "type": "HighPerformance", + "collateralHash": "6ce8545e25d4f03aba1527062d9583ae01827c65b234bd979aca5954c6ae3a59", + "collateralIndex": 27, + "dmnState": { + "version": 2, + "service": "34.214.48.68:19999", + "registeredHeight": 850334, + "lastPaidHeight": 852599, + "consecutivePayments": 0, + "PoSePenalty": 0, + "PoSeRevivedHeight": -1, + "PoSeBanHeight": -1, + "revocationReason": 0, + "ownerAddress": "yeJdYWA1rNSKxxfo7mE2eBUj3ejBGUR6UB", + "votingAddress": "yeJdYWA1rNSKxxfo7mE2eBUj3ejBGUR6UB", + "platformNodeID": "62e960a3f6b650feed98a266b3ccdf6e363562cf", + "platformP2PPort": 36656, + "platformHTTPPort": 1443, + "payoutAddress": "yeRZBWYfeNE4yVUHV4ZLs83Ppn9aMRH57A", + "pubKeyOperator": "b6ee48c7a71a9d8e0813e68ca09846245fa155285f24a62b0ce9cb0102b1994ec58af8ba2a01c09363bdcc395d41f3df" + }, + "state": "READY", + "status": "Ready" +} +``` + +### Masternode Winner + +:::{deprecated} 0.17.0 +This RPC has been deprecated and will be removed in a future version of Dash Core +::: + +The `masternode winner` RPC prints info on the next masternode winner to vote for. + +*Parameters: none* + +*Result---next masternode winner info* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Winning masternode info | +| →
`height` | int | Required
(exactly 1) | Block height | +| →
`IP:port` | string | Required
(exactly 1) | The IP address/port of the masternode | +| →
`proTxHash` | string | Required
(exactly 1) | The masternode's Provider Registration transaction hash | +| →
`outpoint` | string | Required
(exactly 1) | The masternode's outpoint | +| →
`payee` | string | Required
(exactly 1) | Payee address | + +*Example from Dash Core 0.14.0* + +``` bash +dash-cli -testnet masternode winner +``` + +Result: + +``` json +{ + "height": 76191, + "IP:port": "34.242.53.163:26173", + "proTxHash": "024608d03beb6a6065f14a29a837c68ae449ac1e17056819366ca0b72b6dd81f", + "outpoint": "024608d03beb6a6065f14a29a837c68ae449ac1e17056819366ca0b72b6dd81f-1", + "payee": "yhp182AnF7gUAyHiWgSbDrKqHKt2dzhoyW" +} +``` + +*See also:* + +* [Masternode Payments](#masternode-payments): prints an array of deterministic masternodes and their payments for the specified block. +* [Masternode Winners](#masternode-winners): prints the list of masternode winners. + +### Masternode Winners + +The `masternode winners` RPC prints the list of masternode winners. + +By default, the 10 previous block winners, the current block winner, and the next 20 block winners are displayed. More past block winners can be requested via the optional `count` parameter. + +*Parameter #1---count* + +| Name | Type | Presence | Description | +| ----- | ---- | ----------------------- | --------------------------------------------------------- | +| Count | int | Optional
(exactly 1) | Number of previous block winners to display (default: 10) | + +*Parameter #2---filter* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ---------------------------- | +| Filter | string | Optional
(exactly 1) | Payment address to filter by | + +*Result---masternode winners* + +| Name | Type | Presence | Description | +| ---------------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | Winning masternode info | +| →
Masternode Winner | int | Required
(exactly 1) | Key: Block height
Value: payee address. As of Dash Core 0.17.0, all payees will be listed (e.g. both owner and operator where applicable). | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet masternode winners +``` + +Result (current block - 37458): + +``` json +{ + "37448": "ygSWwhyzU61FNEta8gDh8gfoH5EZZUvc5m,yP8A3cbdxRtLRduy5mXDsBnJtMzHWs6ZXr", + "37449": "yjGZLzSSoFfTFgLDJrgniXfYxu3xF9xKQg", + "37450": "yRTo1wXWoNnPFWcQVepKGXuLsoypnPkGWj", + "37451": "yYMFRAYZ25XspHZ1EXC39wUMx9FhoC5VT2", + "37452": "yX5y3otE4LitGYiSfZhVH4LdbwHShdzQ8v", + "37453": "yX5y3otE4LitGYiSfZhVH4LdbwHShdzQ8v", + "37454": "yUamtYUFhqUxCMny3JTcZJTyttVt8SYFug", + "37455": "yU35XcdGMnj8Exa2ZZqCg4ongiNqQwpeUZ", + "37456": "yaJc6tADbEjxQBAC69ugWNoTFpzxqkcgWd", + "37457": "yf4WpwRX17p7YRkHJPQpHMXTwzi5s2VDcR", + "37458": "ydbfUYWfLm6xg7Y5aBLjy38DvksrvNcHEc", + "37459": "yYp9k2iuDptT2MB7qVZtVy6ModHtLXFjio", + "37460": "yP1UHNx26ShYLej56SbHiTiPAUv2QppbUv", + "37461": "yaCtZRpiYnVFMyWELHZF74v9ayLKCLPcC9", + "37462": "ygYFnLHoVRyhRoxd6fXQ9nmEafX4eLoWkB", + "37463": "yM5kTThWi8MnAFtZqx98Zipp1BbyypUZGK", + "37464": "yeDY39aiqbBHbJft5F6rokR23EaZca6UTU", + "37465": "yMME1ns1xfpGS2XbFPktsNyp7Cjr1BoJxb", + "37466": "ycn5RWc4Ruo35FTS8bJwugVyCEkfVcrw9a", + "37467": "yUTDkKKhbvDrnwkiaoP8HvqxTNC6rNnUe2", + "37468": "yTstes2nSaSpvu9nTapiCGnjCLvLD5fUqt", + "37469": "Unknown", + "37470": "Unknown", + "37471": "Unknown", + "37472": "Unknown", + "37473": "Unknown", + "37474": "Unknown", + "37475": "Unknown", + "37476": "Unknown", + "37477": "Unknown" +} +``` + +Get a filtered list of masternode winners + +``` bash +dash-cli -testnet masternode winners 150 "yTZ99" +``` + +Result: + +``` json +{ + "37338": "yTZ99fCnjNu33RDRtawf81iwJ9uxXFmkgM", + "37339": "yTZ99fCnjNu33RDRtawf81iwJ9uxXFmkgM", + "37432": "yTZ99fCnjNu33RDRtawf81iwJ9uxXFmkgM", + "37433": "yTZ99fCnjNu33RDRtawf81iwJ9uxXFmkgM" +} +``` + +*See also:* + +* [MasternodeList](#masternodelist): returns a list of masternodes in different modes. +* [Masternode Payments](#masternode-payments): prints an array of deterministic masternodes and their payments for the specified block. +* [Masternode Winner](#masternode-winner): prints info on the next masternode winner to vote for. + +## Masternodelist + +The [`masternodelist` RPC](#masternodelist) returns a list of masternodes in different modes. + +*Parameter #1---List mode* + +| Name | Type | Presence | Description | +| ------ | ------ | ------------------------------------------------- | ----------------------- | +| `mode` | string | Optional (exactly 1);
Required to use `filter` | The mode to run list in | + +*Mode Options (Default=json)* + +| Mode | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------------------ | +| `addr` | Print IP address associated with a masternode (can be additionally filtered, partial match) | +| `recent` | Print info in JSON format for active and recently banned masternodes (can be additionally filtered, partial match) | +| `full` | Print info in format 'status payee lastpaidtime lastpaidblock IP' (can be additionally filtered, partial match) | +| `evo` | Print info in JSON format for evonodes only. **Added in Dash Core 20.0.0** | +| `info` | Print info in format 'status payee IP' (can be additionally filtered, partial match) | +| `json` (Default) | Print info in JSON format (can be additionally filtered, partial match) | +| `lastpaidblock` | Print the last block height a node was paid on the network | +| `lastpaidtime` | Print the last time a node was paid on the network | +| `owneraddress` | Print the masternode owner Dash address | +| `payee` | Print Dash address associated with a masternode (can be additionally filtered, partial match) | +| `pubKeyOperator` | Print the masternode operator public key | +| `status` | Print masternode status: ENABLED / POSE_BANNED (can be additionally filtered, partial match) | +| `votingaddress` | Print the masternode voting Dash address | + +*Parameter #2---List filter* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| `filter` | string | Optional
(exactly 1) | Filter results. Partial match by outpoint by default in all modes, additional matches in some modes are also available. | + +*Result---the masternode list* + +| Name | Type | Presence | Description | +| -------------------- | ----------- | ----------------------- | --------------------------------------------------------------------------------------------- | +| `result` | object/null | Required
(exactly 1) | Information about the masternode sync status | +| →
Masternode Info | string | Required
(1 or more) | The requested masternode info. Output varies based on selected `mode` and `filter` parameters | + +*Example from Dash Core 20.0.0* + +Get unfiltered Masternode list in default mode + +``` bash +dash-cli -testnet masternodelist +``` + +Result (truncated): + +``` json +{ + "ab3435c4974cffa8cf6e9a11d9a263c7efad367c4b22fcc75507c565027b51ecb1ba2a1602d9337eb3edb037d7c03b49" + }, + "482cf74e7a615086514c261a9454db358290f05c6243089a3961ffdf14256d29-0": { + "proTxHash": "9bc9b7a879c137114fd17b2af5c3825a6f78224cfac8afd7109e52f1b3a05bff", + "address": "[::]:0", + "payee": "Xdsbzw7a5wTCQYvCwLuQc7qnRuCcs7ehsK", + "status": "POSE_BANNED", + "type": "Regular", + "pospenaltyscore": 4448, + "consecutivePayments": 0, + "lastpaidtime": 1660888856, + "lastpaidblock": 1723759, + "owneraddress": "XfJtpuZxEAYUofWKsHA7KNYpCKNxY98Hm3", + "votingaddress": "Xh6M9FR9a8Wdb7aVvWeF8z9CxBAM9PgDbW", + "collateraladdress": "Xs1yGUqc53XddB4E9FkHNYXtum5CCoGvbt", + "pubkeyoperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "a476f59677f43968ef22c12e250605e42b8ae6d0665fef1354c219ac1e3de82e-0": { + "proTxHash": "af7b52f2333fbb5605105b3efd094547c2f77d81ca06aa97b784414c4d1efbff", + "address": "100.24.78.251:9999", + "payee": "XnpE5Mwr8GsVujK2eWVVJh718Zeap5FHLj", + "status": "ENABLED", + "type": "Regular", + "pospenaltyscore": 0, + "consecutivePayments": 0, + "lastpaidtime": 1689823121, + "lastpaidblock": 1906829, + "owneraddress": "Xx7xCzbkHJnqbuqBk1zzGeuwopZ9x5UZvu", + "votingaddress": "XkK53owYVX5Q2t8XPzkR4bzourNzgfkjts", + "collateraladdress": "Xu2B3bvC75NuiYvudvJPR1npDdguyN7aWV", + "pubkeyoperator": "8f8097c423ad5bccc3d631bf518a1f28ff60b31841e3c7b0d44e578f94d33b96b9fb485e1690b72608423f3e926ac8c7" + } +} +``` + +Get a filtered Masternode list + +``` bash +dash-cli -testnet masternodelist full "NEW" +``` + +Result: + +``` json +{ + "cf9840b16f0c28e39beb89e06b995a12425f6a836ed899aa8203a448b31724c6-0": " ENABLED 0 yP8A3cbdxRtLRduy5mXDsBnJtMzHWs6ZXr 1650381993 708881 52.36.244.225:19999", + "6f506a5dbb0e88fe83242d4f9641b6f4a2616d22c889b74f29b5bfa6291dfdca-1": " POSE_BANNED 365 ySLuZnXd8ciZNXV5FEWpqRryT4viJdwazM 1578387987 243103 3.20.70.18:10003", + "52feab469665752944186952b361815ba53e5296457de6d1bd23baf80db36f0a-0": " ENABLED 0 yac7gAK3cKuDnYD4RmGaJiMnCssgu7Q7A5 1650385230 708906 54.185.249.226:19999", + "c44721bf0b5be6de4b7706eaef15c2d500bba148e21947907bd52f77d18bebbd-0": " ENABLED 0 yP8A3cbdxRtLRduy5mXDsBnJtMzHWs6ZXr 1650397178 708981 34.219.169.55:19999", + "893d83df0dfc05ac284b96c2b31d4db1d34552f814bd834b8c75f43c56945565-1": " ENABLED 0 yP8A3cbdxRtLRduy5mXDsBnJtMzHWs6ZXr 1650385930 708913 54.213.219.155:19999", + "23464abc2f724de235e69e72ef5068f1b2701521b88e7b2740b93978ff54909b-1": " POSE_BANNED 346 yhDhNgubyF1NEmT6qtiTXTbr3KMiJwUTxk 1555111615 78830 198.199.74.241:19999", + "d0e28cd51e674fe00af162877cb70e0ceed1906fef616b2d231ef009f6e4786a-0": " ENABLED 0 yP8A3cbdxRtLRduy5mXDsBnJtMzHWs6ZXr 1650396597 708974 34.220.41.134:19999", + "213a1c4beb216e8697d8d15701c248bcf91a889f4989fbb4275293b3aa697802-1": " POSE_BANNED 0 yfzLmLJUEYcC8LEygLB6AQFxCwsF3fV9Fw 1564053511 143062 [::]:0" +} +``` + +*See also:* + +* [Masternode](#masternode): provides a set of commands for managing masternodes and displaying information about them. +* [MnSync](#mnsync): returns the sync status, updates to the next step or resets it entirely. + +## MnSync + +The [`mnsync` RPC](#mnsync) returns the sync status, updates to the next step or resets it entirely. + +*Parameter #1---Command mode* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `mode` | string | Required
(exactly 1) | The command mode to use:
`status` - Get masternode sync status
`next` - Move to next sync asset
`reset` - Reset sync status | + +**Command Mode - `status`** + +*Result---the sync status* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | ----------------------------------------------------------------- | +| `result` | object/null | Required
(exactly 1) | Information about the masternode sync status | +| →
`AssetID` | number (int) | Required
(exactly 1) | The sync asset ID | +| →
`AssetName` | string | Required
(exactly 1) | The sync asset name | +| →
`AssetStartTime` | number (int) | Required
(exactly 1) | The sync asset start time | +| →
`Attempt` | number (int) | Required
(exactly 1) | The sync attempt number | +| →
`IsBlockchainSynced` | boolean | Required
(exactly 1) | Blockchain sync status | +| →
`IsSynced` | boolean | Required
(exactly 1) | Masternode sync status | +| →
`IsFailed` | boolean | Required
(exactly 1) | *Removed in Dash Core 0.16.0*
Masternode list sync fail status | + +Sync Assets + +| AssetID | AssetName | +| ------- | -------------------------------------------------------------------------------------- | +| 0 | MASTERNODE_SYNC_INITIAL (merged with `MASTERNODE_SYNC_BLOCKCHAIN` in Dash Core 0.16.0) | +| 1 | MASTERNODE_SYNC_BLOCKCHAIN (previously `MASTERNODE_SYNC_WAITING`) | +| 4 | MASTERNODE_SYNC_GOVERNANCE | +| -1 | MASTERNODE_SYNC_FAILED (removed in Dash Core 0.16.0) | +| 999 | MASTERNODE_SYNC_FINISHED | + +*Example from Dash Core 0.16.0* + +Get Masternode sync status + +``` bash +dash-cli -testnet mnsync status +``` + +Result: + +``` json +{ + "AssetID": 999, + "AssetName": "MASTERNODE_SYNC_FINISHED", + "AssetStartTime": 1507662300, + "Attempt": 0, + "IsBlockchainSynced": true, + "IsSynced": true, +} +``` + +**Command Mode - `next`** + +*Result---next command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet mnsync next +``` + +Result: + +```text +sync updated to MASTERNODE_SYNC_GOVERNANCE +``` + +**Command Mode - `reset`** + +*Result---reset command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------ | +| `result` | string | Required
(exactly 1) | Command return status:
`success` or `failure` | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet mnsync reset +``` + +Result: + +```text +success +``` + +*See also:* + +* [Masternode](#masternode): provides a set of commands for managing masternodes and displaying information about them. +* [MasternodeList](#masternodelist): returns a list of masternodes in different modes. + + + +## CoinJoin + +As of Dash Core 0.12.3, this is not supported on masternodes since wallet functionality is disabled on them for security reasons. + +The [`coinjoin` RPC](#coinjoin) controls the CoinJoin process (previously named `privatesend` prior to Dash Core 0.17.0). + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| `mode` | string | Required
(exactly 1) | The command mode to use:
`start` - Start CoinJoin
`stop` - Stop CoinJoin
`reset` - Reset CoinJoin | + +**Command Mode - `start`** + +*Result---start command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin start +``` + +Result: + +```text +Mixing started successfully +``` + +**Command Mode - `stop`** + +*Result---stop command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin stop +``` + +Result: + +```text +Mixing was stopped +``` + +**Command Mode - `reset`** + +*Result---reset command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin reset +``` + +Result: + +```text +Mixing was reset +``` + +*See also: none* + +## Spork + +The [`spork` RPC](#spork) shows information about the current state of sporks. + +To display the status of sporks, use the `show` or `active` syntax. + +*Parameter #1---Command mode* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------- | +| `mode` | string | Required
(exactly 1) | The command mode to use:
`show` - Display spork values
`active` - Display spork activation status | + +**Command Mode - `show`** + +*Result---spork values* + +| Name | Type | Presence | Description | +| ------------------ | ------- | ----------------------- | ---------------------------------------------- | +| `result` | object | Required
(exactly 1) | Object containing status | +| →
`Spork Value` | int64_t | Required
(1 or more) | Spork value (epoch datetime to enable/disable) | + +*Example from Dash Core 18.1.0* + +``` bash +dash-cli -testnet spork show +``` + +Result: + +``` json +{ + "SPORK_2_INSTANTSEND_ENABLED": 0, + "SPORK_3_INSTANTSEND_BLOCK_FILTERING": 0, + "SPORK_9_SUPERBLOCKS_ENABLED": 0, + "SPORK_17_QUORUM_DKG_ENABLED": 0, + "SPORK_19_CHAINLOCKS_ENABLED": 0, + "SPORK_21_QUORUM_ALL_CONNECTED": 1, + "SPORK_23_QUORUM_POSE": 0 +} +``` + +**Command Mode - `active`** + +*Result---spork active status* + +| Name | Type | Presence | Description | +| ------------------------------ | ------ | ----------------------- | ------------------------ | +| `result` | object | Required
(exactly 1) | Object containing status | +| →
`Spork Activation Status` | bool | Required
(1 or more) | Spork activation status | + +*Example from Dash Core 18.1.0* + +``` bash +dash-cli -testnet spork active +``` + +Result: + +``` json +{ + "SPORK_2_INSTANTSEND_ENABLED": true, + "SPORK_3_INSTANTSEND_BLOCK_FILTERING": true, + "SPORK_9_SUPERBLOCKS_ENABLED": true, + "SPORK_17_QUORUM_DKG_ENABLED": true, + "SPORK_19_CHAINLOCKS_ENABLED": true, + "SPORK_21_QUORUM_ALL_CONNECTED": true, + "SPORK_23_QUORUM_POSE": true +} +``` + +*See also:* + +* [Sporkupdate](#sporkupdate): updates the value of the provided spork. + +## Sporkupdate + +The [`sporkupdate` RPC](#sporkupdate) updates the value of the provided spork. + +:::{note} +Signing spork update messages requires `-sporkkey` to be set via the command line or dash.conf file. +::: + +To update the state of a spork activation, use the ` [value]` syntax. + +*Parameter #1---Spork name* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ------------------------------- | +| `name` | string | Required
(exactly 1) | The name of the spork to update | + +*Parameter #2---Spork value* + +| Name | Type | Presence | Description | +| ------- | ---- | ----------------------- | ----------------------------- | +| `value` | int | Required
(exactly 1) | The value to assign the spork | + +*Result---spork update status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ----------------------------------- | +| `result` | string | Required
(exactly 1) | Update status (`success` or `null`) | + +*Example from Dash Core 18.1.0* + +``` bash +dash-cli -testnet spork SPORK_2_INSTANTSEND_ENABLED 0 +``` + +Result: + +``` bash +null +``` + +*See also:* + +* [Spork](#spork): shows information about the current state of sporks. + +## VoteRaw + +The [`voteraw` RPC](#voteraw) compiles and relays a governance vote with provided external signature instead of signing vote internally + +*Parameter #1---masternode collateral transaction hash* + +| Name | Type | Presence | Description | +| ------------------------------- | ------------ | ----------------------- | --------------------------------------------- | +| `masternode-collateral-tx-hash` | string (hex) | Required
(exactly 1) | Hash of the masternode collateral transaction | + +*Parameter #2---masternode collateral transaction index* + +| Name | Type | Presence | Description | +| -------------------------------- | ------ | ----------------------- | ---------------------------------------------- | +| `masternode-collateral-tx-index` | string | Required
(exactly 1) | Index of the masternode collateral transaction | + +*Parameter #3---governance hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ----------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | Hash of the governance object | + +*Parameter #4---vote signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------------------------- | +| `signal` | string | Required
(exactly 1) | Vote signal: `funding`, `valid`, or `delete` | + +*Parameter #5---vote outcome* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | --------------------------------------- | +| `outcome` | string | Required
(exactly 1) | Vote outcome: `yes`, `no`, or `abstain` | + +*Parameter #6---time* + +| Name | Type | Presence | Description | +| ------ | ------- | ----------------------- | ----------- | +| `time` | int64_t | Required
(exactly 1) | Create time | + +*Parameter #7---vote signature* + +| Name | Type | Presence | Description | +| ---------- | --------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `vote-sig` | string (base64) | Required
(exactly 1) | The vote signature created by external application (i.e. [Dash Masternode Tool](https://github.com/Bertrand256/dash-masternode-tool) or [dashmnb](https://github.com/chaeplin/dashmnb)).

Must match the Dash Core ([governance vote signature format](https://github.com/dashpay/dash/blob/v0.15.x/src/governance/governance-vote.cpp#L180-L181)). | + +*Result---votes for specified governance* + +Name | Type | Presence | Description +--- | --- | --- | --- +Result | object | Required
(exactly 1) | The vote result + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet voteraw \ +f6c83fd96bfaa47887c4587cceadeb9af6238a2c86fe36b883c4d7a6867eab0f 1 \ +65a358fefaace40fc07053350be23e519178519290f963dab8ba92f6f85f98c3 \ +funding yes 1512507255 \ +H1jXKZQp1TZWBPW11E665OwmGBYV1038FohEr0au7zp+O5BCKmVDP/3rGq38ZMy3KOpwnBu6ehd6jlas79hsRBY= +``` + +Result: + +``` bash +Voted successfully +``` + +*See also:* + +* [GObject](#gobject): provides a set of commands for managing governance objects and displaying information about them. diff --git a/docs/core/api/remote-procedure-calls-evo.md b/docs/core/api/remote-procedure-calls-evo.md new file mode 100644 index 000000000..fac14de03 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-evo.md @@ -0,0 +1,4268 @@ +```{eval-rst} +.. meta:: + :title: Evo RPCs + :description: A list of all the Evolution-related remote procedure calls in Dash Core. +``` + +# Evo RPCs + +## BLS + +*Added in Dash Core 0.13.0* + +The [`bls` RPC](../api/remote-procedure-calls-evo.md#bls) provides a set of commands to execute BLS-related actions. + +### BLS FromSecret + +The `bls fromsecret` RPC parses a BLS secret key and returns the secret/public key pair. + +*Parameter #1---secret key* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------ | +| `secret` | string (hex) | Required
(exactly 1) | The BLS secret key | + +*Parameter #2---legacy* + +| Name | Type | Presence | Description | +| -------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------------ | +| `legacy` | boolean | Optional
(0 or 1) | Use the legacy BLS scheme (default=`true` prior to v19 hard fork; default=`false` after v19 hard fork) | + +*Result---the secret/public key pair* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ----------------------------------------- | +| `result` | object | Required
(exactly 1) | BLS key pair | +| →
`secret` | string (hex) | Required
(exactly 1) | A BLS secret key | +| →
`public` | string (hex) | Required
(exactly 1) | A BLS public key | +| →
`scheme` | string | Required
(exactly 1) | BLS scheme (valid schemes: legacy, basic) | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet bls fromsecret 32c017a69fb03e0b8c1be270974570a350b043a685e9acbdc6493dbd9f8a7f1a +``` + +Result: + +```json +{ + "secret": "32c017a69fb03e0b8c1be270974570a350b043a685e9acbdc6493dbd9f8a7f1a", + "public": "90b75db03beab716159c3d80a448954a0ff2a10e25d260934c29839abe68abc546f53a0ec83e8201b22eb48e8e61eb4e", + "scheme": "basic" +} +``` + +*See also* + +* [BLS Generate](#bls-generate) + +### BLS Generate + +The `bls generate` RPC creates a new BLS secret/public key pair. + +:::{note} +Since the v19 hard fork activation, BLS keys are generated using the basic scheme by default. +::: + +*Parameter #1---legacy* + +| Name | Type | Presence | Description | +| -------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------------ | +| `legacy` | boolean | Optional
(0 or 1) | Use the legacy BLS scheme (default=`true` prior to v19 hard fork; default=`false` after v19 hard fork) | + +*Result---a secret/public key pair* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ----------------------------------------- | +| `result` | object | Required
(exactly 1) | BLS key pair | +| →
`secret` | string (hex) | Required
(exactly 1) | A BLS secret key | +| →
`public` | string (hex) | Required
(exactly 1) | A BLS public key | +| →
`scheme` | string | Required
(exactly 1) | BLS scheme (valid schemes: legacy, basic) | + +*Example from Dash Core 19.0.0* (post hard fork activation) + +```bash +dash-cli -testnet bls generate +``` + +Result: + +```json +{ + "secret": "32c017a69fb03e0b8c1be270974570a350b043a685e9acbdc6493dbd9f8a7f1a", + "public": "90b75db03beab716159c3d80a448954a0ff2a10e25d260934c29839abe68abc546f53a0ec83e8201b22eb48e8e61eb4e", + "scheme": "basic" +} +``` + +*See also* + +* [BLS FromSecret](#bls-fromsecret) + +## ProTx + +*Added in Dash Core 0.13.0* + +The [`protx` RPC](../api/remote-procedure-calls-evo.md#protx) provides a set of commands to execute ProTx related actions. + +### ProTx Diff + +The `protx diff` RPC calculates a diff and a proof between two masternode list. + +*Parameter #1---start block height* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------- | +| `baseBlock` | number (int) | Required
(Exactly 1) | The starting block height | + +*Parameter #2---end block height* + +| Name | Type | Presence | Description | +| ------- | ------------ | ----------------------- | ----------------------- | +| `block` | number (int) | Required
(Exactly 1) | The ending block height | + +*Parameter #3---extended fields* + +| Name | Type | Presence | Description | +| ---------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------ | +| `extended` | boolean | Optional
(0 or 1) | *Added in Dash Core 18.1.0*
Show additional fields (e.g. `payoutAddress`) (default=`false`) | + +*Result---JSON provider registration transaction details* + +| Name | Type | Presence | Description | +| ------------------------------ | ------------ | ----------------------- | ----------- | +| `result` | array | Required
(exactly 1) | An array of objects each containing a provider transaction, or JSON `null` if an error occurred | +| →
`nVersion` | number | Required
(exactly 1) | **Added in Dash Core 19.0.0**
Simplified masternode list version returned | +| →
`baseBlockHash` | string (hex) | Required
(exactly 1) | The hash of the base block as hex in RPC byte order | +| →
`blockHash` | string (hex) | Required
(exactly 1) | The hash of the ending block as hex in RPC byte order | +| →
`cbTxMerkleTree` | string (hex) | Required
(exactly 1) | The coinbase transaction merkle tree | +| →
`cbTx` | string (hex) | Required
(exactly 1) | The coinbase transaction | +| →
`deletedMNs` | array | Required
(exactly 1) | An array of deleted masternode hashes | +| →
`mnlist` | array | Required
(exactly 1) | An array of masternode details | +| → →
`nVersion` | number | Required
(exactly 1) | **Added in Dash Core 19.0.0**
BLS version
`1` - Legacy BLS scheme
`2` - [Basic BLS scheme](https://github.com/dashpay/dash/issues/5001) | +| → →
`nType` | number | Required
(exactly 1) | **Added in Dash Core 19.0.0**
Type of masternode
`0` - Regular masternode
`1` - Evolution masternode | +| → →
`proRegTxHash` | string (hex) | Required
(exactly 1) | The hash of the initial provider registration transaction as hex in RPC byte order | +| → →
`confirmedHash` | string (hex) | Required
(exactly 1) | The hash of the block where the ProRegTx was mined | +| → →
`service` | string | Required
(exactly 1) | The IP address/Port of the masternode | +| → →
`pubKeyOperator` | string (hex) | Required
(exactly 1) | The operator public key | +| → →
`votingAddress` | string | Required
(exactly 1) | The voting address | +| → →
`isValid` | bool | Required
(exactly 1) | Set to `true` if masternode is valid | +| → →
`platformHTTPPort` | number | Optional
(0 or 1) | **Added in Dash Core 19.0.0**
TCP port of Platform HTTP/API interface (evonodes only) | +| → →
`platformNodeID` | string (hex) | Optional
(0 or 1) | **Added in Dash Core 19.0.0**
Platform P2P node ID, derived from P2P public key (evonodes only) | +| → →
`payoutAddress` | string | Optional
(0 or 1) | *Added in Dash Core 18.1.0*
The owner's payout address. Only included if the `extended` parameter is set to `true`. | +| → →
`operatorPayoutAddress` | string | Required
(exactly 1) | *Added in Dash Core 18.1.0*
The operator's payout address. Only included if the `extended` parameter is set to `true`. | +| →
`deletedQuorums` | array | Required
(exactly 1) | An array of deleted quorums | +| → →
`llmqType` | number | Required
(exactly 1) | The quorum type | +| → →
`quorumHash` | string (hex) | Required
(exactly 1) | The hash of the quorum | +| →
`newQuorums` | array | Required
(exactly 1) | An array of new quorums | +| → →
`version` | number | Required
(exactly 1) | The quorum version | +| → →
`llmqType` | number | Required
(exactly 1) | The quorum type | +| → →
`quorumHash` | string (hex) | Required
(exactly 1) | The hash of the quorum | +| → →
`quorumIndex` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The index of the quorum | +| → →
`signersCount` | number | Required
(exactly 1) | The number of signers for the quorum | +| → →
`signers` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Bitset representing the aggregated signers of this final commitment | +| → →
`validMembersCount` | number | Required
(exactly 1) | The number of valid members in the quorum | +| → →
`validMembers` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Bitset of valid members in this commitment | +| → →
`quorumPublicKey` | string (hex) | Required
(exactly 1) | The public key of the quorum | +| → →
`quorumVvecHash` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
The SHA256 hash of the quorum verification vector | +| → →
`quorumSig` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Recovered threshold signature | +| → →
`membersSig` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Aggregated BLS signatures from all included commitments | +| →
`merkleRootMNList` | string (hex) | Required
(exactly 1) | Merkle root of the masternode list | +| →
`merkleRootQuorums` | string (hex) | Optional
(0 or 1) | *Added in Coinbase Transaction version 2 (Dash Core 0.14.0)*
Merkle root of the masternode list. | +| →
`quorumsCLSigs` | array | Optional
(0 or 1) | **Added in Coinbase Transaction version 3 (Dash Core 20.0.0)**
An array of objects containing ChainLock signature details. Only present after v20 hard fork activation. | +| → →
ChainLock signature | object | Optional
(0 or more) | Key: ChainLock signature
Value: array of quorum indexes | +| → → →
Quorum index | number | Required
(1 or more) | Quorum index indicating a `newQuorums` entry that used this ChainLock signature for their member calculation | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx diff 100000 100500 true +``` + +Result (truncated): + +```json +{ + "nVersion": 1, + "baseBlockHash": "000000008650f09124958e7352f844f9c15705171ac38ee6668534c5c238b916", + "blockHash": "000000000bcc2322bbfa41dbae3bc56f1468c4773c355a41671595e3cc9fbe71", + "cbTxMerkleTree": "03000000039c07679a6b4ca6f2865a6f6c3a4f188f74a211be75146f32f134212da580468a097c57203dc8d46de9db73463ae7a68704d823dd05dd97075116e83914136b1bdf955363517189da760b89ac71957734c6389315b74e41a23ed35ae85b3784960107", + "cbTx": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff4c03948801046c09df5c08fabe6d6d7804018887034cffffffff000000000000000000000000000000000000000000010000000000000057ffffd37c0100000d2f6e6f64655374726174756d2f000000000200240e43000000001976a914b7ce0ea9ce2010f58ba4aaa6caa76671c438e89088acf6230e43000000001976a9145889b4d255f6867504666d79e521be5cce30a4fd88ac00000000460200948801004cd4af41e87dedc9f93914689b6c8e90f20aa5ffb701dfcaabe716e682fd5fbd6aa200e13378d938ef435f1ce952594574ac956a6cd8ace46e6ba07a68161709", + "deletedMNs": [ + "e7d524e0b6b55bdba9721cc71f4e472eafbcaaa138c35899af3edfcad93eb6e2" + ], + "mnList": [ + { + "nVersion": 1, + "nType": 0, + "proRegTxHash": "488910d2554fbc8f803011dd107b993b185ed6eeb7efef6dedfd74ec6656f58b", + "confirmedHash": "00000000031c08dad48934c9e2a0bf3dac307aa1b6106ed8aa4345b5423166cd", + "service": "51.38.80.34:19999", + "pubKeyOperator": "8b63fa3eb2ed4caba1fec3647bcec7a2886b5cde5b2cec6b5a60dc04193e959d21e96cbfa41388159450f244578de9a9", + "votingAddress": "yXRzKxTbQUGWCqYwXnMWw5SnNCPj19NBGZ", + "isValid": true, + "payoutAddress": "yWPKEmx59zHRyyVFgC5xYXAZvGoaHCxTDE" + }, + { + "nVersion": 1, + "nType": 0, + "proRegTxHash": "9dadb2198c6c3f7d9aef77493ee2f8f0513198bada377078a99a1128ffa1b2b0", + "confirmedHash": "00000000006fef47babe96126b70087c46defeb9527de07a52e417fe7fcd2fce", + "service": "34.83.230.157:19999", + "pubKeyOperator": "963984167b298d8d77b1be02e38e2493a75251cf9abecc7facee85512eabab7b05ffe053e8956d98ad4a3c20b77ade1e", + "votingAddress": "yW5QUL6GqNswhSdMnWjcyAZ871VKrdY4jS", + "isValid": true, + "payoutAddress": "yMvjw8sFTBZy72sgGVHHwisF1ETmhr9ngq" + } + ], + "deletedQuorums": [ + { + "llmqType": 1, + "quorumHash": "0000000004557649b0e4e3efddfab854ec08e26838cebc7eb42fff52d0602a06" + }, + { + "llmqType": 1, + "quorumHash": "00000000156618545aecc80d2dbb0385cc200a63137ddad75278ba3069ad2615" + } + ], + "newQuorums": [ + { + "version": 1, + "llmqType": 1, + "quorumHash": "0000000006393472bb9a01853bcf86f62c3744a329f1ef7812b45f9ec68cf802", + "quorumIndex": 0, + "signersCount": 49, + "signers": "fffffffeffff03", + "validMembersCount": 49, + "validMembers": "fffffffeffff03", + "quorumPublicKey": "8999f54dab1dd04cabdd70532b929ec69e4d252f3283eadce1defd4b6a9550a7b2bdb303261a1b39733ebc1c089dbb17", + "quorumVvecHash": "65fe94b2ea695ca03428b32f03bc22cbee5c61fb85b170c6f6aca42562244283", + "quorumSig": "0e925a8fcfd8722ff52a9feb9780ecfc1173a0715dfa17b6af9fd7a0abd2f13953e3111b2c92cbb7b892423a984dc8440ad5842d294b1e10b34361227922a3b24395495475cef16688e626074426003ceb48021560e22582010a0338947eec03", + "membersSig": "80266b6ae1eea601fc50e46e00fb9d56596230fee64673e42bd61e17ccf65d45973ab6f9a96cee4e3b6db69ce9d9e81205b3e8ee81fab42699ce54ec78f70667fa0571c8cf78b6c2ec991956c2e0e6553bbfcb4a92e8e5529238185c1765682f" + }, + { + "version": 1, + "llmqType": 1, + "quorumHash": "000000001cd753a7cdead3abaff75a6d6e009108e0b28c66b07042a940471706", + "quorumIndex": 0, + "signersCount": 50, + "signers": "ffffffffffff03", + "validMembersCount": 50, + "validMembers": "ffffffffffff03", + "quorumPublicKey": "8282dc910667713e033b75cf59b3d415ba0d8cfa38eda468bdf6da1f67a66f13eef9e2a5b5280dc215320a47d84dcd06", + "quorumVvecHash": "5e1f653b26dba9bb59ed0e6cb7dd1335df11801189cdf282e53585c6eeff75ef", + "quorumSig": "1234604b562c454896b369b54a3c5e0f98b55d4e67b35be171860cd100a35a70bfe3280c4d2f878cbd6ae0f8163fab0d19f63aab5f57fa645aa73fda9eb2ed77a24054ae0f8a46d2a93a2958cd8a96430fa7b63f3f891ef434ad55b7302ea611", + "membersSig": "9545aa8277d340d234a76855972599f029d9f0d8b76ebed65178d7e584eb12541dd2c59877b592dd658cd765ac3b68fd1932cd5089108db0f32aa83e6b242a857d7a8c76db1a4f107dc8df0ecd6aab9443ed073dd0c91d19fdaff57c7ee3d65b" + } + ], + "merkleRootMNList": "bd5ffd82e616e7abcadf01b7ffa50af2908e6c9b681439f9c9ed7de841afd44c", + "merkleRootQuorums": "091716687aa06b6ee4acd86c6a95ac74455952e91c5f43ef38d97833e100a26a", + "quorumsCLSigs": [ + { + "82492bd4bcd9cd24b89011f11368e06d79942579cfa957fad51429553a45d9990cc10e8b475f59d5b29cedb7598edd300ccb43614f4c15055ea8b172d0dad174f6e8ea83814d7cd2dd528ec7a882e941e909763f70b1065bcdce384be559c31b": [ + 6, + 30, + 86 + ] + }, + { + "aa3759de99561b451f24d95945674ae8e73ceb0dcd9ce303228599993080e20f0add1a99e24e241bc905e66eb6155c4e07adbbf2232f476495aabb48e6761af3e07f6660c2607e54dc2efaee38934f714aeff9199a818fd2dcc043edbb7d429b": [ + 13, + 37, + 93 + ] + } + ] +} +``` + +*See also: none* + +### ProTx Info + +The `protx info` RPC returns detailed information about a deterministic masternode. + +*Parameters* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------- | +| `proTxHash` | string | Required
(Exactly 1) | The hash of the initial ProRegTx | +| `blockHash` | string | Optional
(0 or 1) | The hash of the block to get deterministic masternode state at. Defaults to chain tip if not provided. | + +*Result--Details about a specific deterministic masternode* + +| Name | Type | Presence | Description | +| ----------------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | A JSON object containing a provider transaction, or JSON `null` if an error occurred | +|
Provider Transaction | object/null | Required
(exactly 1) | An object containing a provider transaction | +| →
`type` | string | Required
(exactly 1) | **Added in Dash Core 19.0.0**
The type of masternode | +| →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | +| →
`collateralHash` | string (hex) | Required
(exactly 1) | The hash of the collateral transaction as hex in RPC byte order | +| →
`collateralIndex` | number (int) | Required
(exactly 1) | The collateral index | +| →
`collateralAddress` | string | Required
(exactly 1) | The collateral address | +| →
`operatorReward` | number (float) | Required
(exactly 1) | The operator reward %. The value must be between `0.00` and `100.00`. | +| →
`state` | object/null | Required
(exactly 1) | An object containing a provider transaction state | +| → →
`version` | number (int) | Required
(exactly 1) | **Added in Dash Core 19.2.0**
The version of the most recent ProRegTx or ProUpRegTx | +| → →
`service` | string | Required
(exactly 1) | The masternode's IP:Port | +| → →
`registeredHeight` | number (int) | Required
(exactly 1) | The height where the masternode was registered | +| → →
`lastPaidHeight` | number (int) | Required
(exactly 1) | The height where the masternode was last paid | +| → →
`consecutivePayments` | number (int) | Required
(exactly 1) | **Added in Dash Core 19.0.0**
The number of consecutive payments the masternode has received in the payment cycle | +| → →
`PoSePenalty` | number (int) | Required
(exactly 1) | The masternode's proof of service penalty | +| → →
`PoSeRevivedHeight` | number (int) | Required
(exactly 1) | The height where the masternode recovered from a proof of service ban | +| → →
`PoSeBanHeight` | number (int) | Required
(exactly 1) | The height where the masternode was banned for proof of service violations | +| → →
`revocationReason` | number (int) | Required
(exactly 1) | The reason for a ProUpRegTx revocation | +| → →
`ownerAddress` | string | Required
(exactly 1) | The owner address | +| → →
`votingAddress` | string | Required
(exactly 1) | The voting address | +| → →
`payoutAddress` | string | Required
(exactly 1) | The owner's payout address | +| → →
`pubKeyOperator` | string (hex) | Required
(exactly 1) | The operator public key | +| → →
`operatorPayoutAddress` | string | Required
(exactly 1) | The operator's payout address | +| →
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations this ProTx has | +| →
`wallet` | object/null | Required
(exactly 1) | An object containing a wallet details related to this ProTx | +| → →
`hasOwnerKey` | bool | Required
(exactly 1) | The owner key is present in this wallet | +| → →
`hasOperatorKey` | bool | Required
(exactly 1) | The operator key is present in this wallet | +| → →
`hasVotingKey` | bool | Required
(exactly 1) | The voting key is present in this wallet | +| → →
`ownsCollateral` | bool | Required
(exactly 1) | The collateral is owned by this wallet | +| → →
`ownsPayeeScript` | bool | Required
(exactly 1) | The payee script is owned by this wallet | +| → →
`ownsOperatorRewardScript` | bool | Required
(exactly 1) | The operator reward script is owned by this wallet | +| →
`metaInfo` | object/null | Required
(exactly 1) | *Added in Dash Core 0.16.0*
An object containing a metainfo related to this ProTx | +| → →
`lastDSQ` | string | Required
(exactly 1) | The owner key is present in this wallet | +| → →
`mixingTxCount` | string | Required
(exactly 1) | The operator key is present in this wallet | +| → →
`outboundAttemptCount` | integer | Required
(exactly 1) | **Added in Dash Core 19.2.0**
Number of outbound attempts | +| → →
`lastOutboundAttempt` | integer | Required
(exactly 1) | Unix epoch time of the last outbound attempted | +| → →
`lastOutboundAttemptElapsed` | integer | Required
(exactly 1) | Elapsed time since last outbound attempt | +| → →
`lastOutboundSuccess` | integer | Required
(exactly 1) | Unix epoch time of the last successful outbound connection | +| → →
`lastOutboundSuccessElapsed` | integer | Required
(exactly 1) | Elapsed time since last successful outbound attempt | + +*Example from Dash Core 20.1.0* + +```bash +dash-cli -testnet protx info\ + b43dadbd485e4d1e1d202ea5180f0ad4e8e7f05e97a7e566a764ed714356bd1f +``` + +Result: + +```json +{ + "type": "Regular", + "proTxHash": "b43dadbd485e4d1e1d202ea5180f0ad4e8e7f05e97a7e566a764ed714356bd1f", + "collateralHash": "acc1127471fb4417e2ca6420948143c82dfdd3595d5cb4336e19356df4e5715c", + "collateralIndex": 1, + "collateralAddress": "yMitd7GcJRUF8AeWhT7nWB9bDoruWM7tRb", + "operatorReward": 0, + "state": { + "version": 1, + "service": "47.111.181.207:20001", + "registeredHeight": 247288, + "lastPaidHeight": 0, + "consecutivePayments": 0, + "PoSePenalty": 369, + "PoSeRevivedHeight": -1, + "PoSeBanHeight": 247428, + "revocationReason": 0, + "ownerAddress": "yaMGQThTVPUf1LBqVqa1jMTtLW7ByVbN78", + "votingAddress": "yQ8oETtF1pRQfBP4iake2e5zyCCm85CAET", + "payoutAddress": "yZw2EYuVkTNUzUqd7mfXRNhCMReonL99tu", + "pubKeyOperator": "90c0e9ec9dc5f08b1d4d0211920fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e038" + }, + "confirmations": 602825, + "wallet": { + "hasOwnerKey": false, + "hasOperatorKey": false, + "hasVotingKey": false, + "ownsCollateral": false, + "ownsPayeeScript": false, + "ownsOperatorRewardScript": false + }, + "metaInfo": { + "lastDSQ": 0, + "mixingTxCount": 0, + "outboundAttemptCount": 0, + "lastOutboundAttempt": 0, + "lastOutboundAttemptElapsed": 1686685781, + "lastOutboundSuccess": 0, + "lastOutboundSuccessElapsed": 1686685781 + } +} +``` + +### ProTx List + +The `protx list` RPC returns a list of provider transactions. + +Lists all ProTxs in your wallet or on-chain, depending on the given type. If `type` is not specified, it defaults to `registered`. All types have the optional argument `detailed` which if set to `true` will result in a detailed list being returned. If set to `false`, only the hashes of the ProTx will be returned. + +*Parameter #1---type* + +| Name | Type | Presence | Description | +| ------ | ------ | -------------------- | ----------- | +| `type` | string | Optional
(0 or 1) | The type of ProTxs to list:
`registered` - all ProTxs registered at height
`valid` - all active/valid ProTxs at height
`evo` - List only ProTxs corresponding to evonodes at the given chain height
`wallet` - all ProTxs found in the current wallet

Height defaults to current chain-tip if one is not provided | + +*Parameter #2---detailed* + +| Name | Type | Presence | Description | +| ---------- | ---- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `detailed` | bool | Optional
(0 or 1) | If set to `false` (default), only ProTx hashes are returned. If set to `true`, a detailed list of ProTx details is returned. | + +*Parameter #3---height* + +| Name | Type | Presence | Description | +| -------- | ------------ | -------------------- | ---------------------------------------------------------- | +| `height` | number (int) | Optional
(0 or 1) | List ProTxs from this height (default: current chain tip). | + +*Result (if `detailed` was `false`)---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------------- | ----------------------- | -------------------------------------------- | +| `result` | string (hex): array | Required
(exactly 1) | Array of provider transaction (ProTx) hashes | + +*Result (if `detailed` was `true`)---JSON provider registration transaction details* + +| Name | Type | Presence | Description | +| ----------------------------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `result` | array | Required
(exactly 1) | An array of objects each containing a provider transaction, or JSON `null` if an error occurred | +|
Provider Transaction | object/null | Required
(exactly 1) | An object containing a provider transaction | +| →
`type` | string | Required
(exactly 1) | **Added in Dash Core 19.0.0**
The type of masternode | +| →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | +| →
`collateralHash` | string (hex) | Required
(exactly 1) | The hash of the collateral transaction as hex in RPC byte order | +| →
`collateralIndex` | number (int) | Required
(exactly 1) | The collateral index | +| → →
`collateralAddress` | string | Required
(exactly 1) | The collateral address | +| →
`operatorReward` | number (float) | Required
(exactly 1) | The operator reward %. The value must be between `0.00` and `100.00`. | +| →
`state` | object/null | Required
(exactly 1) | An object containing a provider transaction state | +| → →
`version` | number (int) | Required
(exactly 1) | **Added in Dash Core 19.2.0**
The version of the most recent ProRegTx or ProUpRegTx | +| → →
`service` | string | Required
(exactly 1) | The masternode's IP:Port | +| → →
`registeredHeight` | number (int) | Required
(exactly 1) | The height where the masternode was registered | +| → →
`lastPaidHeight` | number (int) | Required
(exactly 1) | The height where the masternode was last paid | +| → →
`consecutivePayments` | number (int) | Required
(exactly 1) | **Added in Dash Core 19.0.0**
The number of consecutive payments the masternode has received in the payment cycle | +| → →
`PoSePenalty` | number (int) | Required
(exactly 1) | The masternode's proof of service penalty | +| → →
`PoSeRevivedHeight` | number (int) | Required
(exactly 1) | The height where the masternode recovered from a proof of service ban | +| → →
`PoSeBanHeight` | number (int) | Required
(exactly 1) | The height where the masternode was banned for proof of service violations | +| → →
`revocationReason` | number (int) | Required
(exactly 1) | The reason for a ProUpRegTx revocation | +| → →
`ownerAddress` | string | Required
(exactly 1) | The owner address | +| → →
`votingAddress` | string | Required
(exactly 1) | The voting address | +| → →
`payoutAddress` | string | Required
(exactly 1) | The owner's payout address | +| → →
`pubKeyOperator` | string (hex) | Required
(exactly 1) | The operator public key | +| → →
`operatorPayoutAddress` | string | Required
(exactly 1) | The operator's payout address | +| →
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations this ProTx has | +| →
`wallet` | object/null | Required
(exactly 1) | An object containing a wallet details related to this ProTx | +| → →
`hasOwnerKey` | bool | Required
(exactly 1) | The owner key is present in this wallet | +| → →
`hasOperatorKey` | bool | Required
(exactly 1) | The operator key is present in this wallet | +| → →
`hasVotingKey` | bool | Required
(exactly 1) | The voting key is present in this wallet | +| → →
`ownsCollateral` | bool | Required
(exactly 1) | The collateral is owned by this wallet | +| → →
`ownsPayeeScript` | bool | Required
(exactly 1) | The payee script is owned by this wallet | +| → →
`ownsOperatorRewardScript` | bool | Required
(exactly 1) | The operator reward script is owned by this wallet | +| →
`metaInfo` | object/null | Required
(exactly 1) | *Added in Dash Core 0.16.0*
An object containing a metainfo related to this ProTx | +| → →
`lastDSQ` | string | Required
(exactly 1) | The owner key is present in this wallet | +| → →
`mixingTxCount` | string | Required
(exactly 1) | The operator key is present in this wallet | +| → →
`outboundAttemptCount` | integer | Required
(exactly 1) | **Added in Dash Core 19.2.0**
Number of outbound attempts | +| → →
`lastOutboundAttempt` | integer | Required
(exactly 1) | Unix epoch time of the last outbound attempted | +| → →
`lastOutboundAttemptElapsed` | integer | Required
(exactly 1) | Elapsed time since last outbound attempt | +| → →
`lastOutboundSuccess` | integer | Required
(exactly 1) | Unix epoch time of the last successful outbound connection | +| → →
`lastOutboundSuccessElapsed` | integer | Required
(exactly 1) | Elapsed time since last successful outbound attempt | + +*Example from Dash Core 19.2.0* + +```bash +dash-cli -testnet protx list +``` + +Result: + +```json +[ + "2b4a07a9b04dc42a0c19b85edb60954a27acaadfe3ee21d0171385778f34e1c2", + "61e6d780178d353940c4cb9b3073ac0c50792bbcf0b15c1750d2028b71e34929", + "ca193751f3cbed2aa4f1b33b0acc48c7ed8b9a3679858d69cf23157a4f545176", + "ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd" +] +``` + +List of ProTxs which are active/valid at the given chain height. + +```bash +dash-cli -testnet protx list valid false 7090 +``` + +Result: + +```json +[ + "c48a44a9493eae641bea36992bc8c27eaaa33adb1884960f55cd259608d26d2f" +] +``` + +Detailed list of ProTxs which are active/valid at the given chain height. + +```bash +dash-cli -testnet protx list valid true 7090 +``` + +Result: + +```json +[ + { + "type": "Regular", + "proTxHash": "c48a44a9493eae641bea36992bc8c27eaaa33adb1884960f55cd259608d26d2f", + "collateralHash": "e3270ff48c4b802d56ee58d3d53777f7f9c289964e4df0842518075fc81345b1", + "collateralIndex": 3, + "operatorReward": 0, + "state": { + "version": 1, + "service": "173.61.30.231:19013", + "registeredHeight": 7090, + "lastPaidHeight": 0, + "consecutivePayments": 0, + "PoSePenalty": 0, + "PoSeRevivedHeight": -1, + "PoSeBanHeight": -1, + "revocationReason": 0, + "ownerAddress": "yTMDce5yEpiPqmgPrPmTj7yAmQPJERUSVy", + "votingAddress": "yTMDce5yEpiPqmgPrPmTj7yAmQPJERUSVy", + "payoutAddress": "yU3UdrmS6KpWwBDLQTkp1KjXePwWsMbYdj", + "pubKeyOperator": "8700add55a28ef22ec042a2f28e25fb4ef04b3024a7c56ad7eed4aebc736f312d18f355370dfb6a5fec9258f464b227e" + }, + "confirmations": -1, + "wallet": { + "hasOwnerKey": false, + "hasOperatorKey": false, + "hasVotingKey": false, + "ownsCollateral": false, + "ownsPayeeScript": false, + "ownsOperatorRewardScript": false + }, + "metaInfo": { + "lastDSQ": 0, + "mixingTxCount": 0, + "outboundAttemptCount": 0, + "lastOutboundAttempt": 0, + "lastOutboundAttemptElapsed": 1686684013, + "lastOutboundSuccess": 0, + "lastOutboundSuccessElapsed": 1686684013 + } + } +] +``` + +### ProTx List Diff + +The `protx listdiff` RPC calculates a full MN list diff between two masternode lists. + +*Parameter #1---baseBlock* + +| Name | Type | Presence | Description | +| ----------- | ------- | -------------------- | ------------------------ | +| `baseBlock` | numeric | Required (exactly 1) | The starting block height| + +*Parameter #2---block* + +| Name | Type | Presence | Description | +| ------- | ------- | -------------------- | -----------------------| +| `block` | numeric | Required (exactly 1) | The ending block height| + +*Example from Dash Core* + +```bash +dash-cli -testnet protx listdiff 7100 7135 +``` + +Result: + +```json +{ + "baseHeight": 7100, + "blockHeight": 7135, + "addedMNs": [ + { + "type": "Regular", + "proTxHash": "682b3e58e283081c51f2e8e7a7de5c7312a2e8074affaf389fafcc39c4805404", + "collateralHash": "4955dcb8f9f56705b2ce480369c8a0e50b05c3dd1770160c4ddd47515a87e290", + "collateralIndex": 1, + "collateralAddress": "ySbK2DePJxPzkeHD2ccnMmsJjvBK5tJSPU", + "operatorReward": 0, + "state": { + "version": 1, + "service": "64.193.62.206:19999", + "registeredHeight": 7134, + "lastPaidHeight": 7135, + "consecutivePayments": 0, + "PoSePenalty": 0, + "PoSeRevivedHeight": -1, + "PoSeBanHeight": -1, + "revocationReason": 0, + "ownerAddress": "yid7uAsVJzvSLrEekHuGNuY3KWCqJopyJ8", + "votingAddress": "yid7uAsVJzvSLrEekHuGNuY3KWCqJopyJ8", + "payoutAddress": "yf7kAvZXd49hnWaScRbbLP9LMKDvz1f1tp", + "pubKeyOperator": "05f2269374676476f00068b7cb168d124b7b780a92e8564e18edf45d77497abd9debf186ee98001a0c9a6dfccbab7a0a" + } + } + ], + "removedMNs": [ + ], + "updatedMNs": [ + { + "c48a44a9493eae641bea36992bc8c27eaaa33adb1884960f55cd259608d26d2f": { + "lastPaidHeight": 7134 + } + } + ] +} +``` + +### ProTx Register + +The `protx register` RPC creates a ProRegTx referencing an existing collateral and and sends it to the network. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #6---voting address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator. The value must be between `0.00` and `100.00`.
**Note**: If non-zero, `ipAndPort` must be zero as well. | + +*Parameter #8---payout address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Parameter #10---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +*Result if `submit` is not set or set to `true`---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider registration transaction (ProRegTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx register\ + 8b2eab3413abb6e04d17d1defe2b71039ba6b6f72ea1e5dab29bb10e7b745948 1\ + 2.3.4.5:2345 yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ + 88d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c5566\ + yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt +``` + +Result: + +```text +61e6d780178d353940c4cb9b3073ac0c50792bbcf0b15c1750d2028b71e34929 +``` + +*Result if `submit` set to `false`---serialized and signed provider registration transaction* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Serialized and signed provider registration transaction (ProRegTx) | + +*Example from Dash Core 0.17.0* + +```bash +dash-cli -testnet protx register\ +b16e6f6ac71d16a8be46a78491bbdba20910287f59471a46514b88d7203bac6b 1 2.3.4.5:2345\ +yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ +8ae227ffcbd4cbdc7ae2fe3e63264701ef6af1de71e6cade51867ecb7ed58b63862568522bab933987d0d043fa5590e1\ +yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt\ +yUYTxqjpCfAAK4vgxXtBPywRBtZqsxN7Vy false +``` + +Result: + +```text +0300010001fe1caa50e5b8181be868fbd9fbd93affeb6c4a91a3c73373a6b25d548c7e6d41010000\ +006b48304502210081d206a8332d5b8715ca831155ef5c7e339d33cde2b0b27310b95aafc8c560f9\ +02204029d00d2b5515565321ec1fd6748fa0544b7356d9a389e4d1ce6ab4bb64d364012103c67d86\ +944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9feffffff01a6f0433e0000\ +00001976a9145a375814e9caf5b8575a8221be246457e5c5c28d88ac00000000fd12010100000000\ +006bac3b20d7884b51461a47597f281009a2dbbb9184a746bea8161dc76a6f6eb101000000000000\ +00000000000000ffff0203040509291636e84d02310b0b458f3eb51d8ea8b2e684b7ce8ae227ffcb\ +d4cbdc7ae2fe3e63264701ef6af1de71e6cade51867ecb7ed58b63862568522bab933987d0d043fa\ +5590e11636e84d02310b0b458f3eb51d8ea8b2e684b7cef4011976a914fc136008111fcc7a05be6c\ +ec66f97568727a9e5188acb3ccf680086ae11217236efcccd67b0b72e83c79a043d6c6d064378fdd\ +5f21204120fac89c76d3f116d95a675e112ddbdbb7a78f957506299fe592662acd44b46f262d1c4d\ +47d9401e0a569a5488728e09542d0545ab56f8249a4b21e03445fa411e +``` + +### ProTx Register Legacy + +:::{note} +Since the v19 hard fork activation, this command must be used if a legacy scheme BLS key is being used to register a masternode. In all other cases the [`protx register`RPC](#protx-register) should be used instead. + +Legacy scheme BLS keys are created if the [`bls generate` RPC](#bls-generate) is run prior to v19 hard fork activation OR if a legacy key is explicitly generated using the [`bls generate legacy` RPC](#bls-generate). +::: + +The `protx register_legacy` RPC works similar to `protx register`, but parses the operator key using the legacy BLS scheme. The collateral is specified through `collateralHash` and `collateralIndex` and must be an unspent transaction output spendable by this wallet. It must also not be used by any other masternode. This RPC requires a wallet passphrase to be set with walletpassphrase call if wallet is encrypted. + +*Parameter #1---collateral hash* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting.
The corresponding private key does not have to be known by this wallet.
The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key* + +| Name | Type | Presence | Description | +| -------------------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator BLS public key.
The BLS private key does not have to be known.
It has to match the BLS private key which is later used when operating the masternode. | + +*Parameter #6---voting address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_register` | string | Required
(exactly 1) | The voting key address.
The private key does not have to be known by your wallet.
It has to match the private key which is later used when voting on proposals. If set to an empty string, ownerAddress will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------ | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #8---payout address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx.
If not specified, `payoutAddress` will be used.
The private key belonging to this address must be known in your wallet. | + +*Parameter #10---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +*Result if `submit` is not set or set to `true`---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider registration transaction (ProRegTx) hash | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx register_legacy\ + 8b2eab3413abb6e04d17d1defe2b71039ba6b6f72ea1e5dab29bb10e7b745948 1\ 0 + 2.3.4.5:2345 yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ 88d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c5566\ + yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt +``` + +Result: + +```text +61e6d780178d353940c4cb9b3073ac0c50792bbcf0b15c1750d2028b71e34929 +``` + +*Result if `submit` set to `false`---serialized and signed provider registration transaction* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Serialized and signed provider registration transaction (ProRegTx) | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx register_legacy\ + 8b2eab3413abb6e04d17d1defe2b71039ba6b6f72ea1e5dab29bb10e7b745948 1\ 0 + 2.3.4.5:2345 yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ 88d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c5566\ + yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt false +``` + +Result: + +```text +0300010001fe1caa50e5b8181be868fbd9fbd93affeb6c4a91a3c73373a6b25d548c7e6d41010000\ +006b48304502210081d206a8332d5b8715ca831155ef5c7e339d33cde2b0b27310b95aafc8c560f9\ +02204029d00d2b5515565321ec1fd6748fa0544b7356d9a389e4d1ce6ab4bb64d364012103c67d86\ +944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9feffffff01a6f0433e0000\ +00001976a9145a375814e9caf5b8575a8221be246457e5c5c28d88ac00000000fd12010100000000\ +006bac3b20d7884b51461a47597f281009a2dbbb9184a746bea8161dc76a6f6eb101000000000000\ +00000000000000ffff0203040509291636e84d02310b0b458f3eb51d8ea8b2e684b7ce8ae227ffcb\ +d4cbdc7ae2fe3e63264701ef6af1de71e6cade51867ecb7ed58b63862568522bab933987d0d043fa\ +5590e11636e84d02310b0b458f3eb51d8ea8b2e684b7cef4011976a914fc136008111fcc7a05be6c\ +ec66f97568727a9e5188acb3ccf680086ae11217236efcccd67b0b72e83c79a043d6c6d064378fdd\ +5f21204120fac89c76d3f116d95a675e112ddbdbb7a78f957506299fe592662acd44b46f262d1c4d\ +47d9401e0a569a5488728e09542d0545ab56f8249a4b21e03445fa411e +``` + +### ProTx Register Fund + +The `protx register_fund` RPC creates and funds a ProRegTx with the 1,000 DASH necessary for a masternode and then sends it to the network. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ------------------- | ------ | ----------------------- | ------------------------------------------ | +| `collateralAddress` | string | Required
(exactly 1) | The Dash address to send the collateral to | + +*Parameter #2---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #3---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #4---operator public key* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #5---voting address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #6---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #7---payout address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #8---fund address* + +| Name | Type | Presence | Description | +| ------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fundAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Parameter #9---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +*Result if `submit` is not set or set to `true`---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider registration transaction (ProRegTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx register_fund yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ + 3.4.5.6:3456 yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw\ + 0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ + yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw 5 yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7 +``` + +Result: + +```text +ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd +``` + +*Result if `submit` set to `false`---serialized and signed provider registration transaction* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Serialized and signed provider registration transaction (ProRegTx) | + +*Example from Dash Core 0.17.0* + +```bash +dash-cli -testnet protx register_fund yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ +3.4.5.6:3456 yURczr3qY31xkQZfFu8eZvKz19eAEPQxsd\ +0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ +yURczr3qY31xkQZfFu8eZvKz19eAEPQxsd 5 yUYTxqjpCfAAK4vgxXtBPywRBtZqsxN7Vy\ +yRMFHxcJ2aS2vfo5whhE2Gg73dfQVm8LAF 0 +``` + +Result: + +```text +030001000156701575e76bca5720fa364ea6efc4b713279710dd1b8906797d18bd7048b71a010000\ +006b4830450221009178a387b3d82e3606e6484373508ef1ed4c1d7d98f8a0ca0851687c59edacaa\ +02204d245d20689b5be1100536faaadbb1781e3a67a55e9ecc613adb2a34f419c3cd012103109325\ +a92f9e6d31d2ebd0595d471275ae8d635db2a0c42358f387e1af69c14dfeffffff0200e876481700\ +00001976a9141636e84d02310b0b458f3eb51d8ea8b2e684b7ce88ac8c7a918b300000001976a914\ +372fd07f715c33ce88873a8e758d890e017cf02588ac00000000d101000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000ff\ +ff030405060d8058ebf95961c207ebd525793ccb43f60ce34a5cd50e02146e9c34cfbcb3f3037574\ +a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d5158ebf95961\ +c207ebd525793ccb43f60ce34a5cd5f4011976a9145a375814e9caf5b8575a8221be246457e5c5c2\ +8d88ac45084a0f63d6f06767c941ffd5af4ed17ea0e28afa481e46b2bdbadbd8446c8c00\ +``` + +### ProTx Register Fund Legacy + +:::{note} +Since the v19 hard fork activation, this command must be used if a legacy scheme BLS key is being used to register a masternode. In all other cases the [`protx register_fund` RPC](#protx-register-fund) should be used instead. + +Legacy scheme BLS keys are created if the [`bls generate` RPC](#bls-generate) is run prior to v19 hard fork activation OR if a legacy key is explicitly generated using the [`bls generate legacy` RPC](#bls-generate). +::: + +The `protx register_fund_legacy` RPC creates, funds, and sends a ProTx to the network. The resulting transaction will move 1000 DASH to the address specified by `collateralAddress` and will then function as the collateral of your masternode. A few of the limitations you see in the arguments are temporary and might be lifted after DIP3 is fully deployed. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ------------------- | ------ | ----------------------- | ------------------------------------------ | +| `collateralAddress` | string | Required
(exactly 1) | The Dash address to send the collateral to | + +*Parameter #2---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #3---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #4---operator public key* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator BLS public key.
The BLS private key does not have to be known.
It has to match the BLS private key which is later used when operating the masternode. | + +*Parameter #5---voting address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #6---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #7---payout address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #8---fund address* + +| Name | Type | Presence | Description | +| ------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fundAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Parameter #9---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +\*Result if `submit` is not set or set to `true` + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------ | +| `result` | string (hex) | Required
(exactly 1) | The transaction id | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx register_fund_legacy yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ + 3.4.5.6:3456 yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw\ + 0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ + yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw 5 yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7 +``` + +Result: + +```text +ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd +``` + +*Result if `submit` set to `false`---serialized and signed provider registration transaction* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ----------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | The serialized signed ProTx in hex format | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx register_fund_legacy yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ +3.4.5.6:3456 yURczr3qY31xkQZfFu8eZvKz19eAEPQxsd\ +0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ +yURczr3qY31xkQZfFu8eZvKz19eAEPQxsd 5 yUYTxqjpCfAAK4vgxXtBPywRBtZqsxN7Vy\ +yRMFHxcJ2aS2vfo5whhE2Gg73dfQVm8LAF 0 +``` + +Result: + +```text +030001000156701575e76bca5720fa364ea6efc4b713279710dd1b8906797d18bd7048b71a010000\ +006b4830450221009178a387b3d82e3606e6484373508ef1ed4c1d7d98f8a0ca0851687c59edacaa\ +02204d245d20689b5be1100536faaadbb1781e3a67a55e9ecc613adb2a34f419c3cd012103109325\ +a92f9e6d31d2ebd0595d471275ae8d635db2a0c42358f387e1af69c14dfeffffff0200e876481700\ +00001976a9141636e84d02310b0b458f3eb51d8ea8b2e684b7ce88ac8c7a918b300000001976a914\ +372fd07f715c33ce88873a8e758d890e017cf02588ac00000000d101000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000ff\ +ff030405060d8058ebf95961c207ebd525793ccb43f60ce34a5cd50e02146e9c34cfbcb3f3037574\ +a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d5158ebf95961\ +c207ebd525793ccb43f60ce34a5cd5f4011976a9145a375814e9caf5b8575a8221be246457e5c5c2\ +8d88ac45084a0f63d6f06767c941ffd5af4ed17ea0e28afa481e46b2bdbadbd8446c8c00\ +``` + +### ProTx Register Prepare + +The `protx register_prepare` RPC creates an unsigned ProTx and a message that must be signed externally with the private key that corresponds to `collateralAddress` to prove collateral ownership. The prepared transaction will also contain inputs and outputs to cover fees. The ProTx must be passed to [`protx register_submit`](#protx-register-submit). + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form 'IP:PORT'.
Must be unique on the network.
Can be set to '0', which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #6---voting address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #8---payout address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---unsigned transaction and message to sign* + +| Name | Type | Presence | Description | +| ------------------------ | --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | JSON object containing an unsigned provider transaction and the message to be signed externally, or JSON `null` if an error occurred | +| →
`tx` | string (hex) | Required
(exactly 1) | The serialized unsigned ProRegTx in hex format | +| →
`collateralAddress` | string | Required
(exactly 1) | The collateral address | +| →
`signMessage` | string (base64) | Required
(exactly 1) | The string message that needs to be signed with the collateral key. | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx register_prepare\ + df41e398bb245e973340d434d386f431dbd69735a575721b0b6833856e7d31ec 1 \ + 9.8.7.6:9876 yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz\ + 06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280c\ + yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz 1.2 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt +``` + +Result: + +```json +{ + "tx": "0300010001912b88876fee2f8e43e23b5e81276c163cf23d867bad4148170cb106ef9023700000000000feffffff0125623ba40b0000001976a914736e155c1039a269d4019c66219d2a18f0fee27588ac00000000d1010000000000ec317d6e8533680b1b7275a53597d6db31f486d334d44033975e24bb98e341df0100000000000000000000000000ffff090807062694ca6b243168b30461d1f19e2bb89a965a5bac067e06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280cca6b243168b30461d1f19e2bb89a965a5bac067e78001976a914fc136008111fcc7a05be6cec66f97568727a9e5188ace5f6b70ac55411727e25178bd417b9b03f837ad7155d90ad286f3a427203fb9f00", + "collateralAddress": "yWuKWhDzGQqZL8rw6kGxGrfe6P8bUC2S4f", + "signMessage": "yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt|120|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|69a49e18c1253b90d39322f7e2f7af74524401bc33a27645e697e74a214e3e1e" +} +``` + +### ProTx Register Prepare Legacy + +:::{note} +Since the v19 hard fork activation, this command must be used if a legacy scheme BLS key is being used to register a masternode. In all other cases the [`protx register_prepare` RPC](#protx-register-prepare) should be used instead. + +Legacy scheme BLS keys are created if the [`bls generate` RPC](#bls-generate) is run prior to v19 hard fork activation OR if a legacy key is explicitly generated using the [`bls generate legacy` RPC](#bls-generate). +::: + +The `protx register_prepare_legacy` RPC Creates an unsigned ProTx and a message that must be signed externally with the private key that corresponds to collateralAddress to prove collateral ownership. The prepared transaction will also contain inputs and outputs to cover fees. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form 'IP:PORT'.
Must be unique on the network.
Can be set to '0', which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #6---voting address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_register` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #8---payout address* + +| Name | Type | Presence | Description | +| ------------------------- | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---unsigned transaction and message to sign* + +| Name | Type | Presence | Description | +| ------------------------ | --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | JSON object containing an unsigned provider transaction and the message to be signed externally, or JSON `null` if an error occurred | +| →
`tx` | string (hex) | Required
(exactly 1) | The serialized unsigned ProRegTx in hex format | +| →
`collateralAddress` | string | Required
(exactly 1) | The collateral address | +| →
`signMessage` | string (base64) | Required
(exactly 1) | The string message that needs to be signed with the collateral key. | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx register_prepare_legacy\ +df41e398bb245e973340d434d386f431dbd69735a575721b0b6833856e7d31ec 1 0 9.8.7.6:9876\ +yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz\ +06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280c\ +yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz 1.2 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt +``` + +Result: + +```json +{ + "tx": "0300010001912b88876fee2f8e43e23b5e81276c163cf23d867bad4148170cb106ef9023700000000000feffffff0125623ba40b0000001976a914736e155c1039a269d4019c66219d2a18f0fee27588ac00000000d1010000000000ec317d6e8533680b1b7275a53597d6db31f486d334d44033975e24bb98e341df0100000000000000000000000000ffff090807062694ca6b243168b30461d1f19e2bb89a965a5bac067e06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280cca6b243168b30461d1f19e2bb89a965a5bac067e78001976a914fc136008111fcc7a05be6cec66f97568727a9e5188ace5f6b70ac55411727e25178bd417b9b03f837ad7155d90ad286f3a427203fb9f00", + "collateralAddress": "yWuKWhDzGQqZL8rw6kGxGrfe6P8bUC2S4f", + "signMessage": "yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt|120|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|69a49e18c1253b90d39322f7e2f7af74524401bc33a27645e697e74a214e3e1e" +} +``` + +### ProTx Register Evo + +The `protx register_evo` RPC functions similar to `protx register_fund_evo`, but with an externally referenced collateral. The collateral is specified through `collateralHash` and `collateralIndex` and must be an unspent transaction output spendable by this wallet. It must also not be used by any other masternode. Requires the wallet passphrase to be provide with the [`walletpassphrase` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrase) if the wallet is encrypted. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #6---voting address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_register` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator. The value must be between `0.00` and `100.00`.
**Note**: If non-zero, `ipAndPort` must be zero as well. | + +*Parameter #8---payout address* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---platform node ID* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | -------------------------------------------------- | +| `platformNodeID` | string | Required
(exactly 1) | Platform P2P node ID, derived from P2P public key. | + +*Parameter #10---platform p2p port* + +| Name | Type | Presence | Description | +| ----------------- | ------ | ----------------------- | ------------------------------------------------------------- | +| `platformP2PPort` | number | Required
(exactly 1) | TCP port of Platform HTTP/API interface (network byte order). | + +*Parameter #11---platform p2p port* + +| Name | Type | Presence | Description | +| ----------------- | ------ | ----------------------- | ---------------------------------------------------------------------------------------- | +| `platformP2PPort` | number | Required
(exactly 1) | TCP port of Dash Platform peer-to-peer communication between nodes (network byte order). | + +*Parameter #12---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Parameter #13---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +*Result if `submit` is not set or set to `true`---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider registration transaction (ProRegTx) hash | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx register_evo + 8b2eab3413abb6e04d17d1defe2b71039ba6b6f72ea1e5dab29bb10e7b745948\ +1 2.3.4.5:2345\ +yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ +88d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c5566\ +yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5\ +yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt\ +f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 +``` + +Result: + +```text +61e6d780178d353940c4cb9b3073ac0c50792bbcf0b15c1750d2028b71e34929 +``` + +*Result if `submit` set to `false`---serialized and signed provider registration transaction* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Serialized and signed provider registration transaction (ProRegTx) | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx register_evo\ + 8b2eab3413abb6e04d17d1defe2b71039ba6b6f72ea1e5dab29bb10e7b745948 1\ + 2.3.4.5:2345 yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6\ + 88d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c5566\ + yNLuVTXJbjbxgrQX5LSMi7hV19We8hT2d6 5 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt\ f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 false +``` + +Result: + +```text +0300010001fe1caa50e5b8181be868fbd9fbd93affeb6c4a91a3c73373a6b25d548c7e6d41010000\ +006b48304502210081d206a8332d5b8715ca831155ef5c7e339d33cde2b0b27310b95aafc8c560f9\ +02204029d00d2b5515565321ec1fd6748fa0544b7356d9a389e4d1ce6ab4bb64d364012103c67d86\ +944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9feffffff01a6f0433e0000\ +00001976a9145a375814e9caf5b8575a8221be246457e5c5c28d88ac00000000fd12010100000000\ +006bac3b20d7884b51461a47597f281009a2dbbb9184a746bea8161dc76a6f6eb101000000000000\ +00000000000000ffff0203040509291636e84d02310b0b458f3eb51d8ea8b2e684b7ce8ae227ffcb\ +d4cbdc7ae2fe3e63264701ef6af1de71e6cade51867ecb7ed58b63862568522bab933987d0d043fa\ +5590e11636e84d02310b0b458f3eb51d8ea8b2e684b7cef4011976a914fc136008111fcc7a05be6c\ +ec66f97568727a9e5188acb3ccf680086ae11217236efcccd67b0b72e83c79a043d6c6d064378fdd\ +5f21204120fac89c76d3f116d95a675e112ddbdbb7a78f957506299fe592662acd44b46f262d1c4d\ +47d9401e0a569a5488728e09542d0545ab56f8249a4b21e03445fa411e +``` + +### ProTx Register HPMN + +:::{deprecated} 20.0.0 +The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). +::: + +### ProTx Register Fund Evo + +The `protx register_fund_evo` RPC creates, funds, and sends a ProTx to the network. The resulting transaction will move 4000 Dash to the address specified by `collateralAddress` and will then function as the collateral of your evonode. A few of the limitations you see in the arguments are temporary and might be lifted after DIP3 is fully deployed. Requires the wallet passphrase to be provide with the [`walletpassphrase` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrase) if the wallet is encrypted. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ------------------- | ------ | ----------------------- | ------------------------------------------ | +| `collateralAddress` | string | Required
(exactly 1) | The Dash address to send the collateral to | + +*Parameter #2---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form `IP:PORT`.
Must be unique on the network.
Can be set to `0`, which will require a ProUpServTx afterwards. | + +*Parameter #3---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #4---operator public key register* + +| Name | Type | Presence | Description | +| -------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #5---voting address register* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_register` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #6---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #7---payout address register* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #8---platform node ID* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | -------------------------------------------------- | +| `platformNodeID` | string | Required
(exactly 1) | Platform P2P node ID, derived from P2P public key. | + +*Parameter #9---platform p2p port* + +| Name | Type | Presence | Description | +| ----------------- | ------ | ----------------------- | ---------------------------------------------------------------------------------------- | +| `platformP2PPort` | number | Required
(exactly 1) | TCP port of Dash Platform peer-to-peer communication between nodes (network byte order). | + +*Parameter #10---platform http port* + +| Name | Type | Presence | Description | +| ------------------ | ------ | ----------------------- | ------------------------------------------------------------- | +| `platformHTTPPort` | number | Required
(exactly 1) | TCP port of Platform HTTP/API interface (network byte order). | + +*Parameter #11---fund address* + +| Name | Type | Presence | Description | +| ------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fundAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Parameter #12---whether to submit to the network or not* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | If `true` (default), the resulting transaction is sent to the network. | + +\*Result if `submit` is not set or set to `true` + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------ | +| `result` | string (hex) | Required
(exactly 1) | The transaction ID | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx register_fund_evo yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ + 3.4.5.6:3456 yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw\ + 0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ + yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw 5 yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ + f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 +``` + +Result: + +```text +ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd +``` + +\*Result if `submit` set to `false` + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ----------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | The serialized signed ProTx in hex format | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx register_fund_evo yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ + 3.4.5.6:3456 yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw\ + 0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51\ + yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw 5 yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7\ f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 0 +``` + +Result: + +```text +030001000156701575e76bca5720fa364ea6efc4b713279710dd1b8906797d18bd7048b71a010000\ +006b4830450221009178a387b3d82e3606e6484373508ef1ed4c1d7d98f8a0ca0851687c59edacaa\ +02204d245d20689b5be1100536faaadbb1781e3a67a55e9ecc613adb2a34f419c3cd012103109325\ +a92f9e6d31d2ebd0595d471275ae8d635db2a0c42358f387e1af69c14dfeffffff0200e876481700\ +00001976a9141636e84d02310b0b458f3eb51d8ea8b2e684b7ce88ac8c7a918b300000001976a914\ +372fd07f715c33ce88873a8e758d890e017cf02588ac00000000d101000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000ff\ +ff030405060d8058ebf95961c207ebd525793ccb43f60ce34a5cd50e02146e9c34cfbcb3f3037574\ +a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d5158ebf95961\ +c207ebd525793ccb43f60ce34a5cd5f4011976a9145a375814e9caf5b8575a8221be246457e5c5c2\ +8d88ac45084a0f63d6f06767c941ffd5af4ed17ea0e28afa481e46b2bdbadbd8446c8c00\ +``` + +### ProTx Register Fund HPMN + +:::{deprecated} 20.0.0 +The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). +::: + +### ProTx Register Prepare Evo + +The `protx register_prepare_evo` RPC creates an unsigned ProTx and a message that must be signed externally with the private key that corresponds to `collateralAddress` to prove collateral ownership. The prepared transaction will also contain inputs and outputs to cover fees. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------- | +| `collateralHash` | string (hex) | Required
(exactly 1) | The collateral transaction hash | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | --------------------------------------- | +| `collateralIndex` | string (hex) | Required
(exactly 1) | The collateral transaction output index | + +*Parameter #3---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form 'IP:PORT'.
Must be unique on the network.
Can be set to '0', which will require a ProUpServTx afterwards. | + +*Parameter #4---owner address* + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ownerAddress` | string | Required
(exactly 1) | The Dash address to use for payee updates and proposal voting. The corresponding private key does not have to be known by this wallet. The address must be unused and must differ from the `collateralAddress`. | + +*Parameter #5---operator public key register* + +| Name | Type | Presence | Description | +| ------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `operatorPubKey_register` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. | + +*Parameter #6---voting address register* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_register` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, `ownerAddress` will be used. | + +*Parameter #7---operator reward* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `operatorReward` | number | Required
(exactly 1) | The fraction in % to share with the operator.
The value must be between `0.00` and `100.00`. | + +*Parameter #8---payout address register* + +| Name | Type | Presence | Description | +| ------------------------ | ------ | ----------------------- | ------------------------------------------------------- | +| `payoutAddress_register` | string | Required
(exactly 1) | The Dash address to use for masternode reward payments. | + +*Parameter #9---platform node ID* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | -------------------------------------------------- | +| `platformNodeID` | string (hex) | Required
(exactly 1) | Platform P2P node ID, derived from P2P public key. | + +*Parameter #10---platform p2p port* + +| Name | Type | Presence | Description | +| ----------------- | ------- | ----------------------- | -------------------------------------------------- | +| `platformP2PPort` | numeric | Required
(exactly 1) | Platform P2P node ID, derived from P2P public key. | + +*Parameter #11---platform http port* + +| Name | Type | Presence | Description | +| ------------------ | ------- | ----------------------- | ------------------------------------------------------------- | +| `platformHTTPPort` | numeric | Required
(exactly 1) | TCP port of Platform HTTP/API interface (network byte order). | + +*Parameter #12---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---unsigned transaction and message to sign* + +| Name | Type | Presence | Description | +| ------------------------ | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | JSON object containing an unsigned provider transaction and the message to be signed externally, or JSON `null` if an error occurred | +| →
`tx` | string (hex) | Required
(exactly 1) | The serialized unsigned ProRegTx in hex format | +| →
`collateralAddress` | string | Required
(exactly 1) | The collateral address | +| →
`signMessage` | string (hex) | Required
(exactly 1) | The string message that needs to be signed with the collateral key. | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet protx register_prepare_evo\ + df41e398bb245e973340d434d386f431dbd69735a575721b0b6833856e7d31ec\ + 1 9.8.7.6:9876 yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz\ + 06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280c\ + yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz 1.2 yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt\ + f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 +``` + +Result: + +```json +{ + "tx": "0300010001912b88876fee2f8e43e23b5e81276c163cf23d867bad4148170cb106ef9023700000000000feffffff0125623ba40b0000001976a914736e155c1039a269d4019c66219d2a18f0fee27588ac00000000d1010000000000ec317d6e8533680b1b7275a53597d6db31f486d334d44033975e24bb98e341df0100000000000000000000000000ffff090807062694ca6b243168b30461d1f19e2bb89a965a5bac067e06849865d01e4f73a6d5a025117e48f50b897e14235800501c8bfb8a6365cc8dbf5ddb67a3635d0f1dcc7d46a7ee280cca6b243168b30461d1f19e2bb89a965a5bac067e78001976a914fc136008111fcc7a05be6cec66f97568727a9e5188ace5f6b70ac55411727e25178bd417b9b03f837ad7155d90ad286f3a427203fb9f00", + "collateralAddress": "yWuKWhDzGQqZL8rw6kGxGrfe6P8bUC2S4f", + "signMessage": "yjJJLkYDUN6X8gWjXbCoKEXoiLeKxxMMRt|120|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|yemjhGQ99V5ayJMjoyGGPtxteahii6G1Jz|69a49e18c1253b90d39322f7e2f7af74524401bc33a27645e697e74a214e3e1e" +} +``` + +### ProTx Register Prepare HPMN + +:::{deprecated} 20.0.0 +The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). +::: + +### ProTx Update Service Evo + +The `protx update_service_evo` RPC creates and sends a ProUpServTx to the network. This will update the IP address and the Platform fields of an evonode. If this is done for an evonode that was PoSe-banned, the ProUpServTx will also revive this evonode. + +*Parameter #1---initial provider registration transaction hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------------- | +| `proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Parameter #2---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | -------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form 'IP:PORT'.
Must be unique on the network. | + +*Parameter #3---operator key* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------- | +| `operatorKey` | string (hex) | Required
(exactly 1) | The operator BLS private key associated with the registered operator public key. | + +*Parameter #4---platform Node ID* + +| Name | Type | Presence | Description | +| ---------------- | ------ | ----------------------- | -------------------------------------------------- | +| `platformNodeID` | string | Required
(exactly 1) | Platform P2P node ID, derived from P2P public key. | + +*Parameter #5---platform P2P Port* + +| Name | Type | Presence | Description | +| ----------------- | ------- | ----------------------- | ---------------------------------------------------------------------------------------- | +| `platformP2PPort` | numeric | Required
(exactly 1) | TCP port of Dash Platform peer-to-peer communication between nodes (network byte order). | + +*Parameter #6---platform HTTP Port* + +| Name | Type | Presence | Description | +| ------------------ | ------- | ----------------------- | ------------------------------------------------------------- | +| `platformHTTPPort` | numeric | Required
(exactly 1) | TCP port of Platform HTTP/API interface (network byte order). | + +*Parameter #7---operator payout address* + +| Name | Type | Presence | Description | +| ----------------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPayoutAddress` | string | Optional
(0 or 1) | The Dash address used for operator reward payments. Only allowed when the ProRegTx had a non-zero `operatorReward` value. If set to an empty string, the currently active payout address is reused. | + +*Parameter #8---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `operatorPayoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---provider update service transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Provider update service transaction (ProUpServTx) hash | + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnetprotx update_service_evo\ + ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd\ + 4.3.2.1:4321\ + 4da7e1ea30fb9e55c73ad23df0b9d3d34342acb24facf4b19420e1a26ae272d1\ + f2dbd9b0a1f541a7c44d34a58674d0262f5feca5 22821 22822 +``` + +Result: + +```bash +5b6cfa1bdd3c8b7e0b9550b9c4e809381f81a410bc7f241d3879dd736fd51270 +``` + +### ProTx Update Service HPMN + +:::{deprecated} 20.0.0 +The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). +::: + +### ProTx Register Submit + +The `protx register_submit` RPC combines the unsigned ProTx and a signature of the signMessage, signs all inputs which were added to cover fees and submits the resulting transaction to the network. Note: See [`protx register_prepare`](#protx-register-prepare) for more info about creating a ProTx and a message to sign. + +*Parameter #1---collateral address* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ----------------------------------------------------------------------------------- | +| `tx` | string (hex) | Required
(exactly 1) | The serialized unsigned transaction previously returned by `protx register_prepare` | + +*Parameter #2---collateral index* + +| Name | Type | Presence | Description | +| ----- | --------------- | ----------------------- | ----------------------------------------------------------------------- | +| `sig` | string (base64) | Required
(exactly 1) | The signature signed with the collateral key. Must be in base64 format. | + +*Result---provider registration transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider registration transaction (ProRegTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx register_submit\ + 03000100012d988526d5d1efd32320023c92eff09c2963dcb021b0de9761\ + 17e5e37dc7a7870000000000feffffff015f603ba40b0000001976a9140c\ + 37e07eb5c608961769e6506c23c11e9f9fe00988ac00000000d101000000\ + 00002d988526d5d1efd32320023c92eff09c2963dcb021b0de976117e5e3\ + 7dc7a7870100000000000000000000000000ffff05060708162e243dd366\ + bf4a329968d77eac9fb63481a600938d125e1b7cba03ca2a097e402185e6\ + 160232ea53e6d62898a3be8617b06ff347d967543228bd9b605547c3d478\ + b0a838ca243dd366bf4a329968d77eac9fb63481a600938dc4091976a914\ + e9bf4e6f26fecf1dfc1e04dde43472df378628b888ac6a048e7f645e8adc\ + 305ccfd8652066046a0702596af13b8ac97803ade256da2900\ + \ + H90IvqVtFjZkwLJb08yMEgGixs0/FpcdvwImBcir4cYLJhD3pdX+lKD2GsPl6KNxghVXNk5/HpOdBoWAHo9u++Y= +``` + +Result: + +```text +273ce3ebe24183ee4117b10e054cdbb108a3bde5d2f286129e29480d46a3f573 +``` + +### ProTx Revoke + +The `protx revoke` RPC creates and sends a ProUpRevTx to the network. + +*Parameter #1---initial provider registration transaction hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------------- | +| `proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Parameter #2---operator private key* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ------------------------------------------------------------------------- | +| `operatorKey` | string (hex) | Required
(exactly 1) | The operator private key belonging to the registered operator public key. | + +*Parameter #3---reason* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------- | +| `reason` | number | Optional
(0 or 1) | The reason for revocation. This is informational and does not effect the revocation:
`0` - Reason not specified
`1` - Termination of service
`2` - Compromised keys
`3` - Change of keys | + +*Parameter #4---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---provider update revoke transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ---------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider update revoke transaction (ProUpRevTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx revoke\ + "ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd"\ + "4da7e1ea30fb9e55c73ad23df0b9d3d34342acb24facf4b19420e1a26ae272d1" +``` + +Result: + +```bash +2aad36dd2ab254bee06b0b5dad51e7603691b72058d5806fd94e1d2d19a7c209 +``` + +### ProTx Update Registrar + +:::{attention} +Following the Dash Core v19 hard fork activation, masternodes registered prior to the hard fork must use the [`protx update_registrar_legacy` RPC](#protx-update-registrar-legacy) unless they have already updated to a basic scheme BLS key. +::: + +The `protx update_registrar` RPC creates and sends a ProUpRegTx to the network. + +*Parameter #1---initial provider registration transaction hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------------- | +| `proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Parameter #2---operator public key* + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPubKey` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. If set to an empty string, the currently active operator BLS public key is reused. | + +*Parameter #3---voting address* + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress` | string | Required
(exactly 1) | The voting address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, the currently active voting key address is reused. | + +*Parameter #4---operator payout address* + +| Name | Type | Presence | Description | +| --------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `payoutAddress` | string | Optional
(0 or 1) | The Dash address to use for masternode reward payments. If set to an empty string, the currently active payout address is reused. | + +*Parameter #5---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `payoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---provider update registrar transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------- | +| `result` | string (hex) | Required
(exactly 1) | Provider update registrar transaction (ProUpRegTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx update_registrar\ + "ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd"\ + "0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51"\ + "yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw" "yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7" +``` + +Result: + +```bash +702390ef06b10c174841ad7b863df23c166c27815e3be2438e2fee6f87882b91 +``` + +### ProTx Update Registrar Legacy + +:::{note} +Since the v19 hard fork activation, this command must be used if a legacy scheme BLS key is being used to registrar update a masternode. This would include all masternodes registered prior to the hard fork that have not already updated to a new basic scheme BLS key. +::: + +The `protx update_registrar_legacy` RPC creates and sends a ProUpRegTx to the network. This will update the operator key, voting key and payout address of the masternode specified by `proTxHash`. The owner key of the masternode must be known to your wallet. Requires the wallet passphrase to be provide with the [`walletpassphrase` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrase) if the wallet is encrypted. + +*Parameter #1---initial provider registration transaction hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------------- | +| `proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Parameter #2---operator public key* + +| Name | Type | Presence | Description | +| ----------------------- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPubKey_update` | string (hex) | Required
(exactly 1) | The operator public key. The private key does not have to be known. It has to match the private key which is later used when operating the masternode. If set to an empty string, the currently active operator BLS public key is reused. | + +*Parameter #3---voting address* + +| Name | Type | Presence | Description | +| ---------------------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `votingAddress_update` | string | Required
(exactly 1) | The voting key address. The private key does not have to be known by your wallet. It has to match the private key which is later used when voting on proposals. If set to an empty string, the currently active voting key address is reused. | + +*Parameter #4---operator payout address* + +| Name | Type | Presence | Description | +| ---------------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `payoutAddress_update` | string | Optional
(0 or 1) | The Dash address to use for masternode reward payments. If set to an empty string, the currently active payout address is reused. | + +*Parameter #5---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund ProTx. If not specified, payoutAddress is the one that is going to be used. The private key belonging to this address must be known in your wallet. | + +*Result---provide transaction ID* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ---------------------- | +| `result` | string (hex) | Required
(exactly 1) | Receive transaction ID | + +*Example from Dash Core 19.0.0* + +```bash +dash-cli -testnet protx update_registrar_legacy\ + "ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd"\ + "0e02146e9c34cfbcb3f3037574a1abb35525e2ca0c3c6901dbf82ac591e30218d1711223b7ca956edf39f3d984d06d51"\ + "yX2cDS4kcJ4LK4uq9Hd4TG7kURV3sGLZrw" "yakx4mMRptKhgfjedNzX5FGQq7kSSBF2e7" +``` + +Result: + +```bash +702390ef06b10c174841ad7b863df23c166c27815e3be2438e2fee6f87882b91 +``` + +### ProTx Update Service + +The `protx update_service` RPC creates and sends a ProUpServTx to the network. + +*Parameter #1---initial provider registration transaction hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------------- | +| `proTxHash` | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Parameter #2---IP Address and port* + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | -------------------------------------------------------------------- | +| `ipAndPort` | string | Required
(exactly 1) | IP and port in the form 'IP:PORT'.
Must be unique on the network. | + +*Parameter #3---operator key* + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------- | +| `operatorKey` | string (hex) | Required
(exactly 1) | The operator BLS private key associated with the registered operator public key. | + +*Parameter #4---operator payout address* + +| Name | Type | Presence | Description | +| ----------------------- | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `operatorPayoutAddress` | string | Optional
(0 or 1) | The Dash address used for operator reward payments. Only allowed when the ProRegTx had a non-zero `operatorReward` value. If set to an empty string, the currently active payout address is reused. | + +*Parameter #5---fee source address* + +| Name | Type | Presence | Description | +| ------------------ | ------ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feeSourceAddress` | string | Optional
(0 or 1) | If specified, the wallet will only use coins from this address to fund the ProTx. If not specified, `operatorPayoutAddress` will be used. The private key belonging to this address must be known in your wallet. | + +*Result---provider update service transaction hash* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | Provider update service transaction (ProUpServTx) hash | + +*Example from Dash Core 0.13.0* + +```bash +dash-cli -testnet protx update_service\ + ba1b3330e16a0876b7a186e7ceb689f03ec646e611e91d7139de021bbf13afdd\ + "4.3.2.1:4321"\ + 4da7e1ea30fb9e55c73ad23df0b9d3d34342acb24facf4b19420e1a26ae272d1 +``` + +Result: + +```bash +5b6cfa1bdd3c8b7e0b9550b9c4e809381f81a410bc7f241d3879dd736fd51270 +``` + +## Quorum + +*Added in Dash Core 0.14.0* + +The [`quorum` RPC](../api/remote-procedure-calls-evo.md#quorum) provides a set of commands for quorums (LLMQs). + +### Quorum List + +The `quorum list` RPC displays a list of on-chain quorums. + +*Parameter #1---quorum count* + +| Name | Type | Presence | Description | +| ------- | ------ | -------------------- | -------------------------------------------------------------------------------- | +| `count` | number | Optional
(0 or 1) | Number of quorums to list. Will list active quorums if `count` is not specified. | + +*Result---a list of quorums* + +| Name | Type | Presence | Description | +| ------------------ | ------------ | ----------------------- | ----------------------- | +| `result` | object | Required
(exactly 1) | Quorum list | +| →
Quorum | array | Required
(1 or more) | Array of quorum details | +| → →
Quorum Hash | string (hex) | Optional
(0 or more) | A quorum hash | + +*Example from Dash Core 0.14.0* + +```bash +dash-cli -testnet quorum list +``` + +Result: + +```json +{ + "llmq_50_60": [ + "00000000023cc6dde69bed898c83fe2328ef38b1ea9da14a599efa14caef0b7d", + "000000002b968fb3b2fc2ff18d6e89611e366b4d38a6d0437e99bd7c37f2fd83", + "000000000301054c038b07b5b51493d5efc3f078e3aede6eb603c47943d1cc78", + "000000000e901278c00c896754a06f8d45d0268c6aff6e72ffb3007d07c10e73", + "000000001bc592f2a8676203835bc6ad442abeadb9c22b8d6a2999db07354b01", + "000000000896c37ef8a32318ee871589394f1578473b8825275b610690e47db0", + "00000000133b192b2319a0716ad18e5788981fff51856f61205af5d6a634ba41", + "0000000004946f3f9f82a298985f73080d62627d51f6f4ba77f3cd8c6788b3d0", + "0000000005cb014d3df9bac0ba379f1d5b8b75f0e6d7c408d43ac1db330ec641", + "0000000006c1653c7ee747f140dd7daa1da23a541e67a0fc0dc88db3482ec4d5" + ], + "llmq_400_60": [ + "0000000007697fd69a799bfa26576a177e817bc0e45b9fcfbf48b362b05aeff2" + ], + "llmq_400_85": [ + ] +} +``` + +### Quorum Info + +The `quorum info` RPC returns information about a specific quorum. + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorums](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) to list:
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---quorum hash* + +| Name | Type | Presence | Description | +| ------------ | ------------ | ----------------------- | ---------------------------- | +| `quorumHash` | string (hex) | Required
(exactly 1) | The block hash of the quorum | + +*Parameter #3---secret key share* + +| Name | Type | Presence | Description | +| ---------------- | ---- | -------------------- | ----------------------------------------------- | +| `includeSkShare` | bool | Optional
(0 or 1) | Include the secret key share (default: `false`) | + +*Result---information about a quorum* + +| Name | Type | Presence | Description | +| ------------------------------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Quorum list | +| →
`height` | number | Required
(exactly 1) | Block height of the quorum | +| →
`type` | string | Required
(exactly 1) | Type of LLMQ | +| →
`quorumHash` | string (hex) | Required
(exactly 1) | The hash of the quorum | +| →
`quorumIndex` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The index of the quorum | +| →
`minedBlock` | string (hex) | Required
(exactly 1) | The hash of the block that established the quorum | +| →
`previousConsecutiveDKGFailures` | number | Optional
(0 or 1) | **Added in Dash Core 19.0**
The number of previous consecutive DKG failures for the corresponding `quorumIndex` before the currently active one. Only present for rotating quorums. | +| →
`members` | array | Required
(exactly 1) | An array containing quorum member details | +| → →
Member | object | Required
(1 or more) | An object describing a particular member | +| → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The masternode's Provider Registration transaction hash | +| → → →
`service` | string | Required
(exactly 1) | *Added in Dash Core 18.1.0*
The masternode's IP:Port | +| → → →
`pubKeyOperator` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.15.0*
The masternode's Operator public key | +| → → →
`valid` | bool | Required
(exactly 1) | Indicates if the member is valid | +| → → →
`pubKeyShare` | string | Optional
(0 or 1) | Member public key share | +| →
`quorumPublicKey` | string | Required
(exactly 1) | Quorum public key | +| →
`secretKeyShare` | string | Optional
(exactly 1) | Quorum secret key share | + +*Example from Dash Core 18.1.0* + +```bash +dash-cli -testnet quorum info 1 \ + 000000ebd10368ca387ce380539fad9c8ba21108a3bfd6fedeecb60d28f56ae9 true +``` + +Result (truncated): + +```json +{ + "height": 819240, + "type": "llmq_50_60", + "quorumHash": "000000ebd10368ca387ce380539fad9c8ba21108a3bfd6fedeecb60d28f56ae9", + "quorumIndex": 0, + "minedBlock": "00000548588369399691ad308a3c588a7bf842a40347e23ef40655e315898146", + "members": [ + { + "proTxHash": "f77ec12ec8adb91a3a158c5f9cc3f7e2521d65eac6cda1e44763daa603a77570", + "service": "35.89.202.171:19999", + "pubKeyOperator": "16f8048e511e7c0c2b495a9b20030b315d75bca283b70af25d16c8809c7f2a786225c2fe47ff1c92aa8ebf586be91abc", + "valid": true, + "pubKeyShare": "12c305fdc5ec06785d2e89a8b64c291128e4a2034889e9f1539d9194954051a304d8bf1649a2d3a95aac200884e8e99d" + }, + {"Truncated data":"..."}, + { + "proTxHash": "2cd3833e1cef622e875096c70d6eb6c7083a250a6b26ca27edb3aa21ac05e3d1", + "service": "89.47.162.137:19999", + "pubKeyOperator": "8fc1d0cea417ed963e50d876a38bf0846b536b7e8809826e163bc9ea0f749ea8ebe00c6642e71bb84000549bda5bb1d0", + "valid": true, + "pubKeyShare": "8662927148ed33b8f0000f1666c277e14df9838c9dce4e3fb273866603b93502e70108408f81698e0b47cb3b5aff3a30" + } + ], + "quorumPublicKey": "18401a5c5d8d8145cea2843e0c37f10d06de642ce7665599ad35dce9f7a3027b42375a9e138e185867bfe5359fd952f2", + "secretKeyShare": "4d39c4c1cb856a5e2d96efffb4cf3695b57b5d0fb4e289e7b2be3b7592a6dfa6" +} +``` + +### Quorum DKGInfo + +:::{versionadded} 20.1.0 +::: + +The `quorum dkginfo` RPC returns information about active and upcoming DKG sessions. + +*Parameters: none* + +*Result---information about DKG* + +| Name | Type | Presence | Description | +| ------------------------------------- | ------------ | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | Quorum info | +| →
`active_dkgs` | number | Required
(exactly 1) | Total number of active DKG sessions this node is participating in currently +| →
`next_dkg` | number | Required
(exactly 1) | The number of blocks until the next potential DKG session | + +*Example from Dash Core 20.1.0* + +```bash +dash-cli -testnet quorum dkginfo +``` + +Result (truncated): + +```json +{ + "active_dkgs": 0, + "next_dkg": 10 +} +``` + +### Quorum DKGStatus + +The `quorum list` RPC displays the status of the current DKG process. + +*Parameter #1---detail level* + +| Name | Type | Presence | Description | +| -------------- | ------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `detail_level` | number | Optional
(0 or 1) | Detail level of output (default: 0):
`0` - Only show counts (*default*)
`1` - Show member indexes
`2` - Show member's ProTxHashes

*Note: Works only when Spork 17 is enabled and only displays details related to the node running the command.* | + +*Result (if detail level was 0 or omitted)---JSON DKG details* + +| Name | Type | Presence | Description | +| ----------------------------------------- | ---------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | array | Required
(exactly 1) | An array of objects each containing a provider transaction, or JSON `null` if an error occurred | +| →
`time` | number | Required
(exactly 1) | The Unix epoch time | +| →
`timeStr` | string | Required
(exactly 1) | The UTC time as a string | +| →
`session` | array of objects | Required
(exactly 1) | Array of objects containing DKG Session information | +| → →
Session | object | Required
(exactly 1) | DKG session object | +| → → →
`llmqType` | string | Required
(exactly 1) | *Added in Dash Core 18.0.0*
[Quorum type name](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) | +| → → →
`quorumIndex` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The index of the quorum | +| → → →
`status` | object | Required
(exactly 1) | DKG session status information | +| → → → →
`llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | +| → → → →
`quorumHash` | string (hex) | Required
(exactly 1) | The block hash of the quorum | +| → → → →
`quorumHeight` | number | Required
(exactly 1) | The block height of the quorum | +| → → → →
`phase` | number | Required
(exactly 1) | The active DKG phase
`1` - Initialized
`2` - Contributing
`3` - Complaining
`4` - Justifying
`5` - Committing
`6` - Finalizing | +| → → → →
`sentContributions` | bool | Required
(exactly 1) | True when contributions have been sent | +| → → → →
`sentComplaint` | bool | Required
(exactly 1) | True when complaints have been sent | +| → → → →
`sentJustification` | bool | Required
(exactly 1) | True when justifications have been sent | +| → → → →
`sentPrematureCommitment` | bool | Required
(exactly 1) | True when premature commitments have been sent | +| → → → →
`aborted` | bool | Required
(exactly 1) | True if the DKG session has been aborted | +| → → → →
`badMembers` | number | Required
(exactly 1) | Number of bad members | +| → → → →
`weComplain` | number | Required
(exactly 1) | Number of complaints sent | +| → → → →
`receivedContributions` | number | Required
(exactly 1) | Number of contributions received | +| → → → →
`receivedComplaints` | number | Required
(exactly 1) | Number of complaints received | +| → → → →
`receivedJustifications` | number | Required
(exactly 1) | Number of justifications received | +| → → → →
`receivedPrematureCommitments` | number | Required
(exactly 1) | Number of premature commitments received | +| →
`quorumConnections` | array of objects | Required
(exactly 1) | **Modified in Dash Core 18.0.0**
Array of objects containing quorum connection information | +| → →
Quorum type | object | Required
(exactly 1) | *Added in Dash Core 18.0.0*
An object describing connection information for a quorum index and type | +| → → →
`llmqType` | string | Required
(exactly 1) | *Added in Dash Core 18.0.0*
[Quorum type name](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) | +| → → →
`quorumIndex` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The index of the quorum | +| → → →
`pQuorumBaseBlockIndex` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The height of the quorum's base block | +| → → →
`quorumHash` | string (hex) | Required
(exactly 1) | The block hash of the quorum | +| → → →
`pindexTip` | number | Required
(exactly 1) | *Added in Dash Core 18.0.0*
The height of the quorum's index tip | +| → → →
`quorumConnections` | array of objects | Required
(exactly 1) | Array of objects containing quorum connection information | +| → → → →
Connection | object | Required
(exactly 1) | *Added in Dash Core 0.16.0*

An object describing a quorum connection | +| → → → →→
`proTxHash` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.16.0*

The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → → →→
`connected` | boolean | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Whether or not the connection is active | +| → → → →→
`address` | string | Optional
(exactly 1) | *Added in Dash Core 0.16.0*

Address | +| → → → →→
`outbound` | boolean | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Whether or not this is an outbound connection | +| →
`minableCommitments` | object | Required
(exactly 1) | Object containing minable commitments | + +*Result (if detail level was 1)---JSON DKG details including member index* + +Note: detail level 1 includes all level 0 fields and expands the following fields. + +| Name | Type | Presence | Description | +| --------------------------------------- | ----- | ----------------------- | ----------------------------------------------------------------- | +| → → →
`badMembers` | array | Required
(exactly 1) | Array containing the member index for each bad member | +| → → →
`weComplain` | array | Required
(exactly 1) | Array containing the member index for each complaint sent | +| → → →
`receivedContributions` | array | Required
(exactly 1) | Array containing the member index for each contribution received | +| → → →
`receivedComplaints` | array | Required
(exactly 1) | Array containing the member index for each complaint received | +| → → →
`receivedJustifications` | array | Required
(exactly 1) | Array containing the member index for each justification received | +| → → →
`receivedPrematureCommitments` | array | Required
(exactly 1) | Array containing the member index for each commitment received | + +*Result (if detail level was 2)---JSON DKG details including member index and ProTx hash* + +Note: detail level 2 includes all level 0 fields, adds the `allMembers` field, and expands several fields. + +| Name | Type | Presence | Description | +| --------------------------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| → → →
`badMembers` | array | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a bad member | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`weComplain` | object | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a member being complained about | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`receivedContributions` | object | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a member a contribution was received from | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`receivedComplaints` | object | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a member a complaint was received from | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`receivedJustifications` | object | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a member a justification was received from | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`receivedPrematureCommitments` | object | Required
(exactly 1) | An array of objects with each object containing the member index and ProTx hash for a member a premature commitment was received from | +| → → → →
Member | object | Required
(0 or more) | An object describing quorum member details | +| → → → → →
`memberIndex` | number | Required
(exactly 1) | The quorum member's index | +| → → → → →
`proTxHash` | string (hex) | Required
(exactly 1) | The hash of the quorum member's provider registration transaction as hex in RPC byte order | +| → → →
`allMembers` | array | Required
(exactly 1) | Array containing the provider registration transaction hash for all quorum members | + +*Example from Dash Core 18.0.0* + +```bash +dash-cli -testnet quorum dkgstatus +``` + +Result (truncated): + +```json +{ + "time": 1644854935, + "timeStr": "2022-02-14T16:08:55Z", + "session": [ + { + "llmqType": "llmq_devnet", + "quorumIndex": 0, + "status": { + "llmqType": 101, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumHeight": 6072, + "phase": 6, + "sentContributions": true, + "sentComplaint": false, + "sentJustification": false, + "sentPrematureCommitment": true, + "aborted": false, + "badMembers": 0, + "weComplain": 0, + "receivedContributions": 12, + "receivedComplaints": 0, + "receivedJustifications": 0, + "receivedPrematureCommitments": 12 + } + } + ], + "quorumConnections": [ + { + "llmqType": "llmq_50_60", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_400_60", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6048, + "quorumHash": "0000000a428025892b1d62bd27b0bf8eee521218d12f9a459a7bde20a944a3bc", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_100_67", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_devnet", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "ec4ca45ccce7d7f94ab824a9f4840c3a85731c8bc70ba21953992009214c7e1d", + "connected": true, + "address": "34.219.73.212:49030", + "outbound": false + }, + { + "proTxHash": "895cb52efac54f92ed726ad9da15fd6a8c94fcabae2f9c41ad81be0c214e0d1e", + "connected": true, + "address": "35.88.228.131:46084", + "outbound": false + }, + ] + }, + { + "llmqType": "llmq_devnet", + "quorumIndex": 1, + "pQuorumBaseBlockIndex": 6073, + "quorumHash": "000000b1823c0d77dcfbd6a11404ddbcfc259a503aec9a7aadfdfabc7602a7be", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "93b2f08a18d9ac165aad16d66d8492721f4556e53d3a2d28b045cc992ce65725", + "connected": true, + "address": "54.191.24.26:38528", + "outbound": false + }, + ] + } + ], + "minableCommitments": [ + { + "version": 1, + "llmqType": 1, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "version": 1, + "llmqType": 4, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ] +} +``` + +*Example from Dash Core 18.0.0 (detail_level: 1)* + +```bash +dash-cli -testnet quorum dkgstatus 1 +``` + +Result (truncated): + +```json +{ + "time": 1644854935, + "timeStr": "2022-02-14T16:08:55Z", + "session": [ + { + "llmqType": "llmq_devnet", + "quorumIndex": 0, + "status": { + "llmqType": 101, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumHeight": 6072, + "phase": 6, + "sentContributions": true, + "sentComplaint": false, + "sentJustification": false, + "sentPrematureCommitment": true, + "aborted": false, + "badMembers": [ + ], + "weComplain": [ + ], + "receivedContributions": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "receivedComplaints": [ + ], + "receivedJustifications": [ + ], + "receivedPrematureCommitments": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + } + } + ], + "quorumConnections": [ + { + "llmqType": "llmq_50_60", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_100_67", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, +], + "minableCommitments": [ + { + "version": 1, + "llmqType": 1, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "version": 1, + "llmqType": 4, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ] +} + +``` + +*Example from Dash Core 18.0.0 (detail_level: 2)* + +```bash +dash-cli -testnet quorum dkgstatus 2 +``` + +Result (truncated): + +```json +{ + "time": 1644854935, + "timeStr": "2022-02-14T16:08:55Z", + "session": [ + { + "llmqType": "llmq_devnet", + "quorumIndex": 0, + "status": { + "llmqType": 101, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumHeight": 6072, + "phase": 6, + "sentContributions": true, + "sentComplaint": false, + "sentJustification": false, + "sentPrematureCommitment": true, + "aborted": false, + "badMembers": [ + ], + "weComplain": [ + ], + "receivedContributions": [ + { + "memberIndex": 0, + "proTxHash": "6503cd51fd93d0923eaee599b8f48dceb639b0f1a7e5dfd064d439c9729e1b48" + }, + { + "memberIndex": 1, + "proTxHash": "f9bf9e69ef111ca5218804f004c5e31abd971699847f52364e88301559cab6f8" + }, + { + "memberIndex": 2, + "proTxHash": "895cb52efac54f92ed726ad9da15fd6a8c94fcabae2f9c41ad81be0c214e0d1e" + }, + { + "memberIndex": 3, + "proTxHash": "fd1fe03e178b397baa304fdcb98c7e99b6d39768029490270e17b53f4fef7aa3" + }, + { + "memberIndex": 4, + "proTxHash": "ec4ca45ccce7d7f94ab824a9f4840c3a85731c8bc70ba21953992009214c7e1d" + }, + { + "memberIndex": 5, + "proTxHash": "9c3173a86ef146920ad37f3b0c4f9be0f08063c1d194aaa9602d766a5de782a9" + }, + { + "memberIndex": 6, + "proTxHash": "856c3dd446c0791e800aa24f6a726431a0d4df6ed3cfb3a71b1bf3951764cbf3" + }, + { + "memberIndex": 7, + "proTxHash": "38e2e295b4ed4f2d93731951537fd2fa31bee87833b61443a6961117a0c970a8" + }, + { + "memberIndex": 8, + "proTxHash": "e76cdb5c9e004fb9bf83bfcebf7bf59bcbe925a1d348d3e5cfb108910e45d0d1" + }, + { + "memberIndex": 9, + "proTxHash": "8abb1f227473e188d0e3ff39201badd49d22f8b323f9cfdd096d109f50614b6c" + }, + { + "memberIndex": 10, + "proTxHash": "8675ed9f95526868ce4cf88ffe5a26ccff90b7623516735219c6e16731e4288a" + }, + { + "memberIndex": 11, + "proTxHash": "e657b9abffe8326c25236ccfb28408617d3f5c3704d703edc1271db37db62b5d" + } + ], + "receivedComplaints": [ + ], + "receivedJustifications": [ + ], + "receivedPrematureCommitments": [ + { + "memberIndex": 0, + "proTxHash": "6503cd51fd93d0923eaee599b8f48dceb639b0f1a7e5dfd064d439c9729e1b48" + }, + { + "memberIndex": 1, + "proTxHash": "f9bf9e69ef111ca5218804f004c5e31abd971699847f52364e88301559cab6f8" + }, + { + "memberIndex": 2, + "proTxHash": "895cb52efac54f92ed726ad9da15fd6a8c94fcabae2f9c41ad81be0c214e0d1e" + }, + { + "memberIndex": 3, + "proTxHash": "fd1fe03e178b397baa304fdcb98c7e99b6d39768029490270e17b53f4fef7aa3" + }, + { + "memberIndex": 4, + "proTxHash": "ec4ca45ccce7d7f94ab824a9f4840c3a85731c8bc70ba21953992009214c7e1d" + }, + { + "memberIndex": 5, + "proTxHash": "9c3173a86ef146920ad37f3b0c4f9be0f08063c1d194aaa9602d766a5de782a9" + }, + { + "memberIndex": 6, + "proTxHash": "856c3dd446c0791e800aa24f6a726431a0d4df6ed3cfb3a71b1bf3951764cbf3" + }, + { + "memberIndex": 7, + "proTxHash": "38e2e295b4ed4f2d93731951537fd2fa31bee87833b61443a6961117a0c970a8" + }, + { + "memberIndex": 8, + "proTxHash": "e76cdb5c9e004fb9bf83bfcebf7bf59bcbe925a1d348d3e5cfb108910e45d0d1" + }, + { + "memberIndex": 9, + "proTxHash": "8abb1f227473e188d0e3ff39201badd49d22f8b323f9cfdd096d109f50614b6c" + }, + { + "memberIndex": 10, + "proTxHash": "8675ed9f95526868ce4cf88ffe5a26ccff90b7623516735219c6e16731e4288a" + }, + { + "memberIndex": 11, + "proTxHash": "e657b9abffe8326c25236ccfb28408617d3f5c3704d703edc1271db37db62b5d" + } + ], + "allMembers": [ + "6503cd51fd93d0923eaee599b8f48dceb639b0f1a7e5dfd064d439c9729e1b48", + "f9bf9e69ef111ca5218804f004c5e31abd971699847f52364e88301559cab6f8", + "895cb52efac54f92ed726ad9da15fd6a8c94fcabae2f9c41ad81be0c214e0d1e", + "fd1fe03e178b397baa304fdcb98c7e99b6d39768029490270e17b53f4fef7aa3", + "ec4ca45ccce7d7f94ab824a9f4840c3a85731c8bc70ba21953992009214c7e1d", + "9c3173a86ef146920ad37f3b0c4f9be0f08063c1d194aaa9602d766a5de782a9", + "856c3dd446c0791e800aa24f6a726431a0d4df6ed3cfb3a71b1bf3951764cbf3", + "38e2e295b4ed4f2d93731951537fd2fa31bee87833b61443a6961117a0c970a8", + "e76cdb5c9e004fb9bf83bfcebf7bf59bcbe925a1d348d3e5cfb108910e45d0d1", + "8abb1f227473e188d0e3ff39201badd49d22f8b323f9cfdd096d109f50614b6c", + "8675ed9f95526868ce4cf88ffe5a26ccff90b7623516735219c6e16731e4288a", + "e657b9abffe8326c25236ccfb28408617d3f5c3704d703edc1271db37db62b5d" + ] + } + } + ], + "quorumConnections": [ + { + "llmqType": "llmq_50_60", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_100_67", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "e3a1bc7820e24820ab557c7dc7650b5a6ec326adac9599f42ed981e4227bdc0e", + "connected": true, + "address": "54.187.0.112:20001", + "outbound": true + }, + ] + }, + { + "llmqType": "llmq_devnet", + "quorumIndex": 0, + "pQuorumBaseBlockIndex": 6072, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "ec4ca45ccce7d7f94ab824a9f4840c3a85731c8bc70ba21953992009214c7e1d", + "connected": true, + "address": "34.219.73.212:49030", + "outbound": false + }, + { + "proTxHash": "895cb52efac54f92ed726ad9da15fd6a8c94fcabae2f9c41ad81be0c214e0d1e", + "connected": true, + "address": "35.88.228.131:46084", + "outbound": false + }, + ] + }, + { + "llmqType": "llmq_devnet", + "quorumIndex": 1, + "pQuorumBaseBlockIndex": 6073, + "quorumHash": "000000b1823c0d77dcfbd6a11404ddbcfc259a503aec9a7aadfdfabc7602a7be", + "pindexTip": 6082, + "quorumConnections": [ + { + "proTxHash": "bfcfc61bb222d4744276a3591df2239c540da36f4638ce234a4490ac35254607", + "connected": true, + "address": "54.68.152.187:54748", + "outbound": false + }, + { + "proTxHash": "93b2f08a18d9ac165aad16d66d8492721f4556e53d3a2d28b045cc992ce65725", + "connected": true, + "address": "54.191.24.26:38528", + "outbound": false + }, + ] + } + ], + "minableCommitments": [ + { + "version": 1, + "llmqType": 1, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "version": 1, + "llmqType": 4, + "quorumHash": "0000003d2100d243f73bd65b392f21a1023f7dfecc54505511c897a5896c0c2c", + "quorumIndex": 0, + "signersCount": 0, + "signers": "00000000000000000000000000", + "validMembersCount": 0, + "validMembers": "00000000000000000000000000", + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", + "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ] +} +``` + +### Quorum Sign + +The `quorum sign` RPC requests threshold-signing for a message. + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID. Signing request ids for ChainLocks and InstantSend are calculated as described in:
\* The [ChainLocks DIP](https://github.com/dashpay/dips/blob/master/dip-0008.md#signing-attempts)
\* The [LLMQ InstantSend DIP](https://github.com/dashpay/dips/blob/master/dip-0010.md#finalization-and-creation-of-islock-messages). | + +:::{note} +For general signing requests, any 32 byte hex string can be provided as the request id. Note that if a quorum hash is not specified in parameter 4, a quorum will be selected automatically based in part on this value. +::: + +*Parameter #3---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Parameter #4---quorum hash* + +| Name | Type | Presence | Description | +| ------------ | ------------ | -------------------- | --------------------- | +| `quorumHash` | string (hex) | Optional
(0 or 1) | The quorum identifier | + +*Parameter #5---submit* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `submit` | bool | Optional
(0 or 1) | *Added in Dash Core 0.17.0*

Submits the signature share to the network if this is `true` (default). Returns an object containing the signature share if this is `false`. | + +*Result---(if submit = `true`) status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ---------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on success | + +*Result---(if submit = `false`) signature share JSON object* + +| Name | Type | Presence | Description | +| ------------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| result | object | Required
(exactly 1) | JSON object containing signature share details | +| →
`llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | +| →
`quorumHash` | string (hex) | Required
(exactly 1) | The quorum identifier | +| →
`quorumMember` | number | Required
(exactly 1) | Which quorum member created this signature share | +| →
`id` | string (hex) | Required
(exactly 1) | Signing request ID | +| →
`msgHash` | string (hex) | Required
(exactly 1) | Hash of the message that was signed | +| →
`signHash` | string (hex) | Required
(exactly 1) | Hash of `llmqType`, `quorumHash`, `id`, and `msgHash` | +| →
`signature` | string (hex) | Required
(exactly 1) | Signature share | + +*Example from Dash Core 0.17.0* + +Submit signature share to network (default): + +```bash +dash-cli -testnet quorum sign 1 \ + "abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234" \ + "51c11d287dfa85aef3eebb5420834c8e443e01d15c0b0a8e397d67e2e51aa239" +``` + +Result: + +```json +false +``` + +Return signature share object: + +```bash +dash-cli -testnet quorum sign 100 \ + "0000000000000000000000000000000000000000000000000000000000000001" \ + "0000000000000000000000000000000000000000000000000000000000000002" \ + "53d959f609a654cf4e5e3c083fd6c47b7ec6cb73af4ac7329149688337b8ef9a" false +``` + +Result: + +```json +{ + "llmqType": 100, + "quorumHash": "53d959f609a654cf4e5e3c083fd6c47b7ec6cb73af4ac7329149688337b8ef9a", + "quorumMember": 2, + "id": "0000000000000000000000000000000000000000000000000000000000000001", + "msgHash": "0000000000000000000000000000000000000000000000000000000000000002", + "signHash": "39458221939396a45a2e348caada646eabd52849990827d40e33eb1399097b3c", + "signature": "9716545a0c28ff70900a71fabbadf3c13e4ae562032122902405365f1ebf3da813c8a97d765eb8b167ff339c1638550c13822217cf06b609ba6a78f0035684ca7b4afdb7146ce74a30cfb6770f852aade8c27ffec67c79f85be31964573fb51c" +} +``` + +### Quorum GetRecSig + +The `quorum getrecsig` RPC gets the recovered signature for a previous threshold-signing message request. + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ------------------ | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #3---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Result---recovered signature* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| result | bool | Required
(exactly 1) | Recovered signature details | +| →
`llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | +| →
`quorumHash` | string (hex) | Required
(exactly 1) | The block hash of the quorum | +| →
`id` | string (hex) | Required
(exactly 1) | The signing session ID | +| →
`msgHash` | string (hex) | Required
(exactly 1) | The message hash | +| →
`sig` | string (hex) | Required
(exactly 1) | The recovered signature | +| →
`hash` | string (hex) | Required
(exactly 1) | The hash of the recovered signature | + +*Example from Dash Core 0.14.0* + +```bash +dash-cli -testnet quorum getrecsig 1 \ + "e980ebf295b42f24b03321ffb255818753b2b211e8c46b61c0b6fde91242d12f" \ + "907087d4720850e639b7b5cc41d7a6d020e5a50debb3bc3974f0cb3d7d378ea4" +``` + +Result: + +```json +{ + "llmqType": 1, + "quorumHash": "00000000008344da08e4d262773ea545472fbf625f78b3ebfe5fc067c33b1d22", + "id": "e980ebf295b42f24b03321ffb255818753b2b211e8c46b61c0b6fde91242d12f", + "msgHash": "907087d4720850e639b7b5cc41d7a6d020e5a50debb3bc3974f0cb3d7d378ea4", + "sig": "1365171c408d686af2ca8f5fae91cdf9cf0b5eec60b0b161b9288a1c68e2cd68f225495a787415c924c5953a6282d131178aa6baf4c2673d19549fc627740cf71d295f8a38b9970525a7f248d54a548e16da285b5c1f3ec0740ad40edbcc8615", + "hash": "d9b7f7904746fbb3eeaeec36fadc79b351f6a854cd22ee9e607592aee972fcb2" +} +``` + +### Quorum HasRecSig + +The `quorum hasrecsig` RPC checks for a recovered signature for a previous threshold-signing message request. + +:::{note} +Used for testing on the RegTest network only. +::: + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ------------------ | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #3---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Result---status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ---------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on success | + +*Example from Dash Core 0.14.0* + +```bash +dash-cli -testnet quorum hasrecsig 1 \ + "e980ebf295b42f24b03321ffb255818753b2b211e8c46b61c0b6fde91242d12f" \ + "907087d4720850e639b7b5cc41d7a6d020e5a50debb3bc3974f0cb3d7d378ea4" +``` + +Result: + +```text +true +``` + +### Quorum IsConflicting + +The `quorum isconflicting` RPC checks if there is a conflict for a threshold-signing message request. + +:::{note} +Used for testing on the RegTest network only. +::: + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ------------------ | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #3---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Result---status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ---------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on success | + +*Example from Dash Core 0.14.0* + +```bash +dash-cli -testnet quorum isconflicting 1 \ + "e980ebf295b42f24b03321ffb255818753b2b211e8c46b61c0b6fde91242d12f" \ + "907087d4720850e639b7b5cc41d7a6d020e5a50debb3bc3974f0cb3d7d378ea4" +``` + +Result: + +```text +false +``` + +### Quorum MemberOf + +The [`quorum` RPC](../api/remote-procedure-calls-evo.md#quorum) checks which quorums the given masternode is a member of. + +*Parameter #1---proTxHash* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ---------------------------- | +| proTxHash | string | Required
(exactly 1) | ProTxHash of the masternode. | + +*Parameter #2---scanQuorumsCount* + +| Name | Type | Presence | Description | +| ---------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------- | +| scanQuorumsCount | number | Optional | Number of quorums to scan for. If not specified, the active quorum count for each specific quorum type is used. | + +*Result---list of quorums the masternode is a member of* + +| Name | Type | Presence | Description | +| ------------------------ | ---------------- | ----------------------- | -------------------------------------------------------------------------------------------- | +| `result` | Array of objects | Required
(exactly 1) | Array containing info for quorum's the masternode belongs to | +| →
Quorum | object | Required
(0 or more) | An object describing quorum details | +| → →
`height` | number | Required
(exactly 1) | Block height of the quorum | +| → →
`type` | string | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) | +| → →
`quorumHash` | string (hex) | Required
(exactly 1) | The hash of the quorum | +| → →
`minedBlock` | string (hex) | Required
(exactly 1) | The hash of the block that established the quorum | +| → →
`quorumPublicKey` | string (hex) | Required
(exactly 1) | Quorum public key | +| → →
`isValidMember` | bool | Required
(exactly 1) | Indicates if the member is valid | +| → →
`memberIndex` | number | Required
(exactly 1) | Index of the member within the quorum | + +*Example from Dash Core 0.15.0* + +```bash +dash-cli -testnet quorum memberof 1 \ + 39c07d2c9c6d0ead56f52726b63c15e295cb5c3ecf7fe1fefcfb23b2e3cfed1f 1 +``` + +Result: + +```json +[ + { + "height": 72000, + "type": "llmq_400_60", + "quorumHash": "0000000007697fd69a799bfa26576a177e817bc0e45b9fcfbf48b362b05aeff2", + "minedBlock": "00000000014d910dca80944b52aa3f522d5604254043b8354d641912aace4343", + "quorumPublicKey": "03a3fbbe99d80a9be8fc59fd4fe43dfbeba9119b688e97493664716cdf15ae47fad70fea7cb93f20fba10d689f9e3c02", + "isValidMember": true, + "memberIndex": 80 + } +] +``` + +*See also: none* + +### Quorum ListExtended + +The `quorum listextended` RPC returns an extended list of on-chain quorums. + +*Parameter #1---height* + +| Name | Type | Presence | Description | +| -------- | ------- | -------------------- | ------------------------------------------------------------------------------- | +| `height` | numeric | Optional
(0 or 1) | The height index. Will list active quorums at tip if "height" is not specified. | + +*Result---list extended* + +| Name | Type | Presence | Description | +| ------------------------- | ---------------- | ----------------------- | --------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Object containing an extended list of on-chain quorums | +| →
`quorumName` | array of objects | Required
(exactly 1) | List of quorum details per some quorum type | +| →→
`xxxx` | object | Required
(exactly 1) | Quorum hash. Note: most recent quorums come first | +| →→→
`creationHeight` | numeric | Required
(exactly 1) | Block height where the DKG started | +| →→→
`quorumIndex` | numeric | Required
(exactly 1) | Quorum index (applicable only to rotated quorums) | +| →→→
`minedBlockHash` | string | Required
(exactly 1) | Blockhash where the commitment was mined. | +| →→→
`numValidMembers` | numeric | Required
(exactly 1) | The total of valid members. | +| →→→
`healthRatio` | numeric | Required
(exactly 1) | The ratio of healthy members to quorum size. Range [0.0 - 1.0]. | + +*Example from Dash Core 18.2.0* + +```bash +dash-cli quorum listextended 1800330 +``` + +Result: + +``` +{ + "llmq_60_75": [ + { + "000000000000003892d192fe4c76865c398b117e6d28f4e5978f5fea07a392a0": { + "quorumIndex": 0, + "creationHeight": 1800288, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000001e209abbe9ddf3d9d6f413ec76920de87071dd50ea90b38766": { + "quorumIndex": 1, + "creationHeight": 1800289, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000019273ab7f86e2a4e52779141a01373909cd058c48c23849bee": { + "quorumIndex": 2, + "creationHeight": 1800290, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000022b4e1fba61c99235ae6f233a76dded4c4ddc2919680cb54e8": { + "quorumIndex": 3, + "creationHeight": 1800291, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000016c2fe9dc3a0f3f66325351667b42985e46ab15a87dbe64df5": { + "quorumIndex": 4, + "creationHeight": 1800292, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000002ef4d32dc86ec7cad427bd187991c868fd4cccbf62732cbbfb": { + "quorumIndex": 5, + "creationHeight": 1800293, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000000d3cdd5dce4bbe7b327112bd5b637f96cb64cf07faedf7833b": { + "quorumIndex": 6, + "creationHeight": 1800294, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "00000000000000022833d76c3ea60bb0f9cec5a9aee66012e3310561e7fff273": { + "quorumIndex": 7, + "creationHeight": 1800295, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000000da0750d6d6df6c9aff6b1b37333a485c9e2a590943bf3a300": { + "quorumIndex": 8, + "creationHeight": 1800296, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "00000000000000014d22d5fff6cc3645e3144b1831425a3fd19e376b8ae1fd14": { + "quorumIndex": 9, + "creationHeight": 1800297, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "0000000000000018193220b520572d4f9a622a6767358b2af5fd721a57dab2f0": { + "quorumIndex": 10, + "creationHeight": 1800298, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000002a94bbb787ddf45687b5982e894157884067d6c5c8ed721495": { + "quorumIndex": 11, + "creationHeight": 1800299, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000000ddc0112c3d2c625127ccac4311cb8031759a8238ed9e84d8b": { + "quorumIndex": 12, + "creationHeight": 1800300, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "000000000000002bb301832bf8d48ccf67256a7d470cb89348d3fb22bc75467d": { + "quorumIndex": 13, + "creationHeight": 1800301, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000001439d25b7cec34aabd39454956ca0ef632a33ee1923b63bcb5": { + "quorumIndex": 14, + "creationHeight": 1800302, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000016ca53419e336df1f57c22e22e7347eb6ee185911eeb0eadbc": { + "quorumIndex": 15, + "creationHeight": 1800303, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "000000000000002f80f43d095ffd11397d69414b72dc3b22ca471ac7a18aa2d0": { + "quorumIndex": 16, + "creationHeight": 1800304, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "00000000000000207de79166196c12d914f69fa1c0895b9d51dfc66de1d670e6": { + "quorumIndex": 17, + "creationHeight": 1800305, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "0000000000000000d71b16a4160d5c9cc7751593be3c16328ddb2eee95957f13": { + "quorumIndex": 18, + "creationHeight": 1800306, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 57, + "healthRatio": "0.95" + } + }, + { + "0000000000000019530a9727b0a44d5551451a7d78608be53fdedcf3c9d8a443": { + "quorumIndex": 19, + "creationHeight": 1800307, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000027f61ba67222e4ab8a0c7713d0d2c38344c1f7159541ae663a": { + "quorumIndex": 20, + "creationHeight": 1800308, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "00000000000000121db16ad865fa36be61404a78bba17e372df7e12597941796": { + "quorumIndex": 21, + "creationHeight": 1800309, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "000000000000002c024394c7e0fdc031d7904d538dd6e3688d765dd1dac62172": { + "quorumIndex": 22, + "creationHeight": 1800310, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000001ca51cd8d63690283d2afa9ccb69e987c146439ecd25e8b8ae": { + "quorumIndex": 23, + "creationHeight": 1800311, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "00000000000000096c70b0cd1fed28e481f1b74076c8591450357fff57a0cd1e": { + "quorumIndex": 24, + "creationHeight": 1800312, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000028d654215c87a18e86966d25d3d57a62e02ce5bb8a16407aa9": { + "quorumIndex": 25, + "creationHeight": 1800313, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000026116f41a22ef0c5c5442ebbd31e9226ea218ebaf2bef09e68": { + "quorumIndex": 26, + "creationHeight": 1800314, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000002aa07eb158ab1a70d27a382921de2b940eab09b1d175da58f3": { + "quorumIndex": 27, + "creationHeight": 1800315, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "0000000000000028f04886bb10557f2b62373bbeecc54e40b1306fc2960bf6fc": { + "quorumIndex": 28, + "creationHeight": 1800316, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000001f57ef24b442689b83f459291f441f63d1d152f18669759bdf": { + "quorumIndex": 29, + "creationHeight": 1800317, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 59, + "healthRatio": "0.98" + } + }, + { + "000000000000000b1243e19772259b34f29a57bc807ebb155fbb68791af37610": { + "quorumIndex": 30, + "creationHeight": 1800318, + "minedBlockHash": "0000000000000046e498ceae65713b6daf142db12ccb012fac488acbfd84aad5", + "numValidMembers": 60, + "healthRatio": "1.00" + } + }, + { + "000000000000002c406fb450d718b989b951f3c230839062d929e1af7e3cbaee": { + "quorumIndex": 31, + "creationHeight": 1800031, + "minedBlockHash": "000000000000002c9242df9a454e7e0aad7f7d4bf40c84c7adacc0e99c5d9a80", + "numValidMembers": 60, + "healthRatio": "1.00" + } + } + ], + "llmq_400_60": [ + { + "000000000000003892d192fe4c76865c398b117e6d28f4e5978f5fea07a392a0": { + "creationHeight": 1800288, + "minedBlockHash": "00000000000000121db16ad865fa36be61404a78bba17e372df7e12597941796", + "numValidMembers": 400, + "healthRatio": "1.00" + } + }, + { + "000000000000002a19e055ca3767d6200b5b8a872e978610209721e8520c3916": { + "creationHeight": 1800000, + "minedBlockHash": "0000000000000008dcd194b9702bbf8fab74cf150ca6b2ec54377874839a0f60", + "numValidMembers": 400, + "healthRatio": "1.00" + } + }, + { + "0000000000000017e56702f42874c51b1869e5225f50765cabe9f1ee0b33fa5b": { + "creationHeight": 1799712, + "minedBlockHash": "0000000000000026f22894d7d24de94e57f2683cefae3c6fdb4e043e26750711", + "numValidMembers": 399, + "healthRatio": "1.00" + } + }, + { + "000000000000001f1672260b4edac3e5f278e55c09dc4d51e93b9a143f4bcc23": { + "creationHeight": 1799424, + "minedBlockHash": "000000000000002de4624c6476c3533bace5b8811a9ecf48ddeae624f94214c5", + "numValidMembers": 400, + "healthRatio": "1.00" + } + } + ], + "llmq_400_85": [ + { + "000000000000002a19e055ca3767d6200b5b8a872e978610209721e8520c3916": { + "creationHeight": 1800000, + "minedBlockHash": "0000000000000008dcd194b9702bbf8fab74cf150ca6b2ec54377874839a0f60", + "numValidMembers": 397, + "healthRatio": "0.99" + } + }, + { + "000000000000001f1672260b4edac3e5f278e55c09dc4d51e93b9a143f4bcc23": { + "creationHeight": 1799424, + "minedBlockHash": "000000000000002de4624c6476c3533bace5b8811a9ecf48ddeae624f94214c5", + "numValidMembers": 400, + "healthRatio": "1.00" + } + }, + { + "000000000000003972108d2bd0d2e3ef5193b2709ab9f1938d91b446d52bbf1a": { + "creationHeight": 1798848, + "minedBlockHash": "00000000000000443ccd4f40d534dbc0031a505becf13ad14d8f3c15534db40d", + "numValidMembers": 399, + "healthRatio": "1.00" + } + }, + { + "0000000000000021318ce8dec7d7239bc4ffb407b51e7f75f89116348ab7f63d": { + "creationHeight": 1798272, + "minedBlockHash": "0000000000000025e4189f7d4ece51b344fd50f5660352e15d2af45e2476adde", + "numValidMembers": 399, + "healthRatio": "1.00" + } + } + ], + "llmq_100_67": [ + { + "00000000000000096c70b0cd1fed28e481f1b74076c8591450357fff57a0cd1e": { + "creationHeight": 1800312, + "minedBlockHash": "0000000000000017553cc929c0bcd570b444f5caa46bb1c53ac9b6b4b587a6b1", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000003892d192fe4c76865c398b117e6d28f4e5978f5fea07a392a0": { + "creationHeight": 1800288, + "minedBlockHash": "000000000000000ddc0112c3d2c625127ccac4311cb8031759a8238ed9e84d8b", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000023d18e24d490138bc33061fb5d354d6a93b7e8655bb7fb5cd5": { + "creationHeight": 1800264, + "minedBlockHash": "000000000000002d698057b2a3424feaba9f5e2d2a3f8e18b0df3eda7a6d7ae1", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000001410a901c3afa742d883c9fdabce4bc5ae511e5332b6ba4a2c": { + "creationHeight": 1800240, + "minedBlockHash": "000000000000001efdc8e694bd889398686a57859d2063880b9b22ff80e59992", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000001e7c54a085503e8d8d50ad7255298a490db86d94d2190025b3": { + "creationHeight": 1800216, + "minedBlockHash": "000000000000002bab372f9a27d68cf1f3bf4a2c393d2228b8a60dea0d7069b0", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000012000e6134e98fdae4c5174e29fb4e92b97f72b5b31de8b22e": { + "creationHeight": 1800192, + "minedBlockHash": "00000000000000266fd7587535728e4f10a4aabdc6aeddce425166ff62498ee8", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000000d7bfac2eb39c8ca7e34e406f10d34309e383bf6cd12955f33": { + "creationHeight": 1800168, + "minedBlockHash": "000000000000001ee28ea86d5682ea13ae10cfda81a5ec702def62a7190448fa", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000000ec2e9281eb00e49d28794b7aa0e7bc2ca2087446f8bd950d2": { + "creationHeight": 1800144, + "minedBlockHash": "000000000000001aa3571b0b3433bf3d40e2f7065c9c62a7016cf9c6cbd1225d", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000000df63557d980360d610b802fd3929444cadd2aaf052d11c80c": { + "creationHeight": 1800120, + "minedBlockHash": "000000000000000147ecaf84980dcceaee55053536c21c91906e9068641dbb8f", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000014ce6fe9b7c4c4237d21954e9f5bce96b0fa87ed6e780dea10": { + "creationHeight": 1800096, + "minedBlockHash": "00000000000000286fc19ecbb6f25c69cba2ceadc9064e5534c4efb252599ad3", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "00000000000000061da2087af9502da3b7d8a443569b93dbe130e7a5e22bdab1": { + "creationHeight": 1800072, + "minedBlockHash": "0000000000000008866e1a7ee16a99c4baf59dd311a041314c9f1a6c2bd99666", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000001e63afa146c3b3af04e11b103bf431b6795af6f27fa7e93b27": { + "creationHeight": 1800048, + "minedBlockHash": "0000000000000031106ea328f2aa48fd86f689dfb84376e7f3c6f9a71c5ff8e9", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000020d38f6a522b60b098a83ae65f29fc8c0ce998aad9a551117d": { + "creationHeight": 1800024, + "minedBlockHash": "0000000000000018c126af1636f8d82fc48bf2f919992d709f423a3d71cfa9ac", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000002a19e055ca3767d6200b5b8a872e978610209721e8520c3916": { + "creationHeight": 1800000, + "minedBlockHash": "000000000000000de079e14e271ad9714ff33adc5636922ba943a65e21b90a8a", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000000383e3d518a7249e65ab5b642ea01456bd920124ec4985c56a": { + "creationHeight": 1799976, + "minedBlockHash": "000000000000002738b4c991238340cfe94e08a5ca88144ffbc90272d0f5c853", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000038267cd98aa082c4e43521edc6feaff53af21a8f134c1ed05f": { + "creationHeight": 1799952, + "minedBlockHash": "00000000000000064636f2fc5338f6d34033928614487e055cd3a54e7933b8f9", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000000acb20bef7d6a0a4b4b10a276c64d631d5c86fae05a33dfe0b": { + "creationHeight": 1799928, + "minedBlockHash": "0000000000000010fc8ee7e13fc198da76b25c598a59708327f44013e4e78aa0", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000005b452484413d52b186bf8a24174bb83ae673d03c04d9b3cc1": { + "creationHeight": 1799904, + "minedBlockHash": "000000000000000cb6c4587f83021b38cab2b1be05248ae8e06525da2078101a", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000013978d488be84a2b1a9a3fd936a1be6a250e4cdd8de0e7318e": { + "creationHeight": 1799880, + "minedBlockHash": "0000000000000021d6f2991e2c47875b7aa906a63f78457a1e7ee458962ba65d", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000008cc627164e04430716df733f61dfe01795e78b4bf60051294": { + "creationHeight": 1799856, + "minedBlockHash": "0000000000000010a8367e8d02a1774d3c54b075e2016e57ce90ef8a9426fcfa", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000003497f267d65d3a29dc7d79b2925833bc92dbaf5096572427d8": { + "creationHeight": 1799832, + "minedBlockHash": "000000000000000374f39b533e45c86ad8109140412b3ac4872f88acb1505799", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "0000000000000008556be7271f9942e38cbfe85ad8423b8c134fe0edbbd2c08e": { + "creationHeight": 1799808, + "minedBlockHash": "000000000000002309807a942f1e7ec628e92283df34d67db04e82c5c3907f21", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "00000000000000276299f465ea5ecd680b4f6a6c1cf63a213f4ad98c5974ba4b": { + "creationHeight": 1799784, + "minedBlockHash": "00000000000000129cd44a7f7a824116156a325f61a7a69822ebd49c18457d11", + "numValidMembers": 100, + "healthRatio": "1.00" + } + }, + { + "000000000000001d6f064000bf1258786d73dc87a8bd2bad3913483ea3b9f3aa": { + "creationHeight": 1799760, + "minedBlockHash": "000000000000001b7b5a5653a1ef67ad355321c4f2fccd93f2b4c56605fc2fea", + "numValidMembers": 99, + "healthRatio": "0.99" + } + } + ] +} + +``` + +*See also: none* + +### Quorum PlatformSign + +:::{versionadded} 21.0.0 +::: + +The `quorum platformsign` RPC requests threshold-signing for a message. It signs messages only for +Platform quorums. It is equivalent to `quorum sign `. + +*Parameter #1---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ----------- | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #2---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Parameter #3---quorum hash* + +| Name | Type | Presence | Description | +| ------------ | ------------ | -------------------- | --------------------- | +| `quorumHash` | string (hex) | Optional
(0 or 1) | The quorum identifier | + +*Parameter #4---submit* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ----------- | +| `submit` | bool | Optional
(0 or 1) | Submits the signature share to the network if this is `true` (default). Returns an object containing the signature share if this is `false`. | + +*Result---(if submit = `true`) status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ---------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on success | + +*Result---(if submit = `false`) signature share JSON object* + +| Name | Type | Presence | Description | +| ------------------- | ------------ | ----------------------- | ----------- | +| result | object | Required
(exactly 1) | JSON object containing signature share details | +| →
`llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`4` - LLMQ_100_67 | +| →
`quorumHash` | string (hex) | Required
(exactly 1) | The quorum identifier | +| →
`quorumMember` | number | Required
(exactly 1) | Which quorum member created this signature share | +| →
`id` | string (hex) | Required
(exactly 1) | Signing request ID | +| →
`msgHash` | string (hex) | Required
(exactly 1) | Hash of the message that was signed | +| →
`signHash` | string (hex) | Required
(exactly 1) | Hash of `llmqType`, `quorumHash`, `id`, and `msgHash` | +| →
`signature` | string (hex) | Required
(exactly 1) | Signature share | + +*Example from Dash Core 21.0.0* + +Submit signature share to network (default): + +```bash +dash-cli -testnet quorum platformsign \ + "abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234" \ + "51c11d287dfa85aef3eebb5420834c8e443e01d15c0b0a8e397d67e2e51aa239" +``` + +Result: + +```json +false +``` + +_See also_ + +* [Quorum Sign](#quorum-sign): requests threshold-signing for a message. +* [Quorum Info](#quorum-info): retrieves information about a specific quorum, including its members and the threshold required for signing. + +### Quorum RotationInfo + +The `quorum rotationinfo` RPC returns quorum rotation information. The response is a JSON representation of the data that would be returned in a [`qrinfo` message](../reference/p2p-network-data-messages.md#qrinfo). + +*Parameter #1---block request hash* + +| Name | Type | Presence | Description | +| ------------------ | ------------ | ----------------------- | ----------------------------- | +| `blockRequestHash` | string (hex) | Required
(exactly 1) | The block hash of the request | + +*Parameter #2---extra share* + +| Name | Type | Presence | Description | +| ------------ | ---- | -------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `extraShare` | bool | Optional
(0 or 1) | Request an extra share (default: false). This extra share would support validation against the previous set of LLMQs. | + +*Parameter #3---base block hashes number* + +| Name | Type | Presence | Description | +| ------------------ | ------------ | ----------------------- | -------------------------- | +| `baseBlockHash...` | string (hex) | Optional
(0 or more) | Block hashes (default: "") | + +*Result---rotation info* + +| Name | Type | Presence | Description | +| ------------------------------- | ---------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Object containing quorum rotation info | +| →
`extraShare` | bool | Required
(exactly 1) | Whether or not an extra share is included | +| →
`quorumSnapshotAtHMinusC` | object | Required
(exactly 1) | Quorum snapshot at `h-c` | +| →
`quorumSnapshotAtHMinus2C` | object | Required
(exactly 1) | Quorum snapshot at `h-2c` | +| →
`quorumSnapshotAtHMinus3C` | object | Required
(exactly 1) | Quorum snapshot at `h-3c` | +| →
`mnListDiffTip` | object | Required
(exactly 1) | Masternode list diff for the tip | +| →
`mnListDiffH` | object | Required
(exactly 1) | Masternode list diff for `h` | +| →
`mnListDiffAtHMinusC` | object | Required
(exactly 1) | Masternode list diff for `h-c` | +| →
`mnListDiffAtHMinus2C` | object | Required
(exactly 1) | Masternode list diff for `h-2c` | +| →
`mnListDiffAtHMinus3C` | object | Required
(exactly 1) | Masternode list diff for `h-3c` | +| →
`blockHashList` | array | Required
(exactly 1) | Array of block hashes. Returns the last successfully mined quorum per quorumIndex until `blockRequestHash` | +| →
`quorumSnapshotList` | array of objects | Required
(exactly 1) | Array of quorum snapshot list objects | +| →
`mnListDiffList` | array of objects | Required
(exactly 1) | Array of masternode list diff objects | + +*Example from Dash Core 18.0.0* + +```bash +dash-cli -testnet quorum rotationinfo 000001e1ef5f2e2bbc3de3b8b3c554e756ef2b7dcd1eb7552ff48fe319caff4b +``` + +Result (truncated): + +```json +{ + "extraShare": false, + "quorumSnapshotAtHMinusC": { + "activeQuorumMembers": [ + true, + false, + // Content truncated + ], + "mnSkipListMode": 1, + "mnSkipList": [ + 7, + 1, + 6, + 7 + ] + }, + "quorumSnapshotAtHMinus2C": { + "activeQuorumMembers": [ + true, + true, + // Content truncated + ], + "mnSkipListMode": 1, + "mnSkipList": [ + 5, + 4, + 6, + 9 + ] + }, + "quorumSnapshotAtHMinus3C": { + "activeQuorumMembers": [ + true, + true, + // Content truncated + ], + "mnSkipListMode": 1, + "mnSkipList": [ + 4, + 3, + 7 + ] + }, + "mnListDiffTip": { + "baseBlockHash": "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e", + "blockHash": "000001f10408e797a2b8f5dd8a7e5835b7b54c82bf4c7d913bb60a028cb64acb", + "cbTxMerkleTree": "0100000001e862054f249eb3f84689d7bf5f42e89b1e540bd19feb5d656616e967c61837800101", + "cbTx": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff050289070101ffffffff0200c817a8040000001976a914c0aa7affe002c1189d021ea819c2160f7100ef0288ac00ac23fc060000001976a914c0aa7affe002c1189d021ea819c2160f7100ef0288ac0000000046020089070000a0b1aca79a7d78ab800b5146a095e22033513ea6019164b0e46412e953400dd33953a26d62bed490814a65a7e9184094d0294d53676bf08272cc339f2cd41214", + "deletedMNs": [ + ], + "mnList": [ + { + "proRegTxHash": "ef99baa5848b2e2d012db5b0c17958e4ef6578c2c31a60f8cc12225168014ba1", + "confirmedHash": "000001d855b97191009c5ef8f915895ca2d51105c12df1671cb5faedbbb0f7ef", + "service": "34.220.68.124:20001", + "pubKeyOperator": "04bfadc894a7855412800db1941efc5284c0e19dd21512067e01bed98bfd939201e8bffd5de039177ef4ec15aa4c0bd5", + "votingAddress": "yMPLoqwqfnsTdQTTzcmont2HRkQyUewram", + "isValid": true + }, + // Content truncated + ], + "deletedQuorums": [ + ], + "newQuorums": [ + { + "version": 2, + "llmqType": 101, + "quorumHash": "0000021a5928d86124863b0ad62585a6115b354424685c0ecc8adb00f29dd157", + "quorumIndex": 3, + "signersCount": 12, + "signers": "ff0f", + "validMembersCount": 12, + "validMembers": "ff0f", + "quorumPublicKey": "1252d661adab4e272767caa002e3fa1fa99ae95a8f2b75fa3f217801073032da15d3a21a19e6f1a3e1f09212cf87f8ae", + "quorumVvecHash": "a8719a7be6b82bd052c99bc89a8e1ad831a2d33b2440f5a1cfe66d4be1f6ee8e", + "quorumSig": "022288b10b1d94457de8312a884d520cf50058675c7f527a50629e27fd191142be594101213402b56f7a7e0736f71b70046c92bc4ad81a08cfecd7f3dbdecaf7050479f0227099c74f0be5ef302dd626701a1359075187fe799033619f6c8bf9", + "membersSig": "8ef10d202123e5fea80c8c0cd0ad8c4094b605cb977a1e3f9205f7f08fe1da2f1b4c2fa1dcc147ef55eee1bd24bd783513941ae485425400743edc3f2bceaa83b6424e3aa7d4578864a962a2a37066dac4c09ae4fde4569225edec3476b153eb" + }, + // Content truncated + ], + "merkleRootMNList": "d30d4053e91264e4b0649101a63e513320e295a046510b80ab787d9aa7acb1a0", + "merkleRootQuorums": "1412d42c9f33cc7282f06b67534d29d0944018e9a7654a8190d4be626da25339" + }, + "mnListDiffH": {}, // Content truncated + "mnListDiffAtHMinusC": {}, // Content truncated + "mnListDiffAtHMinus2C": {}, // Content truncated + "mnListDiffAtHMinus3C": {}, // Content truncated + "blockHashList": [ + "000000956145f9b48231bbb2a7acd54301823f5619854df4487879dff18f2d79", + "0000002cc74d9300f5d8a5436cfaead69fd1aaf3d68a00e57bd89e878a76a841", + "0000002911d8f6c21571280953e9e581a6996822fab82adfb766c44e49d050e4", + "00000064edcdaea4f2962b3a7bf40bcb0aa8ee00a73da86c6bf80ef7c90af0ce" + ], + "quorumSnapshotList": [ + { + "activeQuorumMembers": [ + true, + true, + // Content truncated + ], + "mnSkipListMode": 1, + "mnSkipList": [ + 9, + 1, + 3 + ] + } + ], + "mnListDiffList": [ + { + "baseBlockHash": "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e", + "blockHash": "000001a6c183a9ec58e1130f3c745dd7729a793974e7d97a10b2a3cb20e42a0a", + "cbTxMerkleTree": "010000000178e366554c6cfc0999d1991ba439d4c3b5f62b36f3f4f73c40f6d716f4a55d1a0101", + "cbTx": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502c0060101ffffffff0200c817a8040000001976a914c0aa7affe002c1189d021ea819c2160f7100ef0288ac00ac23fc060000001976a914c0aa7affe002c1189d021ea819c2160f7100ef0288ac00000000460200c0060000a0b1aca79a7d78ab800b5146a095e22033513ea6019164b0e46412e953400dd3dc1437d53f3dcdb89ea5503743ea6ba4eba87c8fb2f47d8e12ea07acc1e39692", + "deletedMNs": [ + ], + "mnList": [], // Content truncated + "deletedQuorums": [ + ], + "newQuorums": [ + { + "version": 2, + "llmqType": 101, + "quorumHash": "000002132c42566f37b89e90ae92277db8a89fa49bfbd1b2a638f9d10d92e219", + "quorumIndex": 3, + "signersCount": 12, + "signers": "ff0f", + "validMembersCount": 12, + "validMembers": "ff0f", + "quorumPublicKey": "920379ef7f296d9f8c5826c73ad78d026b4bb1dca97c83fb6c4bde23094482be631e375664a65eabd79138ed529e467c", + "quorumVvecHash": "670e3972eb4f0b42f944fd1c333808ae93d66748f9876e42e91fe503f5dab3b7", + "quorumSig": "151ee55b5ad68308d0a16ac47b237a6434bf205d80ffe4cbc5a0b84a70401d863cab7137c40edce2a6b92cd09f07c9ac18fd66c45a7077369f9dfc100ea2e5b5a49549e933ce4dafa8a9cbdb718de945fb805a5eb0c3f02c7159a5db6549a4e8", + "membersSig": "10745b04fa0c164e99b75ff8641c32282468daf928a393f8f98de58b24cffff0faab999b5ffebbb2d804aa6367ca52270ff669041175f6743af534127259b6984fbaae935bd6929e810acb1424b67e4a7af90c64bae477accc88a85ebf3d3891" + }, + // Content truncated + ], + "merkleRootMNList": "d30d4053e91264e4b0649101a63e513320e295a046510b80ab787d9aa7acb1a0", + "merkleRootQuorums": "9296e3c1ac07ea128e7df4b28f7ca8eba46bea433750a59eb8cd3d3fd53714dc" + } + ] +} +``` + +### Quorum SelectQuorum + +The `quorum selectquorum` RPC returns information about the quorum that would/should sign a request. + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorums](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) to list:
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---request id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | -------------- | +| `id` | string (hex) | Required
(exactly 1) | The request ID | + +*Result---quorum hash and list of quorum members* + +| Name | Type | Presence | Description | +| ----------------------- | ---------------- | ----------------------- | ------------------------------------------------------------- | +| `result` | Array of objects | Required
(exactly 1) | Array containing info for quorum's the masternode belongs to | +| →
`quorumHash` | string (hex) | Required
(exactly 1) | The hash of the quorum | +| →→
`recoveryMembers` | array | Required
(exactly 1) | Array containing ProRegTx hashes | +| →→→
ProRegTx Hash | string (hex) | Required
(exactly 1) | The hash of the provider transaction as hex in RPC byte order | + +*Example from Dash Core 0.16.0* + +```bash +dash-cli -testnet quorum selectquorum 1 \ + b95205c3bba72e9edfbe7380ec91fe5a97e16a189e28f39b03c6822757ad1a34 +``` + +Result: + +```json +{ + "quorumHash": "00000ba8932486c66ed0742fd6b0f4e65afc75ab1e7886c6ef84580dfb7da34f", + "recoveryMembers": [ + "0130c115522681b87082db1f45c38423d1a018a8e1559c2491103931e891c220", + "dcd5dd71c4bd50c76d428f72b4a5731bd819720fbc656fff717548e2fe8cbd09", + "a25c2f4549da0135411122ee9c2d37e8375577dc97431a282a5c374b4c71463a", + "a1aaa653e5183d6a4525abfd0a76fc7d6a68393a1c4259117028dfce4fd215e1", + "4c9eb7849590cca2aa18bf9aeeb1e4196c833740de2b111a7690eb62319b0735", + "f38b8c5cb6c9e712aeeb150b9591cbdc70e99f9f26c1516955dd506b20dd9876", + "afe12673c32de351e9f5a29178cd55656f03e64357be872536eb50b059032fe0", + "651d56765c77b8c16b829a4a68f6d39cab40c913d0d365d7b7fd254ccc6cb2f1", + "f88d0e5349d0bf7e4426a7461d7931d09f54c13edb6d83306c2521d19eb0b14b", + "bdba1f169ab1e73c4dc96f4133b337c36907976e26a4612ffa5ae18869eba96c", + "94044c070f9ce6bdd05c2b655ad2383c8402a74c10e0a9a3099d759b33cb7630", + "515f77efd5983a765dc5740b0e0d3fae6e867917ca384467b24e31dda68c7369", + "d1ebecfb816f5b4b5f34c91c0aab9c1b643c8567473e6ee35e02e01c9f2304c0", + "2755d546b114aaec98589cf5b946e408a8996e4837234d2eee97e1da8c71e9ce", + "b04b5240a8fc5ae62865dfa2e2558894f4b53d82fe88771e5345407b560d59bc", + "53750150229202353bfbc3a2c866b993dd33a4c749d8f18ddcb1f5caf7e901ef", + "7a5d1e05d4772feede8b9e71e17e013f99e77c622f13897b8a96339d6d06e1fc", + "24f6fae5b5afd001d1046425f38e6ef523140afafc83013468bd31feb343f307", + "18f2e176adf88043c41b406d0c97a2dd529d5daaca8b8ac49f72e6da30334926", + "73191708ab5b21cc7ede9b12bc1e79de97ad5c4b9717a4fbf5de0ed1f3a5836a", + "b57da176c0b6deae786afd318a8e00e351bed0f47ceac28f5b6d3d502f1c68d7", + "161b2dcf8243162d11065eefd0948cb79d96dfa8ae869e34763a2bbd7d1d5d55", + "fac81f18b3a968f5f881324d8eb38983f3f892c4999c2f46809c4de620b784d2", + "42267d2c50a68350c880a488ec25ba0eac4e7cd436eb97c686fe0a6d035d25d3", + "0be00b051c77fd4b6dac46a63b939f73726dc61dd80616e4573a9465f1aafa93" + ] +} + +``` + +*See also: none* + +### Quorum Verify + +The `quorum verify` RPC tests if a quorum signature is valid for a request id and a message hash. + +*Parameter #1---LLMQ Type* + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `llmqType` | number | Required
(exactly 1) | [Type of quorum](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md):
`1` - LLMQ_50_60
`2` - LLMQ_400_60
`3` - LLMQ_400_85
`4` - LLMQ_100_67 | + +*Parameter #2---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ------------------ | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #3---message hash* + +| Name | Type | Presence | Description | +| --------- | ------------ | ----------------------- | -------------------------------- | +| `msgHash` | string (hex) | Required
(exactly 1) | Hash of the message to be signed | + +*Parameter #4---signature* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | -------------------------- | +| `signature` | string (hex) | Required
(exactly 1) | Quorum signature to verify | + +*Parameter #5---quorum hash* + +| Name | Type | Presence | Description | +| ------------ | ------------ | -------------------- | ------------------------------------------------------------------------------- | +| `quorumHash` | string (hex) | Optional
(0 or 1) | The quorum identifier. Set to `""` if you want to specify `signHeight` instead. | + +*Parameter #6---sign height* + +| Name | Type | Presence | Description | +| ------------ | ------ | -------------------- | --------------------------------------------------------------------------------- | +| `signHeight` | number | Optional
(0 or 1) | The height at which the message was signed. Only works when `quorumHash` is `""`. | + +*Result---status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ----------------------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on verification success | + +*Example from Dash Core 0.17.0* + +Verify the provided signature was valid: + +```bash +dash-cli -testnet quorum verify 1 \ + "2ceeaa7ff20de327ef65b14de692199d15b67b9458d0ded7d68735cce98dd039" \ + "8b5174d0e95b5642ebec23c3fe8f0bbf8f6993502f4210322871bba0e818ff3b" \ + "99cf2a0deb08286a2d1ffdd2564b35522fd748c8802e561abed330dea20df5cb5a5dffeddbe627ea32cb36de13d5b4a516fdfaebae9886b2f7969a5d112416cf8d1983ebcbf1463a64f7522505627e08b9c76c036616fbb1649271a2773a1653" \ + "000000583a348d1a0a5f753ef98e6a69f9bcd9b27919f10eb1a1c3edb6c79182" +``` + +Result: + +```json +true +``` + +## SubmitChainlock + +The [`submitchainlock` RPC](../api/remote-procedure-calls-evo.md#submitchainlock) is used to submit a ChainLock signature if the node does not yet have it. + +*Parameters* + +| Name | Type | Presence | Description | +| --------- | ------ | -------- | ----------- | +| blockHash | string | Required | The block hash of the ChainLock | +| signature | string | Required | The signature of the ChainLock | +| blockHeight | numeric | Required | The height of the ChainLock | + +*Result---The height of the current best ChainLock* + +| Name | Type | Presence | Description | +| ------ | ------- | ----------------------- | ----------- | +| Result | numeric | Required (Exactly 1) | The height of the current best ChainLock. If an error occurs, `-1` is returned. | + +*Example from Dash Core 20.1.0* + +```bash +dash-cli submitchainlock "000000f7e552718cf326024ba0b0110695300b730873de1942a4106b665fc034" "3045022100a59e3b0f..." 964445 +``` + +Result: + +```text +964445 +``` + +*See also: none* + +## VerifyChainLock + +The `verifychainlock` RPC tests if a quorum signature is valid for a ChainLock. + +*Parameter #1---block hash* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------- | +| `blockhash` | string (hex) | Required
(exactly 1) | The block hash of the ChainLock | + +*Parameter #2---signature* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | --------------------------------- | +| `signature` | string (hex) | Required
(exactly 1) | The ChainLock signature to verify | + +*Parameter #3---block height* + +| Name | Type | Presence | Description | +| ------------- | ------ | -------------------- | ----------------------------------------------------------------------------------------------------- | +| `blockHeight` | number | Optional
(0 or 1) | The height of the ChainLock. There will be an internal lookup of `blockHash` if this is not provided. | + +*Result---status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ----------------------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on verification success | + +*Example from Dash Core 0.17.0* + +Verify the provided signature was valid: + +```bash +dash-cli -testnet verifychainlock \ + "00000036d5c520be6e9a32d3829efc983a7b5e88052bf138f80a2b3988689a24" \ + "97ec34efd1615b84af62495e54024880752f57790cf450ae974b80002440963592d96826e24f109e6c149411b70bb9a0035443752368590adae60365cf4251464e0423c1263e9c56a33eae9be9e9c79a117151b2173bcee93497008cace8d793" +``` + +Result: + +```json +true +``` + +## VerifyISLock + +The `verifyislock` RPC tests if a quorum signature is valid for an InstantSend Lock. + +*Parameter #1---id* + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ------------------ | +| `id` | string (hex) | Required
(exactly 1) | Signing request ID | + +*Parameter #2---transaction id* + +| Name | Type | Presence | Description | +| ------ | ------------ | ----------------------- | ------------------------- | +| `txid` | string (hex) | Required
(exactly 1) | The transaction id (TXID) | + +*Parameter #3---signature* + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ---------------------------------------- | +| `signature` | string (hex) | Required
(exactly 1) | The InstantSend Lock signature to verify | + +*Parameter #4---maximum height* + +| Name | Type | Presence | Description | +| ----------- | ------ | -------------------- | ----------------------------------------- | +| `maxHeight` | number | Optional
(0 or 1) | The maximum height to search quorums from | + +*Result---status* + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ----------------------------------------------- | +| result | bool | Required
(exactly 1) | True or false depending on verification success | + +*Example from Dash Core 20.0.0* + +Verify the provided signature was valid: + +```bash +dash-cli -testnet verifyislock \ + "e5affbbb07084f15ff86bc5043978360a22c8bbacc10a09b973da2cfc32a0115" \ + "17e3d624ca71f06d91e35c01b0933ec7a34fd18a3700c4c3cbc947b59e91c6b2" \ + "b36f68abbb15be1948b0b55d392420b9fcc208361037f6dbbb7552f1fda9bae50800df265b037273f8ad310f0ec3af011166ba61002ac30dececee4e46d4e28de8553515cfdfa40fd04e7e3bf4932049f8b670e908b7b9a2bb69d5c1c59dd7f4" +``` + +Result: + +```json +true +``` diff --git a/docs/core/api/remote-procedure-calls-generating.md b/docs/core/api/remote-procedure-calls-generating.md new file mode 100644 index 000000000..0407acb39 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-generating.md @@ -0,0 +1,173 @@ +```{eval-rst} +.. meta:: + :title: Generating RPCs + :description: A list of all mining-related remote procedure calls in Dash Core. +``` + +# Generating RPCs + +## GenerateBlock + +:::{attention} +This RPC is not available in the official Windows/Mac binaries. The Linux binary and binaries self-compiled (with the appropriate options) support this feature. +::: + +*Added in Dash Core 18.1.0* + +The [`generateblock` RPC](../api/remote-procedure-calls-generating.md#generateblock) mines a block with a set of ordered transactions immediately to a specified address or [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) (before the RPC call returns). + +*Parameter #1---an address or descriptor* + +Name | Type | Presence | Description +--- | --- | --- | --- +Address/Descriptor | string | Required
(exactly 1) | The address or [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) that will receive the newly generated Dash. + +*Parameter #2---transaction(s)* + +Name | Type | Presence | Description +--- | --- | --- | --- +Transactions | array | Required
(exactly 1) | An array of hex strings which are either txids or raw transactions. TXIDs must reference transactions currently in the mempool. All transactions must be valid and in valid order, otherwise the block will be rejected. Array can be empty. +→
Raw Transaction / TXID | string | Optional
(0 or more) | A raw transaction or transaction ID. + +*Result---the generated block hash* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A JSON object containing the block header hash of the generated block +→
`hash` | string (hex) | Required
(exactly 1) | The hash of the header of the block generated, as hex in RPC byte order + +*Example from Dash Core 18.1.0* + +```bash +dash-cli generateblock "yacJKd6tRz2JSn8Wfp9GKgCbuowAEBivrA" '[]' +``` + +Result: + +```json +{ + "hash": "000000e219a3d47463fdfed6da30c999f02d7add2defb2f375549b357d3840af" +} +``` + +*See also* + +* [GenerateToAddress](#generatetoaddress): mines blocks to a specified address. +* [GenerateToDescriptor](#generatetodescriptor): mines blocks to a specified descriptor. +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. + +## GenerateToAddress + +:::{attention} +This RPC is not available in the official Windows/Mac binaries. The Linux binary and binaries self-compiled (with the appropriate options) continue to support this feature. See [PR #2778](https://github.com/dashpay/dash/pull/2778) for additional details. +::: + +*Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0* + +The [`generatetoaddress` RPC](../api/remote-procedure-calls-generating.md#generatetoaddress) mines blocks immediately to a specified address. + +*Parameter #1---the number of blocks to generate* + +Name | Type | Presence | Description +--- | --- | --- | --- +Blocks | number (int) | Required
(exactly 1) | The number of blocks to generate. The RPC call will not return until all blocks have been generated or the maximum number of iterations has been reached + +*Parameter #2---a transaction identifier (TXID)* + +Name | Type | Presence | Description +--- | --- | --- | --- +Address | string (base58) | Required
(exactly 1) | The address that will receive the newly generated Dash + +*Parameter #3---the maximum number of iterations to try* + +Name | Type | Presence | Description +--- | --- | --- | --- +Maxtries | number (int) | Optional
(0 or 1) | The maximum number of iterations that are tried to create the requested number of blocks. Default is `1000000` + +*Result---the generated block header hashes* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array containing the block header hashes of the generated blocks (may be empty if used with `generate 0`) +→
Header Hashes | string (hex) | Required
(1 or more) | The hashes of the headers of the blocks generated, as hex in RPC byte order + +*Example from Dash Core 0.12.3* + +Using regtest mode, generate 2 blocks with maximal 500000 iterations: + +```bash +dash-cli -regtest generatetoaddress 2 "yaQzdWrDVYGncLKSKG4bHQ\ +ML9UdAe726QN" 500000 +``` + +Result: + +```json +[ + "34726c518d1688a9c56b3399e892089d3a639b43de194517c07da2b168a3a89c", + "1f030abe2bb323b8895542e3a85ed8386bd92c67af9d19fe9c163a4c5f5ef149" +] +``` + +*See also* + +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. + +## GenerateToDescriptor + +:::{attention} +This RPC is not available in the official Windows/Mac binaries. The Linux binary and binaries self-compiled (with the appropriate options) support this feature. +::: + +*Added in Dash Core 18.1.0* + +The [`generatetodescriptor` RPC](#generatetodescriptor) mines blocks immediately to a specified [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md). + +*Parameter #1---the number of blocks to generate* + +Name | Type | Presence | Description +--- | --- | --- | --- +Blocks | number (int) | Required
(exactly 1) | The number of blocks to generate. The RPC call will not return until all blocks have been generated or the maximum number of iterations has been reached + +*Parameter #2---a descriptor* + +Name | Type | Presence | Description +--- | --- | --- | --- +Descriptor | string | Required
(exactly 1) | The [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) that will receive the newly generated Dash + +*Parameter #3---the maximum number of iterations to try* + +Name | Type | Presence | Description +--- | --- | --- | --- +Maxtries | number (int) | Optional
(0 or 1) | The maximum number of iterations that are tried to create the requested number of blocks. Default is `1000000` + +*Result---the generated block header hashes* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | An array containing the block header hashes of the generated blocks (may be empty if used with `generate 0`) +→
Header Hashes | string (hex) | Required
(1 or more) | The hashes of the headers of the blocks generated, as hex in RPC byte order + +*Example from Dash Core 18.1.0* + +Generate 1 block with maximal 500000 iterations: + +```bash +dash-cli -regtest generatetodescriptor 1 "pkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)" 500000 +``` + +Result: + +```json +[ + "0000007c599cc625ff4196ca55d73b6584ba89ccdd9836f969bf67b26b4a6376" +] +``` + +*See also* + +* [GenerateBlock](#generateblock): mines a block with a set of ordered transactions immediately to a specified address or descriptor. +* [GenerateToAddress](#generatetoaddress): mines blocks immediately to a specified address. +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. diff --git a/docs/core/api/remote-procedure-calls-mining.md b/docs/core/api/remote-procedure-calls-mining.md new file mode 100644 index 000000000..2d6f65508 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-mining.md @@ -0,0 +1,391 @@ +```{eval-rst} +.. meta:: + :title: Mining RPCs + :description: A list of remote procedure calls for mining in Dash. +``` + +# Mining RPCs + +## GetBlockTemplate + +The [`getblocktemplate` RPC](../api/remote-procedure-calls-mining.md#getblocktemplate) gets a block template or proposal for use with mining software. For more +information, please see the following resources: + +* [Bitcoin Wiki GetBlockTemplate](https://en.bitcoin.it/wiki/Getblocktemplate) +* [BIP22](https://github.com/bitcoin/bips/blob/master/bip-0022.mediawiki) +* [BIP23](https://github.com/bitcoin/bips/blob/master/bip-0023.mediawiki) + +*Parameter #1---a JSON request object* + +Name | Type | Presence | Description +--- | --- | --- | --- +Request | object | Optional
(exactly 1) | A JSON request object +→
`mode` | string | Optional
(exactly 1) | This must be set to \template\" or omitted" +→
`capabilities` | array (string) | Optional
(0 or more) | A list of strings +→ →
Capability | string | Optional
(exactly 1) | Client side supported feature, `longpoll`, `coinbasetxn`, `coinbasevalue`, `proposal`, `serverlist`, `workid` +→
`rules` | array (string) | Optional
(0 or more) | A list of strings +→ →
Rules | string | Optional
(exactly 1) | Client side supported softfork deployment, `csv`, `dip0001`, etc. + +*Result---block template* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | A object containing a block template +→
`capabilities` | array (string) | Required
(1 or more) | The client side supported features +→ →
Capability | string | Optional
(0 or more) | A client side supported feature +→
`version` | number (int) | Required
(exactly 1) | The block version +→
`rules` | array (string) | Required
(1 or more) | The specific block rules that are to be enforced +→ →
Block Rule | string | Optional
(0 or more) | A specific block rule to be enforced +→
`vbavailable` | object | Required
(exactly 1) | Contains the set of pending, supported versionbit (BIP 9) softfork deployments +→ →
Bit Number | number | Required
(0 or more) | The bit number the named softfork rule +→
`vbrequired` | number | Required
(exactly 1) | The bit mask of versionbits the server requires set in submissions +→
`previousblockhash` | string (hex) | Required
(exactly 1) | The hash of current highest block +→
`transactions` | array (objects) | Optional
(0 or more) | Non-coinbase transactions to be included in the next block +→ →
Transaction | object | Optional
(0 or more) | Non-coinbase transaction +→ → →
`data` | string (hex) | Optional
(0 or more) | Transaction data encoded in hex (byte-for-byte) +→ → →
`txid` | string (hex) | Optional
(0 or more) | Transaction ID encoded in little-endian hexadecimal | +→ → →
`hash` | string (hex) | Optional
(0 or more) | The hash/id encoded in little-endian hex +→ → →
`depends` | array (numbers) | Required
(0 or more) | An array holding TXIDs of unconfirmed transactions this TX depends upon (parent transactions). +→ → → →
Transaction number | number | Optional
(1 or more) | Transactions before this one (by 1-based index in `transactions` list) that must be present in the final block if this one is +→ → →
`fee` | number | Required
(exactly 1) | The difference in value between transaction inputs and outputs (in duffs). For coinbase transactions, this is a negative number of the total collected block fees (ie., not including the block subsidy); if key is not present, fee is unknown and clients MUST NOT assume there isn't one +→ → →
`sigops` | number | Required
(exactly 1) | Total SigOps. If not present, the count is unknown (clients MUST NOT assume there aren't any) +→
`coinbaseaux` | object | Required
(exactly 1) | A object containing data that should be included in the coinbase scriptSig content +→
`coinbasevalue` | number | Required
(exactly 1) | The maximum allowable input to coinbase transaction, including the generation award and transaction fees (in duffs) +→
`coinbasetxn` | object | Required
(exactly 1) | **Removed in Dash Core 20.0.0** +`longpollid` | string | Required
(exactly 1) | An ID to include with a request to longpoll on an update to this template +→
`target` | string | Required
(exactly 1) | The hash target +→
`mintime` | number | Required
(exactly 1) | The minimum timestamp appropriate for next block time in seconds since epoch +→
`mutable` | array (string) | Required
(exactly 1) | The list of ways the block template may be changed +→ →
Value | string | Required
(0 or more) | A way the block template may be changed, e.g. 'time', 'transactions', 'prevblock' +→
`noncerange` | string | Required
(exactly 1) | A range of valid nonces +→
`sigoplimit` | number | Required
(exactly 1) | The limit of sigops in blocks +→
`sizelimit` | number | Required
(exactly 1) | The limit of block size +→
`curtime` | number | Required
(exactly 1) | The current timestamp in seconds since epoch +→
`bits` | string | Required
(exactly 1) | The compressed target of next block +→
`previousbits` | string | Required
(exactly 1) | The compressed target of the current highest block +→
`height` | number | Required
(exactly 1) | The height of the next block +→
`masternode` | array (objects) | Required
(0 or more) | Required masternode payments that must be included in the next block +→ →
Masternode Payee | object | Optional
(0 or more) | Object containing a masternode payee's information +→ → →
`payee` | string | Required
(exactly 1) | Payee address +→ → →
`script` | string | Required
(exactly 1) | Payee scriptPubKey +→ → →
`amount` | number | Required
(exactly 1) | Required amount to pay +→
`masternode_payments_started` | boolean | Required
(exactly 1) | True if masternode payments started +→
`masternode_payments_enforced` | boolean | Required
(exactly 1) | True if masternode payments enforced +→
`superblock` | array (objects) | Required
(0 or more) | The superblock payees that must be included in the next block +→ →
Superblock Payee | object | Optional
(0 or more) | Object containing a superblock payee's information +→ → →
`payee` | string | Required
(exactly 1) | Payee address +→ → →
`script` | string | Required
(exactly 1) | Payee scriptPubKey +→ → →
`amount` | number | Required
(exactly 1) | Required amount to pay +→
`superblocks_started` | boolean | Required
(exactly 1) | True if superblock payments started +→
`superblocks_enabled` | boolean | Required
(exactly 1) | True if superblock payments enabled +→
`coinbase_payload` | string (hex) | Required
(exactly 1) | *Added in Dash Core 0.13.0*

Coinbase transaction payload data encoded in hexadecimal + +*Example from Dash Core 20.0.0* + +```bash +dash-cli -testnet getblocktemplate +``` + +Result: + +```json +{ + "capabilities": [ + "proposal" + ], + "version": 536870912, + "rules": [ + "v20", + "mn_rr" + ], + "vbavailable": { + }, + "vbrequired": 0, + "previousblockhash": "000000487e77ca7d979fcb607e8967295f2b1dd8ddb2785d813b0ed6344f149a", + "transactions": [ + { + "data": "03000600000000000000fd49010100a3ff0d000300016b9e6f55fe33d217feaf77efdd4db8e662d323f6aa09fffd66a147e4da00000032ffffffffffff0332ffffffffffff03a99c278110c807da5a9bc9c8398a8ea7d65daa9d18c28c4c9169bd72b7711dafee8a064d78d88b6ae0cfd5c480d17253abfdad7415814e6c5fa2f61e70aa84a4ac25509eb033e578da15395eb61df03888f8ff5ec987254b59a01cf37b85097d29f1095f0f6a3c52583713e6578e8d24a93c3db9bc5deb55af5ea3e506e0beff0a4dc244dd9a0160381e79d4342489cac1603146b5e30b71f0c84ffa294e5cda75255a1a82ba2454351079a91fec876f8d4efad0f8ab1e9e7ee3302dd07717d32fdf4ab7f29e0ab8edf2d788c95d56c8790d6b4a84a13b2554ca6b1f9b0102ae178ab088189e8fa898268e135823514df4cec08ddb62032ec74b80a69b93bbe59e0624fac442ccc539083151be200384", + "hash": "9b9f02cb05d3d323b503561608c9ca383a45ef57fb6ebd84ae0d81a653e30003", + "depends": [ + ], + "fee": 0, + "sigops": 0 + }, + { + "data": "03000600000000000000fd55010100a3ff0d000300046b9e6f55fe33d217feaf77efdd4db8e662d323f6aa09fffd66a147e4da00000064ffffffffffffffffffffffff0f64ffffffffffffffffffffffff0fa4c2c8b9a873a223fc84037d24e9d76dcf0ac8105d3cabbf84a5cd901a2f5369a7dc61cbc18085cc0c2f4c67b1805cfec4c3b4f89ea09f922fbbeb42f9a82bce64276174eacd9d20ddc0ff33931b14d291cd520a372176a2d28376381f5d36b77f48031d464897f18ff82438bdb38489986e0d5794e4da6503d13ae33115f62e19d94da430f06b44f9d7e6512d68783662295b96f72430b06e218a31d10fe9ef43e17c5840b67fe548bce240e0d6e02da3a0f718da47554ce3e364bafd16ec01544a7e5720d39202e7763ee03ade630cd9724dce36957a90ac4798180e0dec700270162bf8f5b4533ef34ef47b96494e6eb096d4d259b0df9f5572c368b805deaed36574c0d1aee286583b1dda06f1a5", + "hash": "3409f455c1584155833227b171d83840de662dd33e216ede9b82d933bfcc2151", + "depends": [ + ], + "fee": 0, + "sigops": 0 + }, + { + "data": "03000600000000000000fd43010100a3ff0d000300066b9e6f55fe33d217feaf77efdd4db8e662d323f6aa09fffd66a147e4da00000019ffffff0119ffffff01a8c52eaf171fc29d25ecec2dd5fd3aded2f3e8c3f7721f4b9985025810fdb05444e797bed5a4cc0031f59138a14607a022179768c089b96a77e838857bbf03e7dd36002b029c7bafdce7ac4f4738d7548c23f27038f56c8795fc128b5e75059b9644047fa2c144f90388c45b998a6c19c7c0490d06c9c2e61fb24b8c609fada613b8c0de59d7d8aa355d4135b8dd64572b55cc4c9fb49a8dff515536cce91cb1a3c5dc5340e0806069ace3b5f2168af68e34a2e9cf1ffa43c00191ff5c06aa54706b64f41353efb845f251cf81c693a0db7a1996b3d42a12860ec53127f3c3a3052577467a257a4a6c0a9e60ec854648265d3de3ad57c97ad8f312d734f52789c7f48bf7d06c062a35c2def5b1d45c6a", + "hash": "5715b73cdc829e71688d8974338cd96273b913a37ab4d03fabb027a770c83af6", + "depends": [ + ], + "fee": 0, + "sigops": 0 + } + ], + "coinbaseaux": { + }, + "coinbasevalue": 1672799096, + "longpollid": "000000487e77ca7d979fcb607e8967295f2b1dd8ddb2785d813b0ed6344f149a156", + "target": "0000012a59000000000000000000000000000000000000000000000000000000", + "mintime": 1696363840, + "mutable": [ + "time", + "transactions", + "prevblock" + ], + "noncerange": "00000000ffffffff", + "sigoplimit": 40000, + "sizelimit": 2000000, + "curtime": 1696364934, + "bits": "1e012a59", + "previousbits": "1e012b17", + "height": 917411, + "masternode": [ + { + "payee": "", + "script": "6a", + "amount": 376379796 + }, + { + "payee": "yeRZBWYfeNE4yVUHV4ZLs83Ppn9aMRH57A", + "script": "76a914c69a0bda7daaae481be8def95e5f347a1d00a4b488ac", + "amount": 627299661 + } + ], + "masternode_payments_started": true, + "masternode_payments_enforced": true, + "superblock": [ + ], + "superblocks_started": true, + "superblocks_enabled": true, + "coinbase_payload": "0300a3ff0d00739f69d98c43d95c201a42cae33abd9762429c6b598c5989cd4c0c0bf81a3a82c6d6e2c75f57c6d4e222461391b28cecfa399b5bfc6033613e5dc7f50e69e5f40081a244f815e87d92734728e5e0278c5b833e2ac0f6d1e5b47f83d7e8ce95f0b3da533feb1955472e29972e7f810e285519cb50648d2e9ca5ea442b56ae3da48b0fee25c99e67a9e1b63df38640a7cecfe80955f59b260aa384b64d5202feba3316298c85b8050000" +} +``` + +*See also* + +* [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. +* [SubmitBlock](../api/remote-procedure-calls-mining.md#submitblock): accepts a block, verifies it is a valid addition to the block chain, and broadcasts it to the network. Extra parameters are ignored by Dash Core but may be used by mining pools or other programs. +* [PrioritiseTransaction](../api/remote-procedure-calls-mining.md#prioritisetransaction): adds virtual priority or fee to a transaction, allowing it to be accepted into blocks mined by this node (or miners which use this node) with a lower priority or fee. (It can also remove virtual priority or fee, requiring the transaction have a higher priority or fee to be accepted into a locally-mined block.) + +## GetMiningInfo + +The [`getmininginfo` RPC](../api/remote-procedure-calls-mining.md#getmininginfo) returns various mining-related information. + +*Parameters: none* + +*Result---various mining-related information* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Various mining-related information +→
`blocks` | number (int) | Required
(exactly 1) | The height of the highest block on the local best block chain +→
`currentblocksize` | number (int) | Optional
(0 or 1) | If generation was enabled since the last time this node was restarted, this is the size in bytes of the last block built by this node for header hash checking. +→
`currentblocktx` | number (int) | Optional
(0 or 1) | If generation was enabled since the last time this node was restarted, this is the number of transactions in the last block built by this node for header hash checking. +→
`difficulty` | number (real) | Required
(exactly 1) | If generation was enabled since the last time this node was restarted, this is the difficulty of the highest-height block in the local best block chain. Otherwise, this is the value `0` +→
`networkhashps` | number (int) | Required
(exactly 1) | An estimate of the number of hashes per second the network is generating to maintain the current difficulty. See the [`getnetworkhashps` RPC](../api/remote-procedure-calls-mining.md#getnetworkhashps) for configurable access to this data +→
`pooledtx` | number (int) | Required
(exactly 1) | The number of transactions in the memory pool +→
`chain` | string | Required
(exactly 1) | Set to `main` for mainnet, `test` for testnet, and `regtest` for regtest +→
`warnings` | string | Required
(exactly 1) | *Added in Dash Core 0.16.0*

Any network or blockchain warnings +→
`errors` | string | Optional
(0 or 1) | **Removed in Dash Core 0.17.0**

Only shown when dashd is started with `-deprecatedrpc=getmininginfo` + +*Example from Dash Core 18.0.0* + +```bash +dash-cli getmininginfo +``` + +Result: + +```json +{ + "blocks": 292979, + "difficulty": 0.0002441371325370145, + "networkhashps": 3805.856874962192, + "pooledtx": 0, + "chain": "test", + "warnings": "Warning: unknown new rules activated (versionbit 3)" +} +``` + +*See also* + +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. + +## GetNetworkHashPS + +The [`getnetworkhashps` RPC](../api/remote-procedure-calls-mining.md#getnetworkhashps) returns the estimated network hashes per second based on the last n blocks. + +*Parameter #1---number of blocks to average* + +Name | Type | Presence | Description +--- | --- | --- | --- +`blocks` | number (int) | Optional
(0 or 1) | The number of blocks to average together for calculating the estimated hashes per second. Default is `120`. Use `-1` to average all blocks produced since the last difficulty change + +*Parameter #2---block height* + +Name | Type | Presence | Description +--- | --- | --- | --- +`height` | number (int) | Optional
(0 or 1) | The height of the last block to use for calculating the average. Defaults to `-1` for the highest-height block on the local best block chain. If the specified height is higher than the highest block on the local best block chain, it will be interpreted the same as `-1` + +*Result---estimated hashes per second* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | number (int) | Required
(exactly 1) | The estimated number of hashes per second based on the parameters provided. May be 0 (for Height=`0`, the genesis block) or a negative value if the highest-height block averaged has a block header time earlier than the lowest-height block averaged + +*Example from Dash Core 0.12.2* + +Get the average hashes per second for all the blocks since the last +difficulty change before block 6000. + +```bash +dash-cli -testnet getnetworkhashps -1 6000 +``` + +Result: + +```text +22214011.90821117 +``` + +*See also* + +* [GetDifficulty](../api/remote-procedure-calls-blockchain.md#getdifficulty): returns the proof-of-work difficulty as a multiple of the minimum difficulty. +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. + +## PrioritiseTransaction + +The [`prioritisetransaction` RPC](../api/remote-procedure-calls-mining.md#prioritisetransaction) adds virtual priority or fee to a transaction, allowing it to be accepted into blocks mined by this node (or miners which use this node) with a lower priority or fee. (It can also remove virtual priority or fee, requiring the transaction have a higher priority or fee to be accepted into a locally-mined block.) + +*Parameter #1---the TXID of the transaction to modify* + +Name | Type | Presence | Description +--- | --- | --- | --- +TXID | string | Required
(exactly 1) | The TXID of the transaction whose virtual priority or fee you want to modify, encoded as hex in RPC byte order + +*Parameter #2---the change to make to the virtual fee* + +Name | Type | Presence | Description +--- | --- | --- | --- +Fee | number (int) | Required
(exactly 1) | **Warning:** this value is in duffs, not Dash

If positive, the virtual fee to add to the actual fee paid by the transaction; if negative, the virtual fee to subtract from the actual fee paid by the transaction. No change is made to the actual fee paid by the transaction + +*Result---`true` if the priority is changed* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | bool (true only) | Required
(exactly 1) | Always set to `true` if all three parameters are provided. Will not return an error if the TXID is not in the memory pool. If fewer or more than three arguments are provided, or if something goes wrong, will be set to `null` + +*Example from Dash Core 0.14.0* + +```bash +dash-cli -testnet prioritisetransaction \ + f86c74f27fdd9c7e618d69b3606eeae1710b3f02fabede6ae8c88dd7bb756942 \ + 456789 +``` + +Result: + +```json +true +``` + +*See also* + +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. + +## SubmitBlock + +The [`submitblock` RPC](../api/remote-procedure-calls-mining.md#submitblock) accepts a block, verifies it is a valid addition to the block chain, and broadcasts it to the network. Extra parameters are ignored by Dash Core but may be used by mining pools or other programs. + +*Parameter #1---the new block in serialized block format as hex* + +Name | Type | Presence | Description +--- | --- | --- | --- +Block | string (hex) | Required
(exactly 1) | The full block to submit in serialized block format as hex + +*Parameter #2---dummy value* + +Name | Type | Presence | Description +--- | --- | --- | --- +`dummy` | object | Optional
(0 or 1) | A dummy value for compatibility with BIP22. This value is ignored. + +*Result---`null` or error string* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | null/string | Required
(exactly 1) | If the block submission succeeded, set to JSON `null`. If submission failed, set to one of the following strings: `duplicate`, `duplicate-invalid`, `inconclusive`, or `rejected`. The JSON-RPC `error` field will still be set to `null` if submission failed for one of these reasons + +*Example from Dash Core 0.15.0* + +Submit the following block with the a dummy value, "test". + +```bash +dash-cli -testnet submitblock 0100002032e3965d5fdd7a883209d516599337eb4cb82f\ + 7aea22ecc114942c1f00000000244388a3bd2c38a85bf337755a1a165d0df2b335e3886058\ + 40e08a3cdf1ce1a4297ede598f6a011d027c1c300201000000010000000000000000000000\ + 000000000000000000000000000000000000000000ffffffff1202791f0e2f5032506f6f6c\ + 2d74444153482fffffffff044d75bb8b010000001976a914d4a5ea2641e9dd37f7a5ad5c92\ + 9df4743518769188acac2ea68f010000001976a9148d0934de58f969df3b53a72b4f47211d\ + 890ebf5588ac68b9ea03000000004341047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b9\ + 80e00d467aa9440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d\ + 7281bdc9430f35ac00000000000000002a6a28f47e935509fc85533dc78197e93e87d1c793\ + 43bda495429d8e3680069f6a22780000000002000000000000000100000001078e0c77e3b0\ + 4323d0834841f965543aaae2b275f684f55fbaf22e1c83bff97e010000006a473044022077\ + 6e96d202cc4f50f79d269d7cd36712c7486282dda0cb6eae583c916c98b34c022070941efb\ + 3201cf500cc6b879d6570fc477d4c3e6a8d91286e84465235f542c42012102dddbfc3fe06b\ + 96e3a36f3e815222cd1cb9586b3193c4a0de030477f621956d51feffffff02a00bd1000000\ + 00001976a914d7b47d4b40a23c389f5a17754d7f60f511c7d0ec88ac316168821300000019\ + 76a914c9190e507834b78a624d7578f1ad3819592ca1aa88ac771f0000 \ + "test" +``` + +Result (the block above was already on a local block chain): + +```text +duplicate +``` + +*See also* + +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. + +## SubmitHeader + +The [`submitheader` RPC](../api/remote-procedure-calls-mining.md#submitheader) decodes the given hexdata as a header and submits it as a candidate chain tip if valid. +If invalid, it throws. + +*Parameter #1---hexdata* + +Name | Type | Presence | Description +--- | --- | --- | --- +hexdata | string (hex) | Required
(exactly 1) | The block header data + +*Result---`None`* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | None | Not Required
| N/A + +*Example from Dash Core 18.0.0* + +```bash +dash-cli -testnet submitheader 0000002037f7981be497c71524bb9f7454d80b1448f46b6f99c3cadfee4367f0c201000007a95ed6e4d19efa99f33c93b45ee2eab5b5a0ef230ac9c03ecc8a3b5ef8938f5b1978614745021ed6cb0000 +``` + +Result: + +```text +null +``` + +*See also: none* diff --git a/docs/core/api/remote-procedure-calls-network.md b/docs/core/api/remote-procedure-calls-network.md new file mode 100644 index 000000000..7a6dfcb1c --- /dev/null +++ b/docs/core/api/remote-procedure-calls-network.md @@ -0,0 +1,834 @@ +```{eval-rst} +.. meta:: + :title: Network RPCs + :description: A list of all network connection related remote procedure calls in Dash Core. +``` + +# Network RPCs + +## AddNode + +The [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) attempts to add or remove a node from the addnode list, or to try a connection to a node once. + +*Parameter #1---hostname/IP address and port of node to add or remove* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------------------------------------------- | +| `node` | string | Required
(exactly 1) | The node to add as a string in the form of `:`. | + +*Parameter #2---whether to add or remove the node, or to try only once to connect* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `command` | string | Required
(exactly 1) | What to do with the IP address above. Options are:
• `add` to add a node to the addnode list. Up to 8 nodes can be added additional to the default 8 nodes. Not limited by `-maxconnections`
• `remove` to remove a node from the list. If currently connected, this will disconnect immediately
• `onetry` to immediately attempt connection to the node even if the outgoing connection slots are full; this will only attempt the connection once | + +_Result---`null` plus error on failed remove_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | Always JSON `null` whether the node was added, removed, tried-and-connected, or tried-and-not-connected. The JSON-RPC error field will be set only if you try adding a node that was already added or removing a node that is not on the addnodes list | + +*Example from Dash Core 0.12.2* + +Try connecting to the following node. + +```bash +dash-cli -testnet addnode 192.0.2.113:19999 onetry +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. + +## AddPeerAddress + +The [`addpeeraddress` RPC](../api/remote-procedure-calls-network.md#addpeeraddress) adds the address +of a potential peer to the address manager. **This RPC is for testing only.** + +*Parameter #1---IP address of node to add* + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `address` | string | Required
(exactly 1) | The IP address of the peer | + +*Parameter #2---port of the node to add* + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `port` | number | Required
(exactly 1) | The port of the peer | + +*Result---a list of added nodes* + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `result` | object | Required
(exactly 1) | An object describing if the address was successfully added | +| →
`success` | bool | Required
(exactly 1) | Whether the peer address was successfully added to the address manager | + +*Example from Dash Core 20.0.0* + +Try connecting to the following node. + +```bash +dash-cli addpeeraddress "1.2.3.4" 9999 +``` + +Result: + +```json +{ + "success": true +} +``` + +*See also: none* + +## ClearBanned + +*Added in Bitcoin Core 0.12.0* + +The [`clearbanned` RPC](../api/remote-procedure-calls-network.md#clearbanned) clears list of banned nodes. + +*Parameters: none* + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------- | +| `result` | null | Required
(exactly 1) | JSON `null` when the list was cleared | + +*Example from Dash Core 0.12.2* + +Clears the ban list. + +```bash +dash-cli clearbanned +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all manually banned IPs/Subnets. +* [SetBan](../api/remote-procedure-calls-network.md#setban): attempts add or remove a IP/Subnet from the banned list. +* [ClearDiscouraged](../api/remote-procedure-calls-network.md#cleardiscouraged): clears list of discouraged nodes. + +## ClearDiscouraged + +*Added in Dash Core 19.0.0* + +The [`cleardiscouraged` RPC](../api/remote-procedure-calls-network.md#cleardiscouraged) clears all discouraged nodes. + +*Parameters: none* + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------- | +| `result` | null | Required
(exactly 1) | JSON `null` when the list was cleared | + +*Example from Dash Core 19.0.0* + +Clears the ban list. + +```bash +dash-cli cleardiscouraged +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all manually banned IPs/Subnets. +* [ClearBanned](../api/remote-procedure-calls-network.md#clearbanned): clears list of banned nodes. +* [SetBan](../api/remote-procedure-calls-network.md#setban): attempts add or remove a IP/Subnet from the banned list. + +## DisconnectNode + +*Added in Bitcoin Core 0.12.0* + +The [`disconnectnode` RPC](../api/remote-procedure-calls-network.md#disconnectnode) immediately disconnects from a specified node. + +*Parameter #1---hostname/IP address and port of node to disconnect* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `address` | string | Required
(exactly 1) | The node you want to disconnect from as a string in the form of `:`.

*Updated in Bitcoin Core 0.14.1* | + +*Parameter #2---nodeid* + +| Name | Type | Presence | Description | +| ------ | ------ | -------- | -------------------------------------------- | +| nodeid | number | Optional | The node ID (see `getpeerinfo` for node IDs) | + +_Result---`null` on success or error on failed disconnect_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------ | +| `result` | null | Required
(exactly 1) | JSON `null` when the node was disconnected | + +*Example from Dash Core 0.15.0* + +Disconnects following node by address. + +```bash +dash-cli -testnet disconnectnode 192.0.2.113:19999 +``` + +Result (no output from `dash-cli` because result is set to `null`). + +Disconnects following node by id. + +```bash +dash-cli -testnet disconnectnode "" 3 +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [AddNode](../api/remote-procedure-calls-network.md#addnode): attempts to add or remove a node from the addnode list, or to try a connection to a node once. +* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. + +## GetAddedNodeInfo + +The [`getaddednodeinfo` RPC](../api/remote-procedure-calls-network.md#getaddednodeinfo) returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. + +*Parameter #1---what node to display information about* + +| Name | Type | Presence | Description | +| ------ | ------ | -------------------- | ---------------------------------- | +| `node` | string | Optional
(0 or 1) | The node to get information about in the same `:` format as the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode). If provided, return information about this specific node, otherwise all nodes are returned. | + +*Result---a list of added nodes* + +| Name | Type | Presence | Description | +| ---------------------- | ------ | ----------------------- | ----------------------------------- | +| `result` | array | Required
(exactly 1) | An array containing objects describing each added node. If no added nodes are present, the array will be empty. Nodes added with `onetry` will not be returned | +| →
Added Node | object | Optional
(0 or more) | An object containing details about a single added node | +| → →
`addednode` | string | Required
(exactly 1) | An added node in the same `:` format as used in the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode). | +| → →
`connected` | bool | Optional
(0 or 1) | This will be set to `true` if the node is currently connected and `false` if it is not | +| → →
`addresses` | array | Optional
(0 or 1) | This will be an array of addresses belonging to the added node. Only present when `connected` is `true` | +| → → →
Address | object | Optional
(0 or more) | An object describing one of this node's addresses | +| → → → →
`address` | string | Required
(exactly 1) | An IP address and port number of the node. If the node was added using a DNS address, this will be the resolved IP address | +| → → → →
`connected` | string | Required
(exactly 1) | Whether or not the local node is connected to this addnode using this IP address. Valid values are:
• `false` for not connected
• `inbound` if the addnode connected to us
• `outbound` if we connected to the addnode | + +*Example from Dash Core 21.0.0* + +```bash +dash-cli getaddednodeinfo +``` + +Result (real hostname and IP address replaced with [RFC5737](http://tools.ietf.org/html/rfc5737) reserved address): + +```json +[ + { + "addednode": "192.0.2.113:19999", + "connected": true, + "addresses": [ + { + "address": "192.0.2.113:19999", + "connected": "outbound" + } + ] + } +] +``` + +*See also* + +* [AddNode](../api/remote-procedure-calls-network.md#addnode): attempts to add or remove a node from the addnode list, or to try a connection to a node once. +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. + +## GetConnectionCount + +The [`getconnectioncount` RPC](../api/remote-procedure-calls-network.md#getconnectioncount) returns the number of connections to other nodes. + +*Parameters: none* + +*Result---the number of connections to other nodes* + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | -------------------------------------------------------------------------- | +| `result` | number (int) | Required
(exactly 1) | The total number of connections to other nodes (both inbound and outbound) | + +*Example from Dash Core 0.12.2* + +```bash +dash-cli -testnet getconnectioncount +``` + +Result: + +```text +14 +``` + +*See also* + +* [GetNetTotals](../api/remote-procedure-calls-network.md#getnettotals): returns information about network traffic, including bytes in, bytes out, and the current time. +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. + +## GetNodeAddresses + +The [`getnodeaddresses` RPC](../api/remote-procedure-calls-network.md#getnodeaddresses) returns the known addresses which can potentially be used to find new nodes in the network. + +*Parameter #1---count* + +| Name | Type | Presence | Description | +| ------- | ------------ | -------------------- | -------------------------------------------------------------------------------------------------------------- | +| `count` | number (int) | Optional
(0 or 1) | The number of addresses to return. Limited to the smaller of 2500 or 23% of all known addresses (default = 1). | + +*Parameter #2---network* + +| Name | Type | Presence | Description | +| ---------- | ------ | -------------------- | ------------------------------------------------------------- | +| `network` | string | Optional
(0 or 1) | The network (ipv4, ipv6, onion, i2p) the node connected through. | + +*Result---the current bytes in, bytes out, and current time* + +| Name | Type | Presence | Description | +| --------------- | ------------ | ----------------------- | ---------------------------------------------------------- | +| `result` | array | Required
(exactly 1) | An array containing information about the known addresses. | +| →
`time` | number (int) | Required
(exactly 1) | The epoch time of when the node was last seen (in Unix) | +| →
`services` | number (int) | Required
(exactly 1) | The services offered | +| →
`address` | string | Required
(exactly 1) | The address of the node | +| →
`port` | number (int) | Required
(exactly 1) | The port of the node | +| →
`network` | string | Required
(exactly 1) | The network (ipv4, ipv6, onion, i2p) the node connected through | + +*Example from Dash Core 21.0.0* + +```bash +dash-cli -testnet getnodeaddresses +``` + +Result: + +```json +[ + { + "time": 1713783495, + "services": 3077, + "address": "34.214.102.160", + "port": 19999, + "network": "ipv4" + } +] +``` + +## GetNetTotals + +The [`getnettotals` RPC](../api/remote-procedure-calls-network.md#getnettotals) returns information about network traffic, including bytes in, bytes out, and the current time. + +*Parameters: none* + +*Result---the current bytes in, bytes out, and current time* + +| Name | Type | Presence | Description | +| -------------------------------- | ------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object containing information about the node's network totals | +| →
`totalbytesrecv` | number (int) | Required
(exactly 1) | The total number of bytes received since the node was last restarted | +| →
`totalbytessent` | number (int) | Required
(exactly 1) | The total number of bytes sent since the node was last restarted | +| →
`timemillis` | number (int) | Required
(exactly 1) | Unix epoch time in milliseconds according to the operating system's clock (not the node adjusted time) | +| →
`uploadtarget` | string :
object | Required
(exactly 1) | The upload target information | +| → →
`timeframe` | number (int) | Required
(exactly 1) | Length of the measuring timeframe in seconds (currently set to `24` hours) | +| → →
`target` | number (int) | Required
(exactly 1) | The maximum allowed outbound traffic in bytes (default is `0`). Can be changed with `-maxuploadtarget` | +| → →
`target_reached` | bool | Required
(exactly 1) | Indicates if the target is reached. If the target is reached the node won't serve SPV and historical block requests anymore | +| → →
`serve_historical_blocks` | bool | Required
(exactly 1) | Indicates if historical blocks are served | +| → →
`bytes_left_in_cycle` | number (int) | Required
(exactly 1) | Amount of bytes left in current time cycle. `0` is displayed if no upload target is set | +| → →
`time_left_in_cycle` | number (int) | Required
(exactly 1) | Seconds left in current time cycle. `0` is displayed if no upload target is set | + +*Example from Dash Core 0.12.2* + +```bash +dash-cli getnettotals +``` + +Result: + +```json +{ + "totalbytesrecv": 4661588, + "totalbytessent": 2899423, + "timemillis": 1507815162756, + "uploadtarget": { + "timeframe": 86400, + "target": 0, + "target_reached": false, + "serve_historical_blocks": true, + "bytes_left_in_cycle": 0, + "time_left_in_cycle": 0 + } +} +``` + +*See also* + +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. + +## GetNetworkInfo + +The [`getnetworkinfo` RPC](../api/remote-procedure-calls-network.md#getnetworkinfo) returns information about the node's connection to the network. + +*Parameters: none* + +*Result---information about the node's connection to the network* + +| Name | Type | Presence | Description | +| -------------------------------------- | ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | Information about this node's connection to the network | +| →
`version` | number | Required
(exactly 1) | This node's version of Dash Core in its internal integer format. For example, Dash Core 0.12.2 has the integer version number 120200 | +| →
`buildversion` | string | Required
(exactly 1) | The node's build version including RC info or commit as relevant | +| →
`subversion` | string | Required
(exactly 1) | The user agent this node sends in its [`version` message](../reference/p2p-network-control-messages.md#version) | +| →
`protocolversion` | number (int) | Required
(exactly 1) | The protocol version number used by this node. See the [protocol versions section](../reference/p2p-network-protocol-versions.md) for more information | +| →
`localservices` | string (hex) | Required
(exactly 1) | The services supported by this node as advertised in its [`version` message](../reference/p2p-network-control-messages.md#version) | +| →
`localservicesnames` | array | Required
(exactly 1) | _Added in Dash Core 18.0.0_
An array of strings describing the services offered, in human-readable form. | +| → →
SERVICE_NAME | string | Required
(exactly 1) | The service name. | +| →
`localrelay` | bool | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

The services supported by this node as advertised in its [`version` message](../reference/p2p-network-control-messages.md#version) | +| →
`timeoffset` | number (int) | Required
(exactly 1) | The offset of the node's clock from the computer's clock (both in UTC) in seconds. The offset may be up to 4200 seconds (70 minutes) | +| →
`networkactive` | bool | Required
(exactly 1) | Set to `true` if P2P networking is enabled. Set to `false` if P2P networking is disabled. Enabling/disabling done via [SetNetworkActive](../api/remote-procedure-calls-network.md#setnetworkactive) | +| →
`connections` | number (int) | Required
(exactly 1) | The total number of open connections (both outgoing and incoming) between this node and other nodes | +| →
`connections_in` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of inbound connections | +| →
`connections_out` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of outbound connections | +| →
`connections_mn` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of verified masternode connections | +| →
`connections_mn_in` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of inbound verified masternode connections | +| →
`connections_mn_out` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of outbound verified masternode connections | +| →
`socketevents` | string | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The socket events mode, either `epoll`, `poll`, or `select` | +| →
`networks` | array | Required
(exactly 1) | An array with three objects: one describing the IPv4 connection, one describing the IPv6 connection, and one describing the Tor hidden service (onion) connection | +| → →
Network | object | Optional
(0 to 3) | An object describing a network. If the network is unroutable, it will not be returned | +| → → →
`name` | string | Required
(exactly 1) | The name of the network. Either `ipv4`, `ipv6`, or `onion` | +| → → →
`limited` | bool | Required
(exactly 1) | Set to `true` if only connections to this network are allowed according to the `-onlynet` Dash Core command-line/configuration-file parameter. Otherwise set to `false` | +| → → →
`reachable` | bool | Required
(exactly 1) | Set to `true` if connections can be made to or from this network. Otherwise set to `false` | +| → → →
`proxy` | string | Required
(exactly 1) | The hostname and port of any proxy being used for this network. If a proxy is not in use, an empty string | +| → → →
`proxy_randomize_credentials` | bool | Required
(exactly 1) | *Added in Bitcoin Core 0.11.0*

Set to `true` if randomized credentials are set for this proxy. Otherwise set to `false` | +| →
`relayfee` | number (DASH) | Required
(exactly 1) | The minimum relay fee per kilobyte for transactions in order for this node to accept it into its memory pool | +| →
`incrementalfee` | number (DASH) | Required
(exactly 1) | *Added in Dash Core 0.12.3*

The minimum fee increment for mempool limiting or BIP 125 replacement in DASH/kB | +| →
`localaddresses` | array | Required
(exactly 1) | An array of objects each describing the local addresses this node believes it listens on | +| → →
Address | object | Optional
(0 or more) | An object describing a particular address this node believes it listens on | +| → → →
`address` | string | Required
(exactly 1) | An IP address or .onion address this node believes it listens on. This may be manually configured, auto detected, or based on [`version` messages](../reference/p2p-network-control-messages.md#version) this node received from its peers | +| → → →
`port` | number (int) | Required
(exactly 1) | The port number this node believes it listens on for the associated `address`. This may be manually configured, auto detected, or based on [`version` messages](../reference/p2p-network-control-messages.md#version) this node received from its peers | +| → → →
`score` | number (int) | Required
(exactly 1) | The number of incoming connections during the uptime of this node that have used this `address` in their [`version` message](../reference/p2p-network-control-messages.md#version) | +| →
`warnings` | string | Required
(exactly 1) | *Added in Bitcoin Core 0.11.0*

A plain-text description of any network warnings. If there are no warnings, an empty string will be returned. | + +*Example from Dash Core 21.0.0* + +```bash +dash-cli getnetworkinfo +``` + +Result (actual addresses have been replaced with [RFC5737](http://tools.ietf.org/html/rfc5737) reserved addresses): + +```json +{ + "version": 210100, + "buildversion": "v21.1.0", + "subversion": "/Dash Core:21.1.0/", + "protocolversion": 70233, + "localservices": "0000000000000c05", + "localservicesnames": [ + "NETWORK", + "BLOOM", + "NETWORK_LIMITED", + "HEADERS_COMPRESSED" + ], + "localrelay": true, + "timeoffset": 0, + "networkactive": true, + "connections": 10, + "connections_in": 0, + "connections_out": 10, + "connections_mn": 6, + "connections_mn_in": 0, + "connections_mn_out": 6, + "socketevents": "epoll", + "networks": [ + { + "name": "ipv4", + "limited": false, + "reachable": true, + "proxy": "", + "proxy_randomize_credentials": false + }, + { + "name": "ipv6", + "limited": false, + "reachable": true, + "proxy": "", + "proxy_randomize_credentials": false + }, + { + "name": "onion", + "limited": true, + "reachable": false, + "proxy": "", + "proxy_randomize_credentials": false + }, + { + "name": "i2p", + "limited": true, + "reachable": false, + "proxy": "", + "proxy_randomize_credentials": false + }, + { + "name": "cjdns", + "limited": true, + "reachable": false, + "proxy": "", + "proxy_randomize_credentials": false + } + ], + "relayfee": 0.00001000, + "incrementalfee": 0.00001000, + "localaddresses": [ + ], + "warnings": "Make sure to encrypt your wallet and delete all non-encrypted backups after you have verified that the wallet works!" +} +``` + +*See also* + +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. +* [GetNetTotals](../api/remote-procedure-calls-network.md#getnettotals): returns information about network traffic, including bytes in, bytes out, and the current time. +* [SetNetworkActive](../api/remote-procedure-calls-network.md#setnetworkactive): disables/enables all P2P network activity. + +## GetPeerInfo + +The [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo) returns data about each connected network node. + +*Parameters: none* + +*Result---information about each currently-connected network node* + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `result` | array | Required
(exactly 1) | An array of objects each describing one connected node. If there are no connections, the array will be empty | +| →
Node | object | Optional
(0 or more) | An object describing a particular connected node | +| → →
`id` | number (int) | Required
(exactly 1) | The node's index number in the local node address database | +| → →
`addr` | string | Required
(exactly 1) | The IP address and port number used for the connection to the remote node | +| → →
`addrlocal` | string | Optional
(0 or 1) | Our IP address and port number according to the remote node. May be incorrect due to error or lying. Most SPV nodes set this to `127.0.0.1:9999` | +| → →
`network` | string | Optional
(0 or 1) | **Added in Dash Core 20.0.0**
The network being used (ipv4, ipv6, onion, i2p, not_publicly_routable) | +| → →
`mapped_as` | string | Optional
(0 or 1) | _Added in Dash Core 18.0.0_
The AS in the BGP route to the peer used for diversifying peer selection | +| → →
`addrbind` | string | Optional
(0 or 1) | Bind address of the connection to the peer | +| → →
`services` | string (hex) | Required
(exactly 1) | The services advertised by the remote node in its [`version` message](../reference/p2p-network-control-messages.md#version) | +| → →
`servicesnames` | array | Required
(exactly 1) | _Added in Dash Core 18.0.0_
An array of strings describing the services offered, in human-readable form. | +| → → →
SERVICE_NAME | string | Required
(exactly 1) | The service name if it is recognised. | +| → →
`verified_proregtx_hash` | string (hex) | Optional
(0 or 1) | The ProRegTx of the masternode | +| → →
`verified_pubkey_hash` | string (hex) | Optional
(0 or 1) | The hashed operator public key of the masternode | +| `relaytxes` | bool | Required
(exactly 1) | Whether peer has asked us to relay transactions to it. | +| → →
`lastsend` | number (int) | Required
(exactly 1) | The Unix epoch time when we last successfully sent data to the TCP socket for this node | +| → →
`lastrecv` | number (int) | Required
(exactly 1) | The Unix epoch time when we last received data from this node | +| `last_transaction` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.1.0**
The UNIX epoch time of the last valid transaction received from this peer. | +| `last_block` | number (int) | Required
(exactly 1) | **Added in Dash Core 20.1.0**
The UNIX epoch time of the last block received from this peer. | +| → →
`bytessent` | number (int) | Required
(exactly 1) | The total number of bytes we've sent to this node | +| → →
`bytesrecv` | number (int) | Required
(exactly 1) | The total number of bytes we've received from this node | +| → →
`conntime` | number (int) | Required
(exactly 1) | The Unix epoch time when we connected to this node | +| → →
`timeoffset` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The time offset in seconds | +| → →
`pingtime` | number (real) | Required
(exactly 1) | The number of seconds this node took to respond to our last P2P [`ping` message](../reference/p2p-network-control-messages.md#ping) | +| → →
`minping` | number (real) | Optional
(0 or 1) | *Updated in Bitcoin Core 0.13.0*

The minimum observed ping time (if any at all) | +| → →
`pingwait` | number (real) | Optional
(0 or 1) | The number of seconds we've been waiting for this node to respond to a P2P [`ping` message](../reference/p2p-network-control-messages.md#ping). Only shown if there's an outstanding [`ping` message](../reference/p2p-network-control-messages.md#ping) | +| → →
`version` | number (int) | Required
(exactly 1) | The protocol version number used by this node. See the [protocol versions section](../reference/p2p-network-protocol-versions.md) for more information | +| → →
`subver` | string | Required
(exactly 1) | The user agent this node sends in its [`version` message](../reference/p2p-network-control-messages.md#version). This string will have been sanitized to prevent corrupting the JSON results. May be an empty string | +| → →
`inbound` | bool | Required
(exactly 1) | Set to `true` if this node connected to us (inbound); set to `false` if we connected to this node (outbound) | +| → →
`bip152_hb_to` | bool | Required
(exactly 1) | Whether we selected peer as (compact blocks) high-bandwidth peer | +| → →
`bip152_hb_from` | bool | Required
(exactly 1) | Whether peer selected us as (compact blocks) high-bandwidth peer | +| → →
`addnode` | bool | Required
(exactly 1) | **DEPRECATED, returned only if the config option -deprecatedrpc=getpeerinfo_addnode is passed**
Set to `true` if this node was added via the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode). | +| → →
`masternode` | bool | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Whether connection was due to masternode connection attempt | +| → →
`banscore` | number (int) | Required
(exactly 1) | *DEPRECATED, returned only if config option -deprecatedrpc=banscore is passed*
The ban score we've assigned the node based on any misbehavior it's made. By default, Dash Core disconnects when the ban score reaches `100` | +| → →
`startingheight` | number (int) | Required
(exactly 1) | The height of the remote node's block chain when it connected to us as reported in its [`version` message](../reference/p2p-network-control-messages.md#version) | +| → →
`synced_headers` | number (int) | Required
(exactly 1) | The highest-height header we have in common with this node based the last P2P [`headers` message](../reference/p2p-network-data-messages.md#headers) it sent us. If a [`headers` message](../reference/p2p-network-data-messages.md#headers) has not been received, this will be set to `-1` | +| → →
`synced_blocks` | number (int) | Required
(exactly 1) | The highest-height block we have in common with this node based on P2P [`inv` messages](../reference/p2p-network-data-messages.md#inv) this node sent us. If no block [`inv` messages](../reference/p2p-network-data-messages.md#inv) have been received from this node, this will be set to `-1` | +| → →
`inflight` | array | Required
(exactly 1) | An array of blocks which have been requested from this peer. May be empty | +| → → →
Blocks | number (int) | Optional
(0 or more) | The height of a block being requested from the remote peer | +| → →
`addr_relay_enabled` | bool | Required
(exactly 1) | Whether we participate in address relay with this peer. | +| → →
`addr_processed` | number (int) | Required
(exactly 1) | The total number of addresses processed, excluding those dropped due to rate limiting. | +| → →
`addr_rate_limited` | number (int) | Required
(exactly 1) | The total number of addresses dropped due to rate limiting. | +| → →
`whitelisted` | bool | Required
(exactly 1) | **DEPRECATED, returned only if config option -deprecatedrpc=whitelisted is passed**
Set to `true` if the remote peer has been whitelisted; otherwise, set to `false`. Whitelisted peers will not be banned if their ban score exceeds the maximum (100 by default). By default, peers connecting from localhost are whitelisted | +| → →
`permissions` | array | Required
(exactly 1) | _Added in Dash Core 18.0.0_
Any special permissions that have been granted to this peer | +| → →
`bytessent_per_msg` | string :
object | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

Information about total sent bytes aggregated by message type | +| → → →
Message Type | number (int) | Required
(1 or more) | Total sent bytes aggregated by message type. One field for every used message type | +| → →
`bytesrecv_per_msg` | string :
object | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

Information about total received bytes aggregated by message type | +| → → →
Message Type | number (int) | Required
(1 or more) | Total received bytes aggregated by message type. One field for every used message type | +| `connection_type` | string | Required
(exactly 1) | **Added in Dash Core 20.1.0**
Type of connection:
outbound-full-relay, block-relay-only, inbound, manual, addr-fetch, feeler.
Describes how the connection was established. Set to `true` if this node was added via the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode).
**Note: This output is subject to change in future releases as connection behaviors are refined.** | + +*Example from Dash Core 21.0.0* + +```bash +dash-cli -testnet getpeerinfo +``` + +Result (edited to show only a single entry, with IP addresses changed to +[RFC5737](http://tools.ietf.org/html/rfc5737) reserved IP addresses): + +```json +[ + { + "id": 0, + "addr": "198.51.100.1:19999", + "addrbind": "192.0.2.1:34896", + "addrlocal": "203.0.113.1:34896", + "network": "ipv4", + "services": "0000000000000c05", + "servicesnames": [ + "NETWORK", + "BLOOM", + "NETWORK_LIMITED", + "HEADERS_COMPRESSED" + ], + "lastsend": 1715200494, + "lastrecv": 1715200436, + "last_transaction": 0, + "last_block": 1715200219, + "bytessent": 70135, + "bytesrecv": 486133, + "conntime": 1715200196, + "timeoffset": 0, + "pingtime": 0.105995, + "minping": 0.095181, + "version": 70232, + "subver": "/Dash Core:21.0.0(dcg-masternode-7)/", + "inbound": false, + "bip152_hb_to": false, + "bip152_hb_from": false, + "masternode": false, + "startingheight": 1022323, + "synced_headers": 1022323, + "synced_blocks": 1022323, + "inflight": [ + ], + "relaytxes": false, + "addr_relay_enabled": false, + "addr_processed": 0, + "addr_rate_limited": 0, + "permissions": [ + ], + "bytessent_per_msg": { + "dsq": 7802, + "getdata": 35555, + "getheaders2": 1053, + "getsporks": 24, + "govsync": 25182, + "inv": 61, + "ping": 96, + "pong": 96, + "sendaddrv2": 24, + "sendcmpct": 33, + "sendheaders2": 24, + "verack": 24, + "version": 161 + }, + "bytesrecv_per_msg": { + "addrv2": 40, + "block": 361498, + "getheaders2": 1053, + "govobj": 916, + "govobjvote": 47150, + "headers2": 62247, + "inv": 9291, + "mnauth": 152, + "ping": 96, + "pong": 96, + "sendaddrv2": 24, + "sendcmpct": 33, + "senddsq": 25, + "sendheaders2": 24, + "spork": 2420, + "ssc": 864, + "verack": 24, + "version": 180 + }, + "connection_type": "block-relay-only" + } +] +``` + +*See also* + +* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. +* [GetNetTotals](../api/remote-procedure-calls-network.md#getnettotals): returns information about network traffic, including bytes in, bytes out, and the current time. +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. + +## ListBanned + +*Added in Bitcoin Core 0.12.0* + +The [`listbanned` RPC](../api/remote-procedure-calls-network.md#listbanned) lists all ***manually banned*** IPs/Subnets. + +:::{note} +Dash Core 18.1.0 introduced changes to how misbehaving peers are treated. As a result they are no longer included in this RPC response. See the [release notes](https://github.com/dashpay/dash/blob/v18.1.0/doc/release-notes.md#changes-regarding-misbehaving-peers) for additional details. +::: + +*Parameters: none* + +*Result---information about each banned IP/Subnet* + +| Name | Type | Presence | Description | +| ----------------------- | --------------- | --------------------------- | ----------- | +| `result` | object | Required
(exactly 1) | An array of objects each describing one entry. If there are no entries in the ban list, the array will be empty | +| →
Node | object | Optional
(0 or more) | A ban list entry | +| → →
`address` | string | Required
(exactly 1) | The IP/Subnet of the entry | +| → →
`banned_until` | number
(int) | Required
(exactly 1) | The Unix epoch time when the entry was added to the ban list | +| → →
`ban_created` | number
(int) | Required
(exactly 1) | The Unix epoch time until the IP/Subnet is banned | +| `ban_duration` | number (int) | Required
(exactly 1) | The ban duration, in seconds. | +| `time_remaining` | number (int) | Required
(exactly 1) | The time remaining until the ban expires, in seconds. | + +*Examples from Dash Core 21.1.0* + +```bash +dash-cli listbanned +``` + +Result: + +```json +[ + { + "address": "192.0.2.201/32", + "ban_created": 1715614036, + "banned_until": 1715617636, + "ban_duration": 3600, + "time_remaining": 3577 + }, + { + "address": "192.0.2.101/32", + "ban_created": 1715614056, + "banned_until": 1715617656, + "ban_duration": 3600, + "time_remaining": 3597 + } +] +``` + +*See also* + +* [SetBan](../api/remote-procedure-calls-network.md#setban): attempts add or remove a IP/Subnet from the banned list. +* [ClearBanned](../api/remote-procedure-calls-network.md#clearbanned): clears list of banned nodes. + +## Ping + +The [`ping` RPC](../api/remote-procedure-calls-network.md#ping) sends a P2P ping message to all connected nodes to measure ping time. Results are provided by the [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo) pingtime and pingwait fields as decimal seconds. The P2P [`ping` message](../reference/p2p-network-control-messages.md#ping) is handled in a queue with all other commands, so it measures processing backlog, not just network ping. + +*Parameters: none* + +_Result---`null`_ + +| Name | Type | Presence | Description | +| -------- | ---- | -------- | ------------------ | +| `result` | null | Required | Always JSON `null` | + +*Example from Dash Core 0.12.2* + +```bash +dash-cli -testnet ping +``` + +(Success: no result printed.) + +Get the results using the [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo): + +```bash +dash-cli -testnet getpeerinfo | grep ping +``` + +Results: + +```json + "pingtime" : 0.11790800, + "pingtime" : 0.22673400, + "pingtime" : 0.16451900, + "pingtime" : 0.12465200, + "pingtime" : 0.13267900, + "pingtime" : 0.23983300, + "pingtime" : 0.16764700, + "pingtime" : 0.11337300, +``` + +*See also* + +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. +* [P2P Ping Message](../reference/p2p-network-control-messages.md#ping) + +## SetBan + +*Added in Bitcoin Core 0.12.0* + +The [`setban` RPC](../api/remote-procedure-calls-network.md#setban) attempts add or remove a IP/Subnet from the banned list. + +*Parameter #1---IP/Subnet of the node* + +| Name | Type | Presence | Description | +| ------------ | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| IP(/Netmask) | string | Required
(exactly 1) | The node to add or remove as a string in the form of ``. The IP address may be a hostname resolvable through DNS, an IPv4 address, an IPv4-as-IPv6 address, or an IPv6 address | + +*Parameter #2---whether to add or remove the node* + +| Name | Type | Presence | Description | +| ------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Command | string | Required
(exactly 1) | What to do with the IP/Subnet address above. Options are:
• `add` to add a node to the addnode list
• `remove` to remove a node from the list. If currently connected, this will disconnect immediately | + +*Parameter #3---time how long the ip is banned* + +| Name | Type | Presence | Description | +| ------- | ---------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bantime | numeric
(int) | Optional
(0 or 1) | Time in seconds how long (or until when if `absolute` is set) the entry is banned. The default is 24h which can also be overwritten by the -bantime startup argument | + +*Parameter #4---whether a relative or absolute timestamp* + +| Name | Type | Presence | Description | +| -------- | ---- | -------------------- | ---------------------------------------------------------------------------------------- | +| Absolute | bool | Optional
(0 or 1) | If set, the bantime must be a absolute timestamp in seconds since epoch (Jan 1 1970 GMT) | + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------ | +| `result` | null | Required
(exactly 1) | Always JSON `null` | + +*Example from Dash Core 0.12.2* + +Ban the following node. + +```bash +dash-cli -testnet setban 192.0.2.113 add 2592000 +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all manually banned IPs/Subnets. +* [ClearBanned](../api/remote-procedure-calls-network.md#clearbanned): clears list of banned nodes. + +## SetNetworkActive + +*Added in Bitcoin Core 0.14.0* + +The [`setnetworkactive` RPC](../api/remote-procedure-calls-network.md#setnetworkactive) disables/enables all P2P network activity. + +*Parameter #1---whether to disable or enable all P2P network activity* + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ---------------------------------------------------------------------------------------------------- | +| Activate | bool | Required
(exactly 1) | Set to `true` to enable all P2P network activity. Set to `false` to disable all P2P network activity | + +_Result---`null` or error on failure_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | JSON `null`. The JSON-RPC error field will be set only if you entered an invalid parameter | + +*Example from Dash Core 0.12.2* + +```bash +dash-cli setnetworkactive true +``` + +Result (no output from `dash-cli` because result is set to `null`). + +*See also* + +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. diff --git a/docs/core/api/remote-procedure-calls-raw-transactions.md b/docs/core/api/remote-procedure-calls-raw-transactions.md new file mode 100644 index 000000000..adedd0c9c --- /dev/null +++ b/docs/core/api/remote-procedure-calls-raw-transactions.md @@ -0,0 +1,1556 @@ +```{eval-rst} +.. meta:: + :title: Raw Transaction RPCs + :description: A list of remote procedure calls in Dash Core that are used to work with raw transactions and partially signed transactions (PSBT). +``` + +# Raw Transactions + +## AnalyzePSBT + +The analyzepsbt RPC analyzes and provides information about the current status of a PSBT and its inputs. + +_Parameter #1---psbt_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------------------------- | +| `psbt` | string | Required
(Exactly 1) | The base64-encoded partially signed transaction | + +_Result:_ + +| Name | Type | Presence | Description | +| ---------------------------- | ------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | A JSON object | +| → `inputs` | array | Required
(exactly 1 ) | An array that contains main details about the PSBT. | +| →→`has_utxo` | boolean | Required (exactly 1) | Whether a UTXO is provided | +| →→`is_final` | boolean | Required (exactly 1) | Whether the input is finalized | +| →→`missing` | object | Optional (0 or 1) | A JSON object that includes the data missing to complete the input. | +| →→→`pubkeys` | array | Optional (0 or 1) | Array containing public key data. | +| →→→→`hex` | string | Required
(0 or more) | Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing. | +| →→→`signatures` | array | Optional (0 or 1) | Array containing public key data | +| →→→→`hex` | string | Required
(0 or more) | Public key ID, hash160 of the public key, of a public key whose signature is missing. | +| →→→ `"redeemscript" : "hex"` | string | Optional
(0 or 1) | Hash160 of the redeemScript that is missing. | +| →→ `"next" : "str"` | string | Optional
(0 or 1) | Role of the next person that this input needs to go to | +| → `estimated_vsize` | numeric | Optional (0 or 1) | Estimated vsize of the final signed transaction | +| → `estimated_feerate` | numeric | Optional (0 or 1) | Estimated feerate of the final signed transaction in DASH/kB. Shown only if all UTXO slots in the PSBT have been filled. | +| → `fee` | numeric | Optional (0 or 1) | The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled. | +| → `"next" : "str"` | string | Required
(exactly 1) | Role of the next person that this psbt needs to go to | +| → `"error" : "str"` | string | Required
(exactly 1) | Error message if there is one | + +_Example from Dash Core 18.2.0_ + +```bash +dash-cli -testnet analyzepsbt cHNidP8BAHcCAAAAAWtJCIbAGYsCjGxcsUXE6zsQVaIkp6EFqt7/QbaeyR4GAQAAAAD/////AgAgX6ASAAAAGXapFEhUhUJfqZUE7BY4rEIT88/J8y7ziKzAqPm+AQAAABl2qRSBHqzBTbjrtbZEhtxDQAwCJrQopIisAAAAAAAAAAA= +``` + +Result: + +``` +{ + "inputs": [ + { + "has_utxo": false, + "is_final": false, + "next": "updater" + } + ], + "next": "updater" +} +``` + +_See also:_ + +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combines multiple partially-signed Dash transactions into one transaction. +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## CombinePSBT + +The [`combinepsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#combinepsbt) combines multiple partially-signed Dash transactions into one transaction. Implements the Combiner role. This should be used only with `createrawtransaction` and `fundrawtransaction`. `createpsbt` and `walletcreatefundedpsbt` should be used for new applications. + +_Parameter #1---txs_ + +| Name | Type | Presence | Description | +| ------------ | ------ | ----------------------- | ----------------------------------------------------------- | +| Transactions | string | Required
(exactly 1) | An array of base64 strings of partially signed transactions | +| → psbt | string | Required
(exactly 1) | A base64 string of a PSBT | + +_Result---psbt_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ----------------------------------------------- | +| `result` | string | Required
(Exactly 1) | The base64-encoded partially signed transaction | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet combinepsbt '["cHNidP8BAFUCAAAAAQcxBA7Cdee2EvS1IyiRPzCVxbt9wFnrqry3AMUBOYvqAAAAAAD/////AQDh9QUAAAAAGXapFLBKVDBt/eE2UU3EUaAiMeuIUMC1iKwAAAAAAAEA3wIAAAAB9LcsqdmAuKwHgkt0HMpJuSx8RnBxL73+ORGz4ogdt+gBAAAAakcwRAIgJR7zIP4o/GRTAyvswKmdFDx+PBO/tB24s0ydQcRpOZECIAvm3Q2xMIpdAAhl17yQAkQjElRbZEIbcr7pGCpNbzqsASEDIcX0+C0b8ib3pvxlx809S7xOmAj0NH3i9vFe8pUTvHX+////AgBlzR0AAAAAF6kUJOSskBQ3xyDtInRjI2eW1QraJ9eHIcmaOwAAAAAZdqkUPU2zmkAo79MmS8yW1oYUjb7jz0qIrOosCQAiAgN+48COTyy1UqO7c63g5A9YEMnBIiYF+FcREEaGgxAHukcwRAIgfwcMEFPrmy81y5NWFj8M0CHUBlzzQxr4RoxSmzvmVIQCIH22f9/A/K0keQ7rKcya0E5zTlnYDnly8VJIrj2yUgflAQEER1IhA37jwI5PLLVSo7tzreDkD1gQycEiJgX4VxEQRoaDEAe6IQK1B5TV+2qTmU+/c3Pzl61bklYbfj9yg+jbdGyMoKE/vFKuAAA=", "cHNidP8BAFUCAAAAAQcxBA7Cdee2EvS1IyiRPzCVxbt9wFnrqry3AMUBOYvqAAAAAAD/////AQDh9QUAAAAAGXapFLBKVDBt/eE2UU3EUaAiMeuIUMC1iKwAAAAAAAEA3wIAAAAB9LcsqdmAuKwHgkt0HMpJuSx8RnBxL73+ORGz4ogdt+gBAAAAakcwRAIgJR7zIP4o/GRTAyvswKmdFDx+PBO/tB24s0ydQcRpOZECIAvm3Q2xMIpdAAhl17yQAkQjElRbZEIbcr7pGCpNbzqsASEDIcX0+C0b8ib3pvxlx809S7xOmAj0NH3i9vFe8pUTvHX+////AgBlzR0AAAAAF6kUJOSskBQ3xyDtInRjI2eW1QraJ9eHIcmaOwAAAAAZdqkUPU2zmkAo79MmS8yW1oYUjb7jz0qIrOosCQAiAgK1B5TV+2qTmU+/c3Pzl61bklYbfj9yg+jbdGyMoKE/vEcwRAIgP3PuTCqVSU0Cx5UDknTwmAFJ6N80sV+YiUmy392/4BUCIEB6QOZe3SJeJ3OVmBCmoEPWcHqbstIvxhCxJ2h+fkSZAQEER1IhA37jwI5PLLVSo7tzreDkD1gQycEiJgX4VxEQRoaDEAe6IQK1B5TV+2qTmU+/c3Pzl61bklYbfj9yg+jbdGyMoKE/vFKuAAA="]' +``` + +Result: + +``` +cHNidP8BAFUCAAAAAQcxBA7Cdee2EvS1IyiRPzCVxbt9wFnrqry3AMUBOYvqAAAAAAD/////AQDh9QUAAAAAGXapFLBKVDBt/eE2UU3EUaAiMeuIUMC1iKwAAAAAAAEA3wIAAAAB9LcsqdmAuKwHgkt0HMpJuSx8RnBxL73+ORGz4ogdt+gBAAAAakcwRAIgJR7zIP4o/GRTAyvswKmdFDx+PBO/tB24s0ydQcRpOZECIAvm3Q2xMIpdAAhl17yQAkQjElRbZEIbcr7pGCpNbzqsASEDIcX0+C0b8ib3pvxlx809S7xOmAj0NH3i9vFe8pUTvHX+////AgBlzR0AAAAAF6kUJOSskBQ3xyDtInRjI2eW1QraJ9eHIcmaOwAAAAAZdqkUPU2zmkAo79MmS8yW1oYUjb7jz0qIrOosCQAiAgN+48COTyy1UqO7c63g5A9YEMnBIiYF+FcREEaGgxAHukcwRAIgfwcMEFPrmy81y5NWFj8M0CHUBlzzQxr4RoxSmzvmVIQCIH22f9/A/K0keQ7rKcya0E5zTlnYDnly8VJIrj2yUgflASICArUHlNX7apOZT79zc/OXrVuSVht+P3KD6Nt0bIygoT+8RzBEAiA/c+5MKpVJTQLHlQOSdPCYAUno3zSxX5iJSbLf3b/gFQIgQHpA5l7dIl4nc5WYEKagQ9Zwepuy0i/GELEnaH5+RJkBAQRHUiEDfuPAjk8stVKju3Ot4OQPWBDJwSImBfhXERBGhoMQB7ohArUHlNX7apOZT79zc/OXrVuSVht+P3KD6Nt0bIygoT+8Uq4AAA== +``` + +_See also:_ + +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## CombineRawTransaction + +The [`combinerawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction) combine multiple partially signed transactions into one transaction. + +The combined transaction may be another partially signed transaction or a fully signed transaction. + +_Parameter #1---txs_ + +| Name | Type | Presence | Description | +| ---- | ------ | -------- | ------------------------------------------------------------ | +| txs | string | Required | A json array of hex strings of partially signed transactions | + +_Result---hex-encoded raw transaction with signature(s)_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------------------------------------ | +| `result` | string | Required
(Exactly 1) | The resulting raw transaction in serialized transaction format encoded as hex. | + +_Example from Dash Core 0.15.0_ + +The following example shows a fully signed two input transaction being assembled +by combining two partially signed transactions. The first hex-encoded string is +the transaction with only the first input signed. The second hex-encoded string is +the transaction with only the second input signed. + +```bash +dash-cli -testnet combinerawtransaction '[ + "0200000002fdb27b4f2b80a5fd3b96602618a6ccf7bdde504bf90989610b19ed6ecd769520010000006b483045022100f8770316327966fb1972338d14db8d38048455da8b62f6350b117c797cea459e02206c63c103cf53ce1d24a313b3e6853913fa14febafd733e683b6eb46a7beec0fa012103c67d86944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9ffffffff0d052e9b13c53bb342d772767732ffe4fa9f1c150629d3fa79655267baa7c86a0100000000ffffffff0200ca9a3b000000001976a9144139b147b5cef5fef5bcdb02fcdf55e426f74dbb88ac00daf89a000000001976a91465f53f2095c99ce152ff3bc8a8f027d8a77cbdcb88ac00000000", + "0200000002fdb27b4f2b80a5fd3b96602618a6ccf7bdde504bf90989610b19ed6ecd7695200100000000ffffffff0d052e9b13c53bb342d772767732ffe4fa9f1c150629d3fa79655267baa7c86a010000006b4830450221008c3abc11ea84cc98cf674afc5b6d3d078d672768d289f2ab976ea4b2a49129fc022008470458b1b179800e7f5348196d510d2f147e69fe836c94135fc5c620312acd012102912ba98d6641f79864d04d41523167f5db267e45d1633e9243a0be7efb675719ffffffff0200ca9a3b000000001976a9144139b147b5cef5fef5bcdb02fcdf55e426f74dbb88ac00daf89a000000001976a91465f53f2095c99ce152ff3bc8a8f027d8a77cbdcb88ac00000000" +]' +``` + +Result: + +```bash +0200000002fdb27b4f2b80a5fd3b96602618a6ccf7bdde504bf90989610b19ed6ecd7695\ +20010000006b483045022100f8770316327966fb1972338d14db8d38048455da8b62f635\ +0b117c797cea459e02206c63c103cf53ce1d24a313b3e6853913fa14febafd733e683b6e\ +b46a7beec0fa012103c67d86944315838aea7ec80d390b5d09b91b62483370d4979da5cc\ +f7a7df77a9ffffffff0d052e9b13c53bb342d772767732ffe4fa9f1c150629d3fa796552\ +67baa7c86a010000006b4830450221008c3abc11ea84cc98cf674afc5b6d3d078d672768\ +d289f2ab976ea4b2a49129fc022008470458b1b179800e7f5348196d510d2f147e69fe83\ +6c94135fc5c620312acd012102912ba98d6641f79864d04d41523167f5db267e45d1633e\ +9243a0be7efb675719ffffffff0200ca9a3b000000001976a9144139b147b5cef5fef5bc\ +db02fcdf55e426f74dbb88ac00daf89a000000001976a91465f53f2095c99ce152ff3bc8\ +a8f027d8a77cbdcb88ac00000000 +``` + +_See also:_ + +* [AnalyzePSBT](../api/remote-procedure-calls-raw-transactions.md#analyzepsbt): analyzes and provides information about the current status of a PSBT and its inputs. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. +* [Serialized Transaction Format](../reference/transactions-raw-transaction-format.md) + +## ConvertToPSBT + +The [`converttopsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#converttopsbt) converts a network serialized transaction to a PSBT. This should be used only with `createrawtransaction` and `fundrawtransaction`. `createpsbt` and `walletcreatefundedpsbt` should be used for new applications. + +_Parameter #1---hexstring_ + +| Name | Type | Presence | Description | +| ---- | ------ | -------- | ----------------------------------- | +| hex | string | Required | The hex string of a raw transaction | + +_Parameter #2---permitsigdata_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| data | bool | Optional | If true, any signatures in the input will be discarded and conversion will continue. If false, RPC will fail if any signatures are present. | + +_Result---psbt_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------- | +| `result` | string | Required
(Exactly 1) | The resulting raw transaction is a base64-encoded | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet converttopsbt 02000000016b490886c0198b028c6c5cb145c4eb3b1055a224a7a105aadeff41b69ec91e060100000000ffffffff0200205fa0120000001976a914485485425fa99504ec1638ac4213f3cfc9f32ef388acc0a8f9be010000001976a914811eacc14db8ebb5b64486dc43400c0226b428a488ac00000000 +``` + +Result: + +``` +cHNidP8BAHcCAAAAAWtJCIbAGYsCjGxcsUXE6zsQVaIkp6EFqt7/QbaeyR4GAQAAAAD/////AgAgX6ASAAAAGXapFEhUhUJfqZUE7BY4rEIT88/J8y7ziKzAqPm+AQAAABl2qRSBHqzBTbjrtbZEhtxDQAwCJrQopIisAAAAAAAAAAA= +``` + +_See also:_ + +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. +* [Serialized Transaction Format](../reference/transactions-raw-transaction-format.md) +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## CreatePSBT + +The [`createpsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#createpsbt) creates a transaction in the Partially Signed Transaction (PST) format. + +Implements the Creator role. + +_Parameter #1---Inputs_ + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| Transactions | array | Required
(exactly 1) | An array of objects, each one to be used as an input to the transaction | +| → Input | object | Required
(1 or more) | An object describing a particular input | +| → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the outpoint to be spent encoded as hex in RPC byte order | +| → →
`vout` | number (int) | Required
(exactly 1) | The output index number (vout) of the outpoint to be spent; the first output in a transaction is index `0` | +| → →
`Sequence` | number (int) | Optional
(0 or 1) | The sequence number to use for the input | + +_Parameter #2---Outputs_ + +| Name | Type | Presence | Description | +| -------------- | ---------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------- | +| Outputs | array | Required
(exactly 1) | A JSON array with outputs as key-value pairs | +| → Output | object | Required
(1 or more) | An object describing a particular output | +| → →
Address | string : number (Dash) | Optional
(0 or 1) | A key-value pair. The key (string) is the Dash address, the value (float or string) is the amount in DASH | +| → →
Data | `data` : string (hex) | Optional
(0 or 1) | A key-value pair. The key must be `data`, the value is hex encoded data | + +_Parameter #3---locktime_ + +| Name | Type | Presence | Description | +| -------- | ------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| Locktime | numeric (int) | Optional
(0 or 1) | Indicates the earliest time a transaction can be added to the block chain. Non-0 value also locktime-activates inputs. | + +_Result---the raw transaction in base64_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------------------------------- | +| Result | string | Required
(Exactly 1) | The resulting raw transaction (base64-encoded string) | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet createpsbt "[{\"txid\":\"2662c87e1761ed5f4e98a0640b2608114d86f282824a51bd624985d236c71178\",\"vout\":0}]" "[{\"data\":\"00010203\"}]" +``` + +Result: + +``` +cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA= +``` + +_See also:_ + +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## CreateRawTransaction + +The [`createrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction) creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. + +_Parameter #1---Inputs_ + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| Transactions | array | Required
(exactly 1) | An array of objects, each one to be used as an input to the transaction | +| → Input | object | Required
(1 or more) | An object describing a particular input | +| → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the outpoint to be spent encoded as hex in RPC byte order | +| → →
`vout` | number (int) | Required
(exactly 1) | The output index number (vout) of the outpoint to be spent; the first output in a transaction is index `0` | +| → →
`Sequence` | number (int) | Optional
(0 or 1) | Added in Dash Core 0.12.3.0.

The sequence number to use for the input | + +_Parameter #2---Outputs_ + +| Name | Type | Presence | Description | +| -------------- | ---------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------- | +| Outputs | array | Required
(exactly 1) | A JSON array with outputs as key-value pairs | +| → Output | object | Required
(1 or more) | An object describing a particular output | +| → →
Address | string : number (Dash) | Optional
(0 or 1) | A key-value pair. The key (string) is the Dash address, the value (float or string) is the amount in DASH | +| → →
Data | `data` : string (hex) | Optional
(0 or 1) | A key-value pair. The key must be `data`, the value is hex encoded data | + +_Parameter #3---locktime_ + +| Name | Type | Presence | Description | +| -------- | ------------- | -------------------- | ------------------------------------------------------------------------- | +| Locktime | numeric (int) | Optional
(0 or 1) | Indicates the earliest time a transaction can be added to the block chain | + +_Result---the unsigned raw transaction in hex_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | string | Required
(Exactly 1) | The resulting unsigned raw transaction in serialized transaction format encoded as base-64. If the transaction couldn't be generated, this will be set to JSON `null` and the JSON-RPC error field may contain an error message | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet createrawtransaction ''' + [ + { + "txid": "061ec99eb641ffdeaa05a1a724a255103bebc445b15c6c8c028b19c08608496b", + "vout" : 1 + } + ]''' \ + ''' + [ + { + "ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv": 800 + }, + { + "yY6AmGopsZS31wy1JLHR9P6AC6owFaXwuh": 74.99 + } + ]''' \ + 0 +``` + +Result: + +```text +02000000016b490886c0198b028c6c5cb145c4eb3b1055a224a7a105aadeff41b69ec91e06010000\ +0000ffffffff0200205fa0120000001976a914485485425fa99504ec1638ac4213f3cfc9f32ef388\ +acc0a8f9be010000001976a914811eacc14db8ebb5b64486dc43400c0226b428a488ac00000000 +``` + +_See also:_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. +* [Serialized Transaction Format](../reference/transactions-raw-transaction-format.md) + +## DecodePSBT + +The [`decodepsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#decodepsbt) returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. + +_Parameter #1---The PSBT base64 string_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ---------------------- | +| `psbt` | string | Required
(exactly 1) | The PSBT base64 string | + +_Result---the decoded transaction_ + +| Name | Type | Presence | Description | +| -------------------------------- | ------------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object describing the decoded transaction, or JSON `null` if the transaction could not be decoded | +| →
`tx` | string (hex) | Required
(exactly 1) | The decoded network-serialized unsigned transaction. The layout is the same as the output of [decoderawtransaction](#decoderawtransaction). | +| →
`unknown` | object | Required
(exactly 1) | The unknown global fields | +| →→
Unknown | object | Required
(0 or more) | An unknown key-value pair | +| →
`inputs` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction | +| → →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase | +| → → →
`non_witness_utxo` | object | Optional
(0 or more) | Decoded network transaction for non-witness UTXOs | +| → → →
`partial_signatures` | object | Optional
(0 or more) | An object containing partial signatures | +| → → →→
`pubkey` | string | Required
(1 or more) | The public key and signature that corresponds to it | +| → → →
`sighash` | string | Optional
(0 or 1) | The sighash type to be used | +| → → →
`redeem_script` | object | Optional
(0 or more) | | +| → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex | +| → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts | +| → → →
`bip32_derivs` | object | Optional
(0 or more) | | +| → → →→
`pubkey` | object | Optional
(0 or more) | The public key with the derivation path as the value. | +| → → →→→
`master_fingerprint` | object | Optional
(0 or more) | The fingerprint of the master key | +| → → →→→
`path` | object | Optional
(0 or more) | The public key's path | +| → → →
`final_scriptsig` | object | Optional
(0 or more) | | +| → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex | +| → → →
`unknown` | object | Optional
(0 or more) | The unknown global fields | +| → → → →
Unknown | object | Required
(0 or more) | An unknown key-value pair | +| →
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 | +| → →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs | +| → → →
`redeem_script` | object | Required
(exactly 1) | An object describing the pubkey script | +| → → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex | +| → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts | +| → → →
`bip32_derivs` | array | Optional
(0 or more) | Array of JSON objects | +| → → →→
BIP32 Deriv | object | Optional
(0 or more) | An object containing BIP32 derivation infomation | +| →→ → →→
`pubkey` | object | Optional
(0 or more) | The public key this path corresponds to | +| → → → →→
`master_fingerprint` | object | Optional
(0 or more) | The fingerprint of the master key | +| → → →→→
`path` | object | Optional
(0 or more) | The public key's path | +| →
`fee` | number (int) | Optional
(0 or 1) | The transaction fee paid if all UTXOs slots in the PSBT have been filled | + +_Example from Dash Core 18.0.0_ + +Decode a one-input, one-output transaction: + +```bash +dash-cli -testnet decodepsbt cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA= +``` + +Result: + +```json +{ + "tx": { + "txid": "5954a007baf3f012af1484b42d24057f9b1541dd65003bababb1a53c9f7eabe4", + "version": 2, + "type": 0, + "size": 66, + "locktime": 0, + "vin": [ + { + "txid": "2662c87e1761ed5f4e98a0640b2608114d86f282824a51bd624985d236c71178", + "vout": 0, + "scriptSig": { + "asm": "", + "hex": "" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 0.00000000, + "valueSat": 0, + "n": 0, + "scriptPubKey": { + "asm": "OP_RETURN 50462976", + "hex": "6a0400010203", + "type": "nulldata" + } + } + ] + }, + "unknown": { + }, + "inputs": [ + { + "non_witness_utxo": { + "txid": "2662c87e1761ed5f4e98a0640b2608114d86f282824a51bd624985d236c71178", + "version": 2, + "type": 0, + "size": 225, + "locktime": 542805, + "vin": [ + { + "txid": "427c8d2f712b72150496d53b67403a984b6fb41f37f6c0a85115d12c50b78b94", + "vout": 1, + "scriptSig": { + "asm": "304402204fe4fc488c955f286c52c848ec7950b40ec476e1b434c6add686b474bdde09a902206222d291fd9da341408aa8a4720f5a6959997715a1ddf8187e75277b6bfcae7e[ALL] 03c67d86944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9", + "hex": "47304402204fe4fc488c955f286c52c848ec7950b40ec476e1b434c6add686b474bdde09a902206222d291fd9da341408aa8a4720f5a6959997715a1ddf8187e75277b6bfcae7e012103c67d86944315838aea7ec80d390b5d09b91b62483370d4979da5ccf7a7df77a9" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 1.64030388, + "valueSat": 164030388, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cefc464904c03814c01906e197dc759a745e47ee OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cefc464904c03814c01906e197dc759a745e47ee88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yfBtG4d5ZRWXWo8JQrbVcCzpKyJRhcGyYk" + ] + } + }, + { + "value": 10.00000000, + "valueSat": 1000000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 3ef9bcbe92f77c8fadd0566eea7ff8d47f22bde0 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9143ef9bcbe92f77c8fadd0566eea7ff8d47f22bde088ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yS4Rv9VJnUvwcwggLzi88pu6jTPVya52Ba" + ] + } + } + ] + }, + "final_scriptSig": { + "asm": "3044022005d5f8010e0d8cfd601e6136330a4122492ac3573718a1ef30c2bc3f31b760390220273a18050f61026ea3aa4d9c2c58ad51dd7f88bd64bbcc3dba769d8cd7ec09da[ALL] 0267da91139a4f14d97eaf7800ea9e7cb9ffa8fc232ece8b38a3d127891e6f71e8", + "hex": "473044022005d5f8010e0d8cfd601e6136330a4122492ac3573718a1ef30c2bc3f31b760390220273a18050f61026ea3aa4d9c2c58ad51dd7f88bd64bbcc3dba769d8cd7ec09da01210267da91139a4f14d97eaf7800ea9e7cb9ffa8fc232ece8b38a3d127891e6f71e8" + } + } + ], + "outputs": [ + { + } + ], + "fee": 1.64030388 +} +``` + +## DecodeRawTransaction + +The [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction) decodes a serialized transaction hex string into a JSON object describing the transaction. + +_Parameter #1---serialized transaction in hex_ + +| Name | Type | Presence | Description | +| ---------------------- | ------------ | ----------------------- | ---------------------------------------------------------- | +| Serialized Transaction | string (hex) | Required
(exactly 1) | The transaction to decode in serialized transaction format | + +_Result---the decoded transaction_ + +| Name | Type | Presence | Description | +| ----------------------- | -------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object describing the decoded transaction, or JSON `null` if the transaction could not be decoded | +| →
`txid` | string (hex) | Required
(exactly 1) | The transaction's TXID encoded as hex in RPC byte order | +| →
`version` | number (int) | Required
(exactly 1) | The transaction format version number | +| →
`type` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.13.0.0_

The transaction format type | +| →
`size` | number (int) | Required
(exactly 1) | _Added in Bitcoin Core 0.12.0_

The serialized transaction size | +| →
`locktime` | number (int) | Required
(exactly 1) | The transaction's locktime: either a Unix epoch date or block height; see the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md#locktime-parsing-rules) | +| →
`vin` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction. Input objects will have the same order within the array as they have in the transaction, so the first input listed will be input 0 | +| → →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase | +| → → →
`txid` | string | Optional
(0 or 1) | The TXID of the outpoint being spent, encoded as hex in RPC byte order. Not present if this is a coinbase transaction | +| → → →
`vout` | number (int) | Optional
(0 or 1) | The output index number (vout) of the outpoint being spent. The first output in a transaction has an index of `0`. Not present if this is a coinbase transaction | +| → → →
`scriptSig` | object | Optional
(0 or 1) | An object describing the signature script of this input. Not present if this is a coinbase transaction | +| → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex | +| → → →
`coinbase` | string (hex) | Optional
(0 or 1) | The coinbase (similar to the hex field of a scriptSig) encoded as hex. Only present if this is a coinbase transaction | +| → → →
`value` | number (Dash) | Optional
(exactly 1) | The number of Dash paid to this output. May be `0`.

Only present if `spentindex` enabled | +| → → →
`valueSat` | number (duffs) | Optional
(exactly 1) | The number of duffs paid to this output. May be `0`.

Only present if `spentindex` enabled | +| → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types.

Only present if `spentindex` enabled | +| → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address | +| → → →
`sequence` | number (int) | Required
(exactly 1) | The input sequence number | +| →
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 | +| → →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs | +| → → →
`value` | number (Dash) | Required
(exactly 1) | The number of Dash paid to this output. May be `0` | +| → → →
`valueSat` | number (duffs) | Required
(exactly 1) | The number of duffs paid to this output. May be `0` | +| → → →
`n` | number (int) | Required
(exactly 1) | The output index number of this output within this transaction | +| → → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script | +| → → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex | +| → → → →
`reqSigs` | number (int) | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) | +| → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts | +| → → →
`address` | string | Optional
(0 or 1) | Dash address (only if a well-defined address exists) | +| → → → →
`addresses` | string : array | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types | +| → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address | +| →
`extraPayloadSize` | number (int) | Optional
(0 or 1) | _Added in Dash Core 0.13.0.0_

Size of the DIP2 extra payload. Only present if it's a DIP2 special transaction | +| →
`extraPayload` | string (hex) | Optional
(0 or 1) | _Added in Dash Core 0.13.0.0_

Hex encoded DIP2 extra payload data. Only present if it's a DIP2 special transaction | + +_Example from Dash Core 21.1.0_ + +Decode a signed one-input, two-output transaction: + +```bash +dash-cli -testnet decoderawtransaction 02000000015d0b26079696875e9fc3cb480420aae3c8\ +b1da628fbb14cc718066df7fe7c5fd010000006a47304402202cfa683981898ad9adb89534\ +23a38f7185ed41e163aa195d608fbe5bc3034910022034e2376aaed1c6576c0dad79d626ee\ +27f706baaed86dabb105979c3e6f6e1cb9012103d14eb001cf0908f3a2333d171f6236497a\ +82318a6a6f649b4d7fd8e5c8922e08feffffff021e3f4b4c000000001976a914b02ae52066\ +542b4aec5cf45c7cae3183d7bd322788ac00f90295000000001976a914252c9de3a0ebd5c9\ +5886187b24969d4ccdb5576e88ac943d0000 +``` + +Result: + +```json +{ + "txid": "f4de3be04efa18e203c9d0b7ad11bb2517f5889338918ed300a374f5bd736ed7", + "version": 2, + "type": 0, + "size": 225, + "locktime": 15764, + "vin": [ + { + "txid": "fdc5e77fdf668071cc14bb8f62dab1c8e3aa200448cbc39f5e87969607260b5d", + "vout": 1, + "scriptSig": { + "asm": "304402202cfa683981898ad9adb8953423a38f7185ed41e163aa195d608fbe5bc3034910022034e2376aaed1c6576c0dad79d626ee27f706baaed86dabb105979c3e6f6e1cb9[ALL] 03d14eb001cf0908f3a2333d171f6236497a82318a6a6f649b4d7fd8e5c8922e08", + "hex": "47304402202cfa683981898ad9adb8953423a38f7185ed41e163aa195d608fbe5bc3034910022034e2376aaed1c6576c0dad79d626ee27f706baaed86dabb105979c3e6f6e1cb9012103d14eb001cf0908f3a2333d171f6236497a82318a6a6f649b4d7fd8e5c8922e08" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 12.79999774, + "valueSat": 1279999774, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 b02ae52066542b4aec5cf45c7cae3183d7bd3227 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914b02ae52066542b4aec5cf45c7cae3183d7bd322788ac", + "address": "ycNwAN4DQ7Xnw5XLKg84SR4U1GE22FfLNQ", + "type": "pubkeyhash" + } + }, + { + "value": 25.00000000, + "valueSat": 2500000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 252c9de3a0ebd5c95886187b24969d4ccdb5576e OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914252c9de3a0ebd5c95886187b24969d4ccdb5576e88ac", + "address": "yPi1JKw5fn8bMFsCCtnkGagogW6GXwGktZ", + "type": "pubkeyhash" + } + } + ] +} +``` + +Decode a coinbase special transaction (CbTx): + +```bash +dash-cli -testnet decoderawtransaction 03000500010000000000000000000000000000000000\ +000000000000000000000000000000ffffffff2703ae50011a4d696e656420627920416e74\ +506f6f6c2021000b01201da9196f0000000007000000ffffffff02809e4730000000001976\ +a914cbd7bfcc50351180132b2c0698cb90ad74c473c788ac809e4730000000001976a91488\ +a060bc2dfe05780ae4dcb6c98b12436c35a93988ac00000000460200ae50010078e5c08b39\ +960887bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f92\ +45e20cfd5d830382ac634d434725ca6349ab5db920a3 +``` + +Result: + +```json +{ + "txid": "25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56", + "version": 3, + "type": 5, + "size": 229, + "locktime": 0, + "vin": [ + { + "coinbase": "03ae50011a4d696e656420627920416e74506f6f6c2021000b01201da9196f0000000007000000", + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cbd7bfcc50351180132b2c0698cb90ad74c473c7 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cbd7bfcc50351180132b2c0698cb90ad74c473c788ac", + "address": "yeuGUfPMrbEqAS2Pw1wonYgEPbM4LAA9LK", + "type": "pubkeyhash" + } + }, + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 88a060bc2dfe05780ae4dcb6c98b12436c35a939 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91488a060bc2dfe05780ae4dcb6c98b12436c35a93988ac", + "address": "yYmrsYP3XYMZr1cGtha3QzmuNB1C7CfyhV", + "type": "pubkeyhash" + } + } + ], + "extraPayloadSize": 70, + "extraPayload": "0200ae50010078e5c08b39960887bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f9245e20cfd5d830382ac634d434725ca6349ab5db920a3", + "cbTx": { + "version": 2, + "height": 86190, + "merkleRootMNList": "877392defa24888af72aa15f92b6609e71db1b385c1895bf870896398bc0e578", + "merkleRootQuorums": "a320b95dab4963ca2547434d63ac8203835dfd0ce245924fa83dc6bab6ac57c7" + } +} +``` + +_See also:_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. + +## DecodeScript + +The [`decodescript` RPC](../api/remote-procedure-calls-raw-transactions.md#decodescript) decodes a hex-encoded P2SH redeem script. + +_Parameter #1---a hex-encoded redeem script_ + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | -------------------------------------------------------------- | +| Redeem Script | string (hex) | Required
(exactly 1) | The redeem script to decode as a hex-encoded serialized script | + +_Result---the decoded script_ + +| Name | Type | Presence | Description | +| ---------------- | ------------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object describing the decoded script, or JSON `null` if the script could not be decoded | +| →
`asm` | string | Required
(exactly 1) | The redeem script in decoded form with non-data-pushing opcodes listed. May be empty | +| →
`reqSigs` | number (int) | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The number of signatures required; this is always `1` for P2PK or P2PKH within P2SH. It may be greater than 1 for P2SH multisig. This value will not be returned for `nonstandard` script types (see the `type` key above) | +| →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script inside P2SH
• `pubkeyhash` for a P2PKH script inside P2SH
• `multisig` for a multisig script inside P2SH
• `nonstandard` for unknown scripts | +| →
`addresses` | array | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

A P2PKH addresses used in this script, or the computed P2PKH addresses of any pubkeys in this script. This array will not be returned for `nonstandard` script types | +| → →
Address | string | Required
(1 or more) | A P2PKH address | +| →
`p2sh` | string (hex) | Required
(exactly 1) | The P2SH address of this redeem script | + +_Example from Dash Core 21.0.0_ + +A 2-of-3 P2SH multisig pubkey script: + +```bash +dash-cli -testnet decodescript 522102eacba539d92eb88d4e73bb32\ +749d79f53f6e8d7947ac40a71bd4b26c13b6ec29210311f97539724e0de38fb1\ +ff79f5148e5202459d06ed07193ab18c730274fd0d882103251f25a5c0291446\ +d801ba6df122f67a7dd06c60a9b332b7b29cc94f3b8f57d053ae +``` + +Result: + +```json +{ + "asm": "2 02eacba539d92eb88d4e73bb32749d79f53f6e8d7947ac40a71bd4b26c13b6ec29 0311f97539724e0de38fb1ff79f5148e5202459d06ed07193ab18c730274fd0d88 03251f25a5c0291446d801ba6df122f67a7dd06c60a9b332b7b29cc94f3b8f57d0 3 OP_CHECKMULTISIG", + "type": "multisig", + "p2sh": "8uJLxDxk2gEMbidF5vT8XLS2UCgQmVcroW" +} +``` + +_See also:_ + +* [CreateMultiSig](../api/remote-procedure-calls-util.md#createmultisig): creates a P2SH multi-signature address. + +## FinalizePSBT + +The [`finalizepsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt) finalizes the inputs of a PSBT. The PSBT produces a network serialized transaction if the transaction is fully signed. This can broadcast with `sendrawtransaction`. Otherwise, a PSBT will be created which has the `final_scriptSig` fields filled for inputs that are complete. +Implements the Finalizer and Extractor roles. + +_Parameter #1---psbt_ + +| Name | Type | Presence | Description | +| ---- | ------ | -------- | ------------------------- | +| psbt | string | Required | A base64 string of a PSBT | + +_Parameter #2---extract_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| data | bool | Optional | If true, and the transaction is complete, extract and return the complete transaction in normal network serialization instead of the PSBT. | + +_Result---psbt_ + +| Name | Type | Presence | Description | +| -------------- | ------------ | ----------------------- | ---------------------------------------------------------------- | +| →
psbt | string | Optional
(0 or 1) | The base64-encoded partially signed transaction if not extracted (present if `complete` is `false`)| +| →
hex | string (hex) | Optional
(0 or 1) | The hex-encoded network transaction if extracted (present if `complete` is `true`) | +| →
complete | bool | Required
(Exactly 1) | If the transaction has a complete set of signatures | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet finalizepsbt cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAQDhAgAAAAGUi7dQLNEVUajA9jcftG9LmDpAZzvVlgQVcitxL418QgEAAABqRzBEAiBP5PxIjJVfKGxSyEjseVC0DsR24bQ0xq3WhrR0vd4JqQIgYiLSkf2do0FAiqikcg9aaVmZdxWh3fgYfnUne2v8rn4BIQPGfYaUQxWDiup+yA05C10JuRtiSDNw1Jedpcz3p993qf7///8CtOfGCQAAAAAZdqkUzvxGSQTAOBTAGQbhl9x1mnReR+6IrADKmjsAAAAAGXapFD75vL6S93yPrdBWbup/+NR/Ir3giKxVSAgAAQdqRzBEAiAF1fgBDg2M/WAeYTYzCkEiSSrDVzcYoe8wwrw/MbdgOQIgJzoYBQ9hAm6jqk2cLFitUd1/iL1ku8w9unadjNfsCdoBIQJn2pETmk8U2X6veADqnny5/6j8Iy7Oizij0SeJHm9x6AAA +``` + +Result: + +```json +{ + "hex": "02000000017811c736d2854962bd514a8282f2864d1108260b64a0984e5fed61177ec86226000000006a473044022005d5f8010e0d8cfd601e6136330a4122492ac3573718a1ef30c2bc3f31b760390220273a18050f61026ea3aa4d9c2c58ad51dd7f88bd64bbcc3dba769d8cd7ec09da01210267da91139a4f14d97eaf7800ea9e7cb9ffa8fc232ece8b38a3d127891e6f71e8ffffffff010000000000000000066a040001020300000000", + "complete": true +} +``` + +_See also:_ + +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## FundRawTransaction + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`fundrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#fundrawtransaction) adds inputs to a transaction until it has enough in value to meet its out value. This will not modify existing inputs, and will add one change output to the outputs. +Note that inputs which were signed may need to be resigned after completion since in/outputs have been added. The inputs added will not be signed, use signrawtransaction for that. +All existing inputs must have their previous output transaction be in the wallet. + +_Parameter #1---The hex string of the raw transaction_ + +| Name | Type | Presence | Description | +| ---------- | ------------ | ----------------------- | ------------------------------------- | +| Hex string | string (hex) | Required
(exactly 1) | The hex string of the raw transaction | + +_Parameter #2---Additional options_ + +Note: For backwards compatibility, passing in a `true` instead of an object will result in `{"includeWatching": true}`. + +| Name | Type | Presence | Description| +| ------------------------------ | ------------------ | ----------------------- | ---------- | +| Options | Object | Optional
(0 or 1) | Additional options. For backward compatibility: passing in a true instead of an object will result in {"includeWatching":true} | +| →
`add_inputs` | bool | Optional
(0 or 1) | If inputs are specified, automatically include more if they are not enough. Defaults to `true`. | +| →
`changeAddress` | string | Optional
(0 or 1) | The address to receive the change. If not set, the address is chosen from address pool | +| →
`changePosition` | nummeric (int) | Optional
(0 or 1) | The index of the change output. If not set, the change position is randomly chosen | +| `includeWatching` | bool | Optional
(0 or 1) | Inputs from watch-only addresses are also considered. The default is `false` for non-watching-only wallets and `true` for watching-only wallets | +| →
`lockUnspent` | bool | Optional
(0 or 1) | The selected outputs are locked after running the rpc call. The default is `false`. This applies to manually selected coins also since Dash Core 20.1.0. | +| →
`feeRate` | numeric (bitcoins) | Optional
(0 or 1) | The specific feerate you are willing to pay (BTC per KB). If not set, the wallet determines the fee | +| →
`subtractFeeFromOutputs` | array | Optional
(0 or 1) | A json array of integers. The fee will be equally deducted from the amount of each specified output. The outputs are specified by their zero-based index, before any change output is added. | +| → →
Output index | numeric (int) | Optional
(0 or more) | A output index number (vout) from which the fee should be subtracted. If multiple vouts are provided, the total fee will be divided by the number of vouts listed and each vout will have that amount subtracted from it. | +| →
`conf_target` | numberic (int) | Optional
(0 or 1) | Confirmation target (in blocks), or fee rate (for DASH/kB or duff/B estimate modes) | +| →
`estimate_mode` | string | Optional
(0 or 1) | The fee estimate mode, must be one of (case insensitive):
`unset`
`economical`
`conservative`
`DASH/kB`
`duff/B` | + +_Result---information about the created transaction_ + +| Name | Type | Presence | Description | +| --------------- | ------------------ | ----------------------- | -------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object including information about the created transaction | +| →
hex | string (hex) | Required
(Exactly 1) | The resulting unsigned raw transaction in serialized transaction format encoded as hex | +| →
fee | numeric (bitcoins) | Required
(Exactly 1) | Fee in BTC the resulting transaction pays | +| →
changepos | numeric (int) | Required
(Exactly 1) | The position of the added change output, or `-1` if no change output was added | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet fundrawtransaction 01000000000100205fa012000000\ +1976a914485485425fa99504ec1638ac4213f3cfc9f32ef388ac00000000 +``` + +Result: + +```text +{ + "hex": "01000000016b490886c0198b028c6c5cb145c4eb3b1055a224a7a105aadeff41b69ec91e060100000000feffffff023e1207bf010000001976a914bd652a167e7ad674f7815dc549bea9c57a7f919b88ac00205fa0120000001976a914485485425fa99504ec1638ac4213f3cfc9f32ef388ac00000000", + "changepos": 0, + "fee": 0.00000226 +} +``` + +_See also:_ + +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. +* [Serialized Transaction Format](../reference/transactions-raw-transaction-format.md) + +```{eval-rst} +.. _api-rpc-raw-transactions-getassetunlockstatuses: +``` + +## GetAssetUnlockStatuses + +The [`getassetunlockstatuses` RPC](../api/remote-procedure-calls-raw-transactions.md#getassetunlockstatuses) returns the status of the provided Asset Unlock indexes at the tip of the chain or at a particular block height if specified. + +_Parameters_ + +| Name | Type | Presence | Description | +| ------- | ----- | -------- | ----------- | +| Indexes | array | Required | An array of Asset Unlock indexes (no more than 100). Each element is a numeric Asset Unlock index. | +| height | numeric | Optional (0 or 1) | The maximum block height to check. If not specified, the chain's tip is used. | + +_Result---Status of the Asset Unlock indexes_ + +| Name | Type | Presence | Description | +| ------ | ----- | ----------------------- | ----------- | +| Result | array | Required (Exactly 1) | An array with the status of each Asset Unlock index. Each element in the array is a JSON object containing the index and its status. | +| → Index data | object | Required
(1 or more) | Details for an Asset Unlock index | +| → →
index | numeric | Required
(Exactly 1) | The Asset Unlock index | +| → →
status | string | Required
(Exactly 1) | Status of the Asset Unlock index. The possible outcomes per each index are:
- `chainlocked`: If the Asset Unlock index is mined on a ChainLocked block or up to the given block height.
- `mined`: If no ChainLock information is available for the mined Asset Unlock index.
- `mempooled`: If the Asset Unlock index is in the mempool.
- `unknown`: If none of the above are valid.
Note: If a specific block height is passed on request, then only `chainlocked` and `unknown` outcomes are possible. | + +_Example from Dash Core 20.1.0_ + +```bash +dash-cli getassetunlockstatuses '["1", "2"]' +``` + +Result: + +```json +[ + { + "index": 1, + "status": "chainlocked" + }, + { + "index": 2, + "status": "mempooled" + } +] +``` + +_See also: none_ + +```{eval-rst} +.. _api-rpc-raw-transactions-getrawtransaction: +``` + +## GetRawTransaction + +The [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. + +Note: By default this function only works for mempool transactions. When called with a blockhash argument, getrawtransaction will return the transaction if the specified block is available and the transaction is found in that block. When called without a blockhash argument, getrawtransaction will return the transaction if it is in the mempool, or if `-txindex` is enabled and the transaction is in a block in the blockchain. Use the [`gettransaction` RPC](../api/remote-procedure-calls-wallet.md#gettransaction) for wallet transactions. + +As of Dash Core 18.0.0, transactions with unspent outputs will no longer be included unless `-txindex` is enabled. + +:::{note} +If you begin using `txindex=1` after downloading the block chain, you must rebuild your indexes by starting Dash Core with the option `-reindex`. This may take several hours to complete, during which time your node will not process new blocks or transactions. This reindex only needs to be done once. +::: + +_Parameter #1---the TXID of the transaction to get_ + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | -------------------------------------------------------------------- | +| TXID | string (hex) | Required
(exactly 1) | The TXID of the transaction to get, encoded as hex in RPC byte order | + +_Parameter #2---whether to get the serialized or decoded transaction_ + +| Name | Type | Presence | Description | +| ------- | ---- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Verbose | bool | Optional
(0 or 1) | _Updated in Dash Core 0.12.3 / Bitcoin Core 0.14.0_

Set to `false` (the default) to return the serialized transaction as hex. Set to `true` to return a decoded transaction in JSON. Before 0.12.3, use `0` and `1`, respectively | + +_Parameter #3---hash of a block to look in for the transaction_ + +| Name | Type | Presence | Description | +| ---------- | ---- | -------------------- | --------------------------------------------------------------------------------------------- | +| Block Hash | string | Optional
(0 or 1) | _Added in Dash Core 0.16.0_

The hash of the block in which to look for the transaction | + +_Result (if transaction not found)---`null`_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | null | Required
(exactly 1) | If the transaction wasn't found, the result will be JSON `null`. This can occur because the transaction doesn't exist in the block chain or memory pool, or because it isn't part of the transaction index. See the Dash Core `-help` entry for `-txindex` | + +```{eval-rst} +.. _rpc-raw-txs-getrawtx-hex: +``` + +_Result (if verbose=`false`)---the serialized transaction_ + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------ | +| `result` | string (hex) | Required
(exactly 1) | If the transaction was found, this will be the serialized transaction encoded as hex | + +```{eval-rst} +.. _rpc-raw-txs-getrawtx-decoded: +``` + +_Result (if verbose=`true`)---the decoded transaction_ + +| Name | Type | Presence | Description | +| --------------------------- | -------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | If the transaction was found, this will be an object describing it | +| →
`in_active_chain` | bool | Optional
(0 or 1) | ) Whether specified block is in the active chain or not (only present with explicit `blockhash` argument) | +| →
`txid` | string (hex) | Required
(exactly 1) | The transaction's TXID encoded as hex in RPC byte order | +| →
`size` | number (int) | Required
(exactly 1) | _Added in Bitcoin Core 0.12.0_

The serialized transaction size | +| →
`version` | number (int) | Required
(exactly 1) | The transaction format version number | +| →
`type` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.13.0.0_

The transaction format type | +| →
`locktime` | number (int) | Required
(exactly 1) | The transaction's locktime: either a Unix epoch date or block height; see the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md#locktime-parsing-rules) | +| →
`vin` | array | Required
(exactly 1) | An array of objects with each object being an input vector (vin) for this transaction. Input objects will have the same order within the array as they have in the transaction, so the first input listed will be input 0 | +| → →
Input | object | Required
(1 or more) | An object describing one of this transaction's inputs. May be a regular input or a coinbase | +| → → →
`txid` | string | Optional
(0 or 1) | The TXID of the outpoint being spent, encoded as hex in RPC byte order. Not present if this is a coinbase transaction | +| → → →
`vout` | number (int) | Optional
(0 or 1) | The output index number (vout) of the outpoint being spent. The first output in a transaction has an index of `0`. Not present if this is a coinbase transaction | +| → → →
`scriptSig` | object | Optional
(0 or 1) | An object describing the signature script of this input. Not present if this is a coinbase transaction | +| → → → →
`asm` | string | Required
(exactly 1) | The signature script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The signature script encoded as hex | +| → → →
`coinbase` | string (hex) | Optional
(0 or 1) | The coinbase (similar to the hex field of a scriptSig) encoded as hex. Only present if this is a coinbase transaction | +| → → →
`value` | number (Dash) | Optional
(exactly 1) | The number of Dash paid to this output. May be `0`.

Only present if `spentindex` enabled | +| → → →
`valueSat` | number (duffs) | Optional
(exactly 1) | The number of duffs paid to this output. May be `0`.

Only present if `spentindex` enabled | +| → → → →
`addresses` | string : array | Optional
(0 or 1) | The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types.

Only present if `spentindex` enabled | +| → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address | +| → → →
`sequence` | number (int) | Required
(exactly 1) | The input sequence number | +| →
`vout` | array | Required
(exactly 1) | An array of objects each describing an output vector (vout) for this transaction. Output objects will have the same order within the array as they have in the transaction, so the first output listed will be output 0 | +| → →
Output | object | Required
(1 or more) | An object describing one of this transaction's outputs | +| → → →
`value` | number (Dash) | Required
(exactly 1) | The number of Dash paid to this output. May be `0` | +| → → →
`valueSat` | number (duffs) | Required
(exactly 1) | The number of duffs paid to this output. May be `0` | +| → → →
`n` | number (int) | Required
(exactly 1) | The output index number of this output within this transaction | +| → → →
`scriptPubKey` | object | Required
(exactly 1) | An object describing the pubkey script | +| → → → →
`asm` | string | Required
(exactly 1) | The pubkey script in decoded form with non-data-pushing opcodes listed | +| → → → →
`hex` | string (hex) | Required
(exactly 1) | The pubkey script encoded as hex | +| → → → →
`reqSigs` | number (int) | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The number of signatures required; this is always `1` for P2PK, P2PKH, and P2SH (including P2SH multisig because the redeem script is not available in the pubkey script). It may be greater than 1 for bare multisig. This value will not be returned for `nulldata` or `nonstandard` script types (see the `type` key below) | +| → → → →
`type` | string | Optional
(0 or 1) | The type of script. This will be one of the following:
• `pubkey` for a P2PK script
• `pubkeyhash` for a P2PKH script
• `scripthash` for a P2SH script
• `multisig` for a bare multisig script
• `nulldata` for nulldata scripts
• `nonstandard` for unknown scripts | +| → → →
`address` | string | Optional
(0 or 1) | Dash address (only if a well-defined address exists) | +| → → → →
`addresses` | string : array | Optional
(0 or 1) | **Deprecated in Dash Core 21.0.0** (returned only if config option -deprecatedrpc=addresses is passed)

The P2PKH or P2SH addresses used in this transaction, or the computed P2PKH address of any pubkeys in this transaction. This array will not be returned for `nulldata` or `nonstandard` script types | +| → → → → →
Address | string | Required
(1 or more) | A P2PKH or P2SH address | +| →
`extraPayloadSize` | number (int) | Optional
(0 or 1) | _Added in Dash Core 0.13.0.0_

Size of the DIP2 extra payload. Only present if it's a DIP2 special transaction | +| →
`extraPayload` | string (hex) | Optional
(0 or 1) | _Added in Dash Core 0.13.0.0_

Hex encoded DIP2 extra payload data. Only present if it's a DIP2 special transaction | +| →
`hex` | string (hex) | Required
(exactly 1) | The serialized, hex-encoded data for the provided `txid` | +| →
`blockhash` | string (hex) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is the hash of that block encoded as hex in RPC byte order | +| →
`height` | number (int) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is the block height where the transaction was mined. Otherwise, this is `-1`. Not shown for mempool transactions. | +| →
`confirmations` | number (int) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is how many confirmations it has. Otherwise, this is `0`. Not shown for mempool transactions. | +| →
`time` | number (int) | Optional
(0 or 1) | If the transaction has been included in a block on the local best block chain, this is the block header time of that block (may be in the future) | +| →
`blocktime` | number (int) | Optional
(0 or 1) | This field is currently identical to the time field described above | +| →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) | +| →
`instantlock_internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock | +| →
`chainlock` | bool | Required
(exactly 1) | _Added in Dash Core 0.14.0_

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | + +_Examples from Dash Core 21.1.0_ + +A classical transaction in serialized transaction format: + +```bash +dash-cli getrawtransaction \ + 88a3fe6bf2ab4425dbf57d75ce761efa2e45556ec36b4fd5b6af6c00f01ebd63 +``` + +Result (wrapped): + +```text +02000000016634e15fe22fe84554833f109916fced5af30fac0849a211f17f326\ +162280f14010000006a47304402207b8f61bebe3560b6ef70de3e10b59bdc6093\ +1d09cf0626026bfe3064dcfcf1c00220048ad98398cb294fa19335110db3ce5a4\ +66b74cbbf234bf2b4855b264a03ef790121027b90f229e7027758f0c8b39d2d48\ +5b88ed5b63b34e58e0dad2a07e3e8eb03373feffffff0278f5110400000000197\ +6a9148907e625c343ac9c6b56e8180f73af1d23350d0c88acd007290e00000000\ +1976a914dd01754e43690f41feef2cc7974bc2e5101e9f2788accf880d00 +``` + +Get the same transaction in JSON: + +```bash +dash-cli getrawtransaction \ +88a3fe6bf2ab4425dbf57d75ce761efa2e45556ec36b4fd5b6af6c00f01ebd63 \ +1 +``` + +Result: + +```json +{ + "txid": "88a3fe6bf2ab4425dbf57d75ce761efa2e45556ec36b4fd5b6af6c00f01ebd63", + "version": 2, + "type": 0, + "size": 225, + "locktime": 886991, + "vin": [ + { + "txid": "140f286261327ff111a24908ac0ff35aedfc1699103f835445e82fe25fe13466", + "vout": 1, + "scriptSig": { + "asm": "304402207b8f61bebe3560b6ef70de3e10b59bdc60931d09cf0626026bfe3064dcfcf1c00220048ad98398cb294fa19335110db3ce5a466b74cbbf234bf2b4855b264a03ef79[ALL] 027b90f229e7027758f0c8b39d2d485b88ed5b63b34e58e0dad2a07e3e8eb03373", + "hex": "47304402207b8f61bebe3560b6ef70de3e10b59bdc60931d09cf0626026bfe3064dcfcf1c00220048ad98398cb294fa19335110db3ce5a466b74cbbf234bf2b4855b264a03ef790121027b90f229e7027758f0c8b39d2d485b88ed5b63b34e58e0dad2a07e3e8eb03373" + }, + "value": 3.05867613, + "valueSat": 305867613, + "address": "yeuA2vwH1Zba2pGs3NaeJh53ZuW97h2jXJ", + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 0.68285816, + "valueSat": 68285816, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 8907e625c343ac9c6b56e8180f73af1d23350d0c OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9148907e625c343ac9c6b56e8180f73af1d23350d0c88ac", + "address": "yYoztKLNFLvbNYAPMUGoa5iHz5SBtNLEK8", + "type": "pubkeyhash" + }, + "spentTxId": "194e514c9814f7e34be3f8c696fff5871bda40bef2f87be1ff8075f691ef6e0b", + "spentIndex": 0, + "spentHeight": 887750 + }, + { + "value": 2.37570000, + "valueSat": 237570000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 dd01754e43690f41feef2cc7974bc2e5101e9f27 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914dd01754e43690f41feef2cc7974bc2e5101e9f2788ac", + "address": "ygU1vv8a2fhiM2gYUF1GjQAcjxgZUKY5MD", + "type": "pubkeyhash" + }, + "spentTxId": "b9748455ee0bc7d3142a621b7a1f41d1b03a40283922d54cd4d168c16d20102a", + "spentIndex": 0, + "spentHeight": 888363 + } + ], + "hex": "02000000016634e15fe22fe84554833f109916fced5af30fac0849a211f17f326162280f14010000006a47304402207b8f61bebe3560b6ef70de3e10b59bdc60931d09cf0626026bfe3064dcfcf1c00220048ad98398cb294fa19335110db3ce5a466b74cbbf234bf2b4855b264a03ef790121027b90f229e7027758f0c8b39d2d485b88ed5b63b34e58e0dad2a07e3e8eb03373feffffff0278f51104000000001976a9148907e625c343ac9c6b56e8180f73af1d23350d0c88acd007290e000000001976a914dd01754e43690f41feef2cc7974bc2e5101e9f2788accf880d00", + "blockhash": "0000009f3480f5e2b6821af57ccbfeb064d9e18b6e9e669aad238f2b0059df1a", + "height": 886992, + "confirmations": 192439, + "time": 1692025132, + "blocktime": 1692025132, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} +``` + +A special transaction (CbTx) in serialized transaction format: + +```bash +dash-cli getrawtransaction \ + 25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56 +``` + +Result (wrapped): + +```text +030005000100000000000000000000000000000000000000000000000000000000000\ +00000ffffffff2703ae50011a4d696e656420627920416e74506f6f6c2021000b0120\ +1da9196f0000000007000000ffffffff02809e4730000000001976a914cbd7bfcc503\ +51180132b2c0698cb90ad74c473c788ac809e4730000000001976a91488a060bc2dfe\ +05780ae4dcb6c98b12436c35a93988ac00000000460200ae50010078e5c08b3996088\ +7bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f92\ +45e20cfd5d830382ac634d434725ca6349ab5db920a3 +``` + +Get the same transaction in JSON: + +```bash +dash-cli getrawtransaction \ +25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56 \ +1 +``` + +Result: + +```json +{ + "txid": "25632685ed0d7286901a80961c924c1ddd952e764754dbd8b40d0956413c8b56", + "version": 3, + "type": 5, + "size": 229, + "locktime": 0, + "vin": [ + { + "coinbase": "03ae50011a4d696e656420627920416e74506f6f6c2021000b01201da9196f0000000007000000", + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cbd7bfcc50351180132b2c0698cb90ad74c473c7 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cbd7bfcc50351180132b2c0698cb90ad74c473c788ac", + "address": "yeuGUfPMrbEqAS2Pw1wonYgEPbM4LAA9LK", + "type": "pubkeyhash" + }, + "spentTxId": "1790b286922d1a439bdc056939bc902a222f9d66ee63d8427805617eedf835bd", + "spentIndex": 83, + "spentHeight": 94680 + }, + { + "value": 8.10000000, + "valueSat": 810000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 88a060bc2dfe05780ae4dcb6c98b12436c35a939 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91488a060bc2dfe05780ae4dcb6c98b12436c35a93988ac", + "address": "yYmrsYP3XYMZr1cGtha3QzmuNB1C7CfyhV", + "type": "pubkeyhash" + } + } + ], + "extraPayloadSize": 70, + "extraPayload": "0200ae50010078e5c08b39960887bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f9245e20cfd5d830382ac634d434725ca6349ab5db920a3", + "cbTx": { + "version": 2, + "height": 86190, + "merkleRootMNList": "877392defa24888af72aa15f92b6609e71db1b385c1895bf870896398bc0e578", + "merkleRootQuorums": "a320b95dab4963ca2547434d63ac8203835dfd0ce245924fa83dc6bab6ac57c7" + }, + "hex": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff2703ae50011a4d696e656420627920416e74506f6f6c2021000b01201da9196f0000000007000000ffffffff02809e4730000000001976a914cbd7bfcc50351180132b2c0698cb90ad74c473c788ac809e4730000000001976a91488a060bc2dfe05780ae4dcb6c98b12436c35a93988ac00000000460200ae50010078e5c08b39960887bf95185c381bdb719e60b6925fa12af78a8824fade927387c757acb6bac63da84f9245e20cfd5d830382ac634d434725ca6349ab5db920a3", + "blockhash": "00000000007b0fb99e36713cf08012482478ee496e6dcb4007ad2e806306e62b", + "height": 86190, + "confirmations": 993241, + "time": 1556114577, + "blocktime": 1556114577, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} +``` + +_See also:_ + +* [GetRawTransactionMulti](../api/remote-procedure-calls-raw-transactions.md#getrawtransactionmulti): gets hex-encoded serialized transactions or a JSON object describing the transactions. +* [GetSpecialTxes](../api/remote-procedure-calls-blockchain.md#getspecialtxes): returns an array of special transactions found in the specified block +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. + +## GetRawTransactionMulti + +The [`getrawtransactionmulti` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransactionmulti) gets hex-encoded serialized transactions or a JSON object describing the transactions. This RPC returns the same type of information as the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction). + +_Parameter #1---block hashes and transaction hash list_ + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | ----------- | +| Transactions | object | Required
(exactly 1) | A JSON object with block hashes as keys and lists of transaction hashes as values (no more than 100 in total) | +|→
Block Hash | array | Required
(1 or more) | The block hash and the list of transaction ids to fetch. Note: if a block hash of `0` is provided, mempool transactions will be returned. | +|→ →
Transaction ID | string | Required
(1 or more) | A transaction ID | + +_Parameter #2---whether to get the serialized or decoded transaction_ + +| Name | Type | Presence | Description | +| ------- | ---- | -------------------- | ----------- | +| Verbose | bool | Optional
(0 or 1) | Set to `false` (the default) to return the serialized transaction as hex. Set to `true` to return a decoded transaction in JSON. | + +_Result (if transactions not found)---`null`_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ----------- | +| `result` | null | Required
(exactly 1) | If no transactions were found, the result will be JSON `null`. This can occur because the transactions don't exist in the block chain or memory pool, or because it isn't part of the transaction index. See the Dash Core `-help` entry for `-txindex` | + +_Result (if verbose=`false`)---the serialized transactions_ + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | If the transaction was found, this will be an object containing the serialized transaction encoded as hex. | +|→
TXID / Raw tx | string:string | Required
(1 or more) | A key/value pair with the transaction ID (key) and raw transaction data (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#rpc-raw-txs-getrawtx-hex) for an example of the hex transaction data. | + +_Result (if verbose=`true`)---the decoded transactions_ + +| Name | Type | Presence | Description | +| --------------------------- | -------------- | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | If the transaction was found, this will be an object describing it | +|→
TXID / Decoded tx | string:string | Required
(1 or more) | A key/value pair with the transaction ID (key) and decoded transaction data represented in JSON (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#rpc-raw-txs-getrawtx-decoded) for an example of the decoded transaction data. | + +_Examples from Dash Core 20.1.0_ + +Transactions in serialized transaction format: + +```bash +dash-cli -testnet getrawtransactionmulti '{"0000014b04deb0fe0884d3ca81a6239016c2a4838cd4b34494858630e457c62c": ["0667ab03bebb827057fcd55285d68dc10f30ef07dd04d1468c9f25888c22333c", "5c278dd4ca54b9c14789357f0311bcbf1b6d3182bcc76d229cb15cfbe6255ed0"]}' false +``` + +Result: + +```json +{ + "0667ab03bebb827057fcd55285d68dc10f30ef07dd04d1468c9f25888c22333c": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff060373ad0e0101ffffffff0283706e04000000001976a914c69a0bda7daaae481be8def95e5f347a1d00a4b488ac89514b0d000000001976a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac00000000af030073ad0e00c63f1ca6d2a0570754d3851f70fae6215fa7741b3d4fd1d988e35add12b22827731b17f8cc2324ca927164dc67064a73aed41a19f418b05dcd57415a627ed9b90081a911644ec88204526c31b16666ba3f514caaaef72ce5bbaa4babb19f35bdd4ef1c7adefd414879f5805526fb9b9cd01566dc35d9599ed58e679373666e938ea0214c14368673f4e5b9766686b6d147ec567c4cd004766a0fa8f2280ab5494e9eca329808000000", + "5c278dd4ca54b9c14789357f0311bcbf1b6d3182bcc76d229cb15cfbe6255ed0": "03000600000000000000fd4901010073ad0e00030001d0c2ab39e1fddbcdee48d2c2c2e807586603d6ff1b31189e46b95849eb00000032ffffffffffff0332ffffffffffff03a1f0b0ce837010f234e3b5906ac171adf25b46fb535e7de4831128c19dc9939a71039d227e355a9b47d7612dd0a3a3d51c588284eb43a9ba7b4f62589db5a16ae1b50305a16093fe5a7c8d9c6ab35e4e97021398ecabbf90ab1199e9c649c8abe65af1a77de449980720775ec2efda5cb1b0e23a002f32a2825f02b070c627e90220bb30a37dd4072ffebffeaa81ba5ca2335137a76da711c86b11666b7e8794846caf4170f9bb99b31f9837408f9f13a5b548cda8a6bf6c980f0351584079b5e4c710123217e7876c4bd2f935b6f098306cd75c07231780cd68e27e97283e37180372cd266ebba1e0c514bd6c304ae58c71c9b1653f4df6bc33553fa22adde4429cbc3ecb9eda76bd4d256eabbb98d4" +} +``` + +_See also:_ + +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. +* [GetSpecialTxes](../api/remote-procedure-calls-blockchain.md#getspecialtxes): returns an array of special transactions found in the specified block +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. + +## GetTxChainlocks + +The [`gettxchainlocks` RPC](../api/remote-procedure-calls-raw-transactions.md#gettxchainlocks) returns the block height each transaction was mined at and indicates whether it is in the mempool, ChainLocked, or neither. + +_Parameter #1---Transaction IDs_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------- | +| `txids` | array | Required
(exactly 1) | A JSON array of up to 100 transaction IDs | +| → Transaction ID | string | Required
(1 to 100) | A transaction hash | + +_Result---transaction information_ + +| Name | Type | Presence | Description | +| -------------------- | ------- | ----------------------- | ----------- | +| `result` | array | Required
(exactly 1) | An array of objects providing transaction information for each transaction ID in the input array. | +| →
Transaction info | object | Optional
(0 or more) | An object containting transaction details | +| →
`height` | number | Required
(exactly 1) | Height of the block containing the transaction (-1 if the transaction is not in a block) | +| →
`chainlock` | bool | Required
(exactly 1) | ChainLock status for the block containing the transaction | +| →
`mempool` | bool | Required
(exactly 1) | **Added in Dash Core 20.1.0**

Mempool status for the transaction | + +_Example from Dash Core 20.1.0_ + +```bash +dash-cli -testnet gettxchainlocks "[\"d743b1ab2ff390bcc60b4672c293d95909989ca402fdea487f582b22da051ce8\", \"dd7a41e421c4f522353a8f91f077e15a1325518e60812d0c6c9995c1d61ab60e\"]" +``` + +Result: + +```json +[ + { + "height": 957527, + "chainlock": true, + "mempool": false + }, + { + "height": -1, + "chainlock": false, + "mempool": true + } +] +``` + +*See also: none* + +## JoinPSBTs + +The [`joinpsbts` RPC](../api/remote-procedure-calls-raw-transactions.md#joinpsbts) joins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs. No input in any of the PSBTs can be in more than one of the PSBTs. + +_Parameter #1---Transactions_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | --------------------------------------------------------------- | +| `txs` | array | Required
(exactly 1) | A JSON array of base64 strings of partially signed transactions | +| → PSBT | string | Required
(1 or more) | A PSBT base64 string | + +_Result---the combined raw transaction in base64_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------------------------------- | +| Result | string | Required
(Exactly 1) | The resulting raw transaction (base64-encoded string) | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet joinpsbts "[\"cHNidP8BAEICAAAAAfisRhf3kqdGJdB8vKvQz81ze9cH6bh0RKZfFTMsXatUAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA=\", \"cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA=\"]" +``` + +Result: + +``` +cHNidP8BAHoCAAAAAvisRhf3kqdGJdB8vKvQz81ze9cH6bh0RKZfFTMsXatUAAAAAAD/////eBHHNtKFSWK9UUqCgvKGTREIJgtkoJhOX+1hF37IYiYAAAAAAP////8CAAAAAAAAAAAGagQAAQIDAAAAAAAAAAAGagQAAQIDAAAAAAAAAAAA +``` + +_See also:_ + +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. + +## SendRawTransaction + +The [`sendrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction) validates a transaction and broadcasts it to the peer-to-peer network. + +_Parameter #1---a serialized transaction to broadcast_ + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | ------------------------------------------------------ | +| Transaction | string (hex) | Required
(exactly 1) | The serialized transaction to broadcast encoded as hex | + +_Parameter #2--whether to allow high fees_ + +| Name | Type | Presence | Description | +| ------------ | ------ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `maxfeerate` | number | Optional
(0 or 1) | Reject transactions whose fee rate is higher than the specified value, expressed in DASH/kB. **Breaking change: parameter changed from `allowhighfees` to `maxfeerate` in Dash Core 18.0.0.** | + +_Parameter #3--whether to use InstantSend_ + +| Name | Type | Presence | Description | +| --------------- | ---- | -------------------- | ----------------------------------------------- | +| Use InstantSend | bool | Optional
(0 or 1) | _Deprecated and ignored since Dash Core 0.15.0_ | + +_Parameter #4--whether to bypass policy limits_ + +| Name | Type | Presence | Description | +| ------------- | ---- | -------------------- | -------------------------------- | +| Bypass Limits | bool | Optional
(0 or 1) | Bypass transaction policy limits | + +_Result---a TXID or error message_ + +| Name | Type | Presence | Description | +| -------- | ----------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | null/string (hex) | Required
(exactly 1) | If the transaction was accepted by the node for broadcast, this will be the TXID of the transaction encoded as hex in RPC byte order. If the transaction was rejected by the node, this will set to `null`, the JSON-RPC error field will be set to a code, and the JSON-RPC message field may contain an informative error message | + +_Examples from Dash Core 0.12.2_ + +Broadcast a signed transaction: + +```bash +dash-cli -testnet sendrawtransaction 01000000016b490886c0198b\ +028c6c5cb145c4eb3b1055a224a7a105aadeff41b69ec91e0601000000694630\ +43022033a61c56fa0867ed67b76b023204a9dc0ee6b0d63305dc5f65fe943354\ +45ff2f021f712f55399d5238fc7146497c431fc4182a1de0b96fc22716e0845f\ +561d542e012102eacba539d92eb88d4e73bb32749d79f53f6e8d7947ac40a71b\ +d4b26c13b6ec29ffffffff0200205fa0120000001976a914485485425fa99504\ +ec1638ac4213f3cfc9f32ef388acc0a8f9be010000001976a914811eacc14db8\ +ebb5b64486dc43400c0226b428a488ac00000000 +``` + +Result: + +```text +2f124cb550d9967b81914b544dea3783de23e85d67a9816f9bada665ecfe1cd5 +``` + +_See also:_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. + +## SignRawTransactionWithKey + +The [`signrawtransactionwithkey` RPC](#signrawtransactionwithkey) signs inputs for a transaction in the serialized transaction format using private keys provided in the call. + +_Parameter #1---the transaction to sign_ + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | --------------------------------------------------- | +| Transaction | string (hex) | Required
(exactly 1) | The transaction to sign as a serialized transaction | + +_Parameter #2---private keys for signing_ + +| Name | Type | Presence | Description | +| ------------ | --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Private Keys | array | Required
(exactly 1) | An array holding private keys. If any keys are provided, only they will be used to sign the transaction (even if the wallet has other matching keys). If this array is empty or not used, and wallet support is enabled, keys from the wallet will be used | +| →
Key | string (base58) | Required
(1 or more) | A private key in base58check format to use to create a signature for this transaction | + +_Parameter #3---unspent transaction output details_ + +| Name | Type | Presence | Description | +| --------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------ | +| Dependencies | array | Optional
(0 or 1) | The previous outputs being spent by this transaction | +| →
Output | object | Optional
(0 or more) | An output being spent | +| → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the transaction the output appeared in. The TXID must be encoded in hex in RPC byte order | +| → →
`vout` | number (int) | Required
(exactly 1) | The index number of the output (vout) as it appeared in its transaction, with the first output being 0 | +| → →
`scriptPubKey` | string (hex) | Required
(exactly 1) | The output's pubkey script encoded as hex | +| → →
`redeemScript` | string (hex) | Optional
(0 or 1) | If the pubkey script was a script hash, this must be the corresponding redeem script | +| → →
`amount` | numeric | Required
(exactly 1) | The amount of Dash spent | + +_Parameter #4---signature hash type_ + +| Name | Type | Presence | Description | +| :------ | :----- | :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| SigHash | string | Optional
(0 or 1) | The type of signature hash to use for all of the signatures performed. (You must use separate calls to the [`signrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey) if you want to use different signature hash types for different signatures. The allowed values are: `ALL`, `NONE`, `SINGLE`, `ALL \| ANYONECANPAY`,`NONE \| ANYONECANPAY`, and `SINGLE \| ANYONECANPAY` | + +_Result---the transaction with any signatures made_ + +| Name | Type | Presence | Description | +| --------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | The results of the signature | +| →
`hex` | string (hex) | Required
(exactly 1) | The resulting serialized transaction encoded as hex with any signatures made inserted. If no signatures were made, this will be the same transaction provided in parameter #1 | +| →
`complete` | bool | Required
(exactly 1) | The value `true` if transaction is fully signed; the value `false` if more signatures are required. Once `true` the transaction can be sent using the [`sendrawtransaction` RPC](#sendrawtransaction). | + +_Example from Dash Core 0.17.0_ + +Sign the raw transaction hex generated from the [`createrawtransaction` RPC](#createrawtransaction): + +```bash +dash-cli -testnet signrawtransactionwithkey 020000000121f39228a11ddf197ac3658e\ +93bd264d0afd927f0cdfc7caeb760537e529c94a0100000000ffffffff01809698000000000019\ +76a914fe64a96d6660e30c433e1189082466a95bdf9ceb88ac00000000 \ +[\"cSxm6ji1SQ7vF1r8QhcsE1AZ42ZJqs5CEAAnD18iV18ZCQ2u3gGa\"] +``` + +Result: + +```json +{ + "hex": "020000000121f39228a11ddf197ac3658e93bd264d0afd927f0cdfc7caeb760537e529c94a010000006b483045022100811c5679ef097b0e5a338fc3cd05ee50e1802680ea8a172d0fd3a81da3c1fc2002204804b18a44e888ac1ee9b6a7cbadc211ecdc30f8c889938c95125206e39554220121025d81ce6581e547dd34194385352053abb17f0246768d75443b25ded5e37d594fffffffff0180969800000000001976a914fe64a96d6660e30c433e1189082466a95bdf9ceb88ac00000000", + "complete": true +} +``` + +_See also:_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. + +## TestMemPoolAccept + +The [`testmempoolaccept` RPC](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept) returns the results of mempool acceptance tests indicating if raw transaction (serialized, hex-encoded) would be accepted by mempool. + +_Parameter #1---raw txs_ + +| Name | Type | Presence | Description | +| -------- | ----- | ----------------------- | ----------- | +| `rawtxs` | array | Required
(exactly 1) | An array of hex strings of raw transactions (the length must be one for now) | + +_Parameter #2---set max fee rate_ + +| Name | Type | Presence | Description | +| ------------ | ------ | -------------------- | ----------- | +| `maxfeerate` | number | Optional
(0 or 1) | Reject transactions whose fee rate is higher than the specified value, expressed in DASH/kB. Changed from `allowhighfees` in Dash Core 18.0.0. | + +_Result---mempool acceptance test results_ + +| Name | Type | Presence | Description | +| -------------------- | ------------ | ----------------------- | ----------- | +| `result` | array | Required
(exactly 1) | The result of the mempool acceptance test for each raw transaction in the input array. | +| →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the transaction the output appeared in. The TXID must be encoded in hex in RPC byte order | +| `package-error` | string | Optional
(0 or 1) | Package validation error, if any (only possible if rawtxs had more than 1 transaction). | +| →
`allowed` | bool | Required
(exactly 1) | Whether this tx would be accepted to the mempool and pass client-specified maxfeerate. If not present, the tx was not fully validated due to a failure in another tx in the list. | +| `vsize` | number (int) | Required
(exactly 1) | Virtual transaction size. | +| `fees` | object | Optional
(0 or 1) | Transaction fees (only present if 'allowed' is true). | +| →
`base` | number | Required
(exactly 1) | Transaction fee in DASH. | +| →
`reject-reason` | string | Optional
(0 or 1) | A rejection string that is only present when 'allowed' is false. | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet testmempoolaccept [\"020000000234a2863f9781a7200330e700e684804bb2407d225c4e940c9cfb772f22fc0748000000006a47304402203b5a7899b6be2f33d30c1a71940c51f38074f4224a1ad6dee03dcc65f8646072022050d711115cd7291c2f094e3a3cfda14441721b1438e406b963b5660274ba4475012103e2fe477e31365d784d98514c7c9294283620d4a9775f01da5d3ba52f4c7286f5feffffff34a2863f9781a7200330e700e684804bb2407d225c4e940c9cfb772f22fc0748010000006a473044022018901985d2c94492111a45ed51bac88e02f1bb4a8382eacf5f474d70878c19f4022046e309e548f95a64b05e8ef70fae0ff86bf83cbed3055591580e0b5f5597c3a2012103109325a92f9e6d31d2ebd0595d471275ae8d635db2a0c42358f387e1af69c14dfeffffff020f530f00000000001976a9145799a5df43d34b05cdf03347af9102b67a6d154a88ac00e1f505000000001976a91464d51a27c8b8434458bac0193039bae55ca023c388ac151c0900\"] +``` + +Result: + +```json +[ + { + "txid": "06464b9c80413a49ab3c618f769a11647b6011f9ad15094eb423916ae5bc0c23", + "allowed": false, + "reject-reason": "18: txn-already-in-mempool" + } +] +``` + +_See also:_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. +* [SignRawTransactionWithKey](#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. + +## UTXOUpdatePSBT + +The [`utxoupdatepsbt` RPC](../api/remote-procedure-calls-raw-transactions.md#utxoupdatepsbt) updates a PSBT with data from output descriptors, UTXOs retrieved from the UTXO set or the mempool. + +_Parameter #1---psbt_ + +| Name | Type | Presence | Description | +| ---- | ------ | -------- | ------------------------- | +| psbt | string | Required | A base64 string of a PSBT | + +_Parameter #2---descriptors_ + +| Name | Type | Presence | Description | +| ---------------------------------- | ---------------- | ----------------------- | ---------------------------------------------------------------------------------------- | +| psbt | array | Optional
(0 or 1) | An array of either strings or objects | +| →
Output descriptor | string | Optional
(0 or 1) | An output descriptor | +| →
Output object | object | Optional
(0 or 1) | An object with an output descriptor and extra information | +| → →
`desc` | string | Required
(exactly 1) | An output descriptor | +| → →
`range`
(`n` or `[n,n]`) | numeric or array | Optional
(0 or 1) | Up to what index HD chains should be explored (either end or [begin,end]) (default=1000) | + +_Result---the raw transaction in base64_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------------------------------- | +| Result | string | Required
(Exactly 1) | The resulting raw transaction (base64-encoded string) | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet utxoupdatepsbt cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA= +``` + +Result: + +``` +cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA= +``` + +_See also:_ + +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. +* [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. diff --git a/docs/core/api/remote-procedure-calls-removed.md b/docs/core/api/remote-procedure-calls-removed.md new file mode 100644 index 000000000..363d0d28e --- /dev/null +++ b/docs/core/api/remote-procedure-calls-removed.md @@ -0,0 +1,63 @@ +```{eval-rst} +.. meta:: + :title: Removed RPCs + :description: A list of RPCs that have recently been removed from Dash Core. +``` + +# Removed RPCs + +The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/api/remote-procedure-calls-removed.html) for RPCs removed longer ago. + +## GObject Vote-conf + +:::{attention} +Removed in Dash Core 20.0.0 +::: + +The `gobject vote-conf` RPC votes on a governance object by masternode configured in dash.conf. + +*Parameter #1---governance hash* + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ----------------------------- | +| `governance-hash` | string (hex) | Required
(exactly 1) | Hash of the governance object | + +*Parameter #2---vote signal* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | -------------------------------------------- | +| `signal` | string | Required
(exactly 1) | Vote signal: `funding`, `valid`, or `delete` | + +*Parameter #3---vote outcome* + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | --------------------------------------- | +| `outcome` | string | Required
(exactly 1) | Vote outcome: `yes`, `no`, or `abstain` | + +*Result---votes for specified governance* + +| Name | Type | Presence | Description | +| ------------------ | ------ | ----------------------- | ----------------------------------------- | +| Result | object | Required
(exactly 1) | The governance object votes | +| →
`overall` | string | Required
(1 or more) | Reports number of vote successes/failures | +| →
`detail` | object | Required
(exactly 1) | Vote details | +| → →
`dash.conf` | object | Required
(1 or more) | | +| → → →
`result` | string | Required
(exactly 1) | Vote result | + +*Example from Dash Core 0.12.2* + +``` bash +dash-cli -testnet gobject vote-conf \ +0bf97bce78b3b642c36d4ca8e9265f8f66de8774c220221f57739c1956413e2b funding yes +``` + +``` json +{ + "overall": "Voted successfully 1 time(s) and failed 0 time(s).", + "detail": { + "dash.conf": { + "result": "success" + } + } +} +``` diff --git a/docs/core/api/remote-procedure-calls-util.md b/docs/core/api/remote-procedure-calls-util.md new file mode 100644 index 000000000..8cb14a351 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-util.md @@ -0,0 +1,428 @@ +```{eval-rst} +.. meta:: + :title: Util RPCs + :description: A list of utility remote procedure calls in Dash Core. +``` + +# Util RPCs + +## CreateMultiSig + +The [`createmultisig` RPC](../api/remote-procedure-calls-util.md#createmultisig) creates a P2SH multi-signature address. + +*Parameter #1---the number of signatures required* + +Name | Type | Presence | Description +--- | --- | --- | --- +Required | number (int) | Required
(exactly 1) | The minimum (*m*) number of signatures required to spend this m-of-n multisig script + +*Parameter #2---the full public keys* + +:::{attention} +As of Dash Core 0.17.0, using addresses with `createmultisig` is unsupported. Clients must use [`addmultisigaddress`](../api/remote-procedure-calls-wallet.md#addmultisigaddress) to create multisig addresses. +::: + +Name | Type | Presence | Description +--- | --- | --- | --- +Keys | array | Required
(exactly 1) | An array of strings with each string being a public key +→
Key | string | Required
(1 or more) | A public key against which signatures will be checked. There must be at least as many keys as specified by the `Required` parameter, and there may be more keys + +*Result---P2SH address and hex-encoded redeem script* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | An object describing the multisig address +→
`address` | string (base58) | Required
(exactly 1) | The P2SH address for this multisig redeem script +→
`redeemScript` | string (hex) | Required
(exactly 1) | The multisig redeem script encoded as hex +→
`descriptor` | string (hex) | Required
(exactly 1) | The descriptor for this multisig + +*Example from Dash Core 20.0.0* + +Creating a 1-of-2 P2SH multisig address by combining two full public keys: + +``` bash +dash-cli -testnet createmultisig 1 ''' + [ + "03283a224c2c014d1d0ef82b00470b6b277d71e227c0e2394f9baade5d666e57d3", + "02594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb6223" + ] +''' +``` + +Result: + +``` json +{ + "address": "8jYUv8hJcbSUPbwYmzp1XMPU6SXoic3hwi", + "redeemScript": "512103283a224c2c014d1d0ef82b00470b6b277d71e227c0e2394f9baade5d666e57d32102594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb622352ae", + "descriptor": "sh(multi(1,03283a224c2c014d1d0ef82b00470b6b277d71e227c0e2394f9baade5d666e57d3,02594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb6223))#x7tdvpdd" +} +``` + +*See also* + +* [AddMultiSigAddress](../api/remote-procedure-calls-wallet.md#addmultisigaddress): adds a P2SH multisig address to the wallet. +* [DecodeScript](../api/remote-procedure-calls-raw-transactions.md#decodescript): decodes a hex-encoded P2SH redeem script. + +## DeriveAddresses + +*Added in Dash Core 18.0.0* + +The [`deriveaddresses` RPC](../api/remote-procedure-calls-util.md#deriveaddresses) derives one or more addresses corresponding to an output [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md). + +Examples of output descriptors are: + +| Descriptor format | Description | +| - | - | +| `pkh()` | P2PKH outputs for the given pubkey | +| `sh(multi(,,,...))` | P2SH-multisig outputs for the given threshold and pubkeys | +| `raw()` | Outputs whose scriptPubKey equals the specified hex scripts | + +In the above, either refers to a fixed public key in hexadecimal notation, or to an xpub/xprv optionally followed by one or more path elements separated by "/", where "h" represents a hardened child key. For more information on output descriptors, see the documentation in the [doc/descriptors.md](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) file. + +*Parameter #1---the descriptor* + +Name | Type | Presence | Description +--- | --- | --- | --- +`descriptor` | string | Required
(exactly 1) | The [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) + +*Parameter #2---range* + +Name | Type | Presence | Description +--- | --- | --- | --- +`range` | number | Optional
(0 or 1) | If a ranged descriptor is used, this specifies the end or the range (in [begin,end] notation) to derive (e.g. "[0,2]"). + +*Result---the derived addresses* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | Array of derived addresses +→
Address | string | Required
(0 or more) | The derived address(es) + +*Example from Dash Core 18.0.0* + +Analyse a descriptor: + +``` bash +dash-cli deriveaddresses "pkh([8a54e0c5]0214889c34100d00aca6e7cbfe0fa72d83c28857585740bff5f3db6b37e51d9aaa)#wyvgzv2k" +``` + +Result: + +``` json +[ + "yYvsn6vdnkeq9VG1JbkfqKbjv3gUmFmnny" +] +``` + +*See also* + +* [GetDescriptorInfo](#getdescriptorinfo): analyses a descriptor. +* [ScanTxOutset](../api/remote-procedure-calls-wallet.md#scantxoutset): signs a message with the private key of an address. + +## EstimateSmartFee + +The [`estimatesmartfee` RPC](../api/remote-procedure-calls-util.md#estimatesmartfee) estimates the transaction fee per kilobyte that needs to be paid for a transaction to begin confirmation within a certain number of blocks and returns the number of blocks for which the estimate is valid. + +*Parameter #1---how many confirmations the transaction may wait before being included* + +Name | Type | Presence | Description +--- | --- | --- | --- +conf_target | number (int) | Required
(exactly 1) | Confirmation target in blocks (1 - 1008) + +*Parameter #2---estimate mode* + +Name | Type | Presence | Description +--- | --- | --- | --- +estimate_mode | string | Optional
Default=
`CONSERVATIVE` | The fee estimate mode. Whether to return a more conservative estimate which also satisfies a longer history. A conservative estimate potentially returns a higher feerate and is more likely to be sufficient for the desired target, but is not as responsive to short term drops in the prevailing fee market. Must be one of:
`UNSET` (defaults to `CONSERVATIVE`)
`ECONOMICAL`
`CONSERVATIVE` + +*Result---the fee the transaction needs to pay per kilobyte* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | JSON Object containing estimate information +→
`feerate` | number (Dash) | Optional
(0 or 1) | The estimated fee the transaction should pay in order to be included within the specified number of blocks. If the node doesn't have enough information to make an estimate, this field will not be returned +→
`error` | JSON array (strings) | Optional
(0 or 1) | Errors encountered during processing +→
`blocks` | number | Required
(exactly 1) | Block number where the estimate was found + +*Examples from Dash Core 0.15.0* + +``` bash +dash-cli estimatesmartfee 6 +``` + +Result: + +``` json +{ + "feerate": 0.00044345, + "blocks": 6 +} +``` + +Requesting data the node can't calculate (out of range): + +``` bash +dash-cli estimatesmartfee 2 +``` + +Result: + +``` json +{ + "errors": [ + "Insufficient data or no feerate found" + ], + "blocks": 2 +} +``` + +*See also* + +* [SetTxFee](../api/remote-procedure-calls-wallet.md#settxfee): sets the transaction fee per kilobyte paid by transactions created by this wallet. + +## GetDescriptorInfo + +*Added in Dash Core 18.0.0* + +The [`getdescriptorinfo` RPC](../api/remote-procedure-calls-util.md#getdescriptorinfo) analyses a [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md). + +*Parameter #1---the descriptor* + +Name | Type | Presence | Description +--- | --- | --- | --- +`descriptor` | string | Required
(exactly 1) | The [descriptor](https://github.com/dashpay/dash/blob/master/doc/descriptors.md) + +*Result---the descriptor info* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the descriptor +→
`descriptor` | string | Required
(exactly 1) | The descriptor in canonical form, without private keys +→
`checksum` | string | Required
(exactly 1) | The checksum for the input descriptor +→
`isrange` | bool | Required
(exactly 1) | Whether the descriptor is ranged +→
`issolvable` | bool | Required
(exactly 1) | Whether the descriptor is solvable +→
`hasprivatekeys` | bool | Required
(exactly 1) | Whether the input descriptor contained at least one private key + +*Example from Dash Core 18.0.0* + +Analyse a descriptor: + +``` bash +dash-cli getdescriptorinfo "pkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)" +``` + +Result: + +``` json +{ + "descriptor": "pkh([d34db33f/84'/0'/0']0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)#9ffuvyvv", + "checksum": "yrc20h56", + "isrange": false, + "issolvable": true, + "hasprivatekeys": false +} +``` + +*See also* + +* [ScanTxOutset](../api/remote-procedure-calls-wallet.md#scantxoutset): signs a message with the private key of an address. + +## GetIndexInfo + +*Added in Dash Core 20.0.0* + +The [`getindexinfo` RPC](../api/remote-procedure-calls-util.md#getindexinfo) returns the status of one or all available indices currently running in the node. + +*Parameter #1---the index name* + +Name | Type | Presence | Description +--- | --- | --- | --- +`index_name` | string | Optional
(0 or 1) | Filter results for an index with a specific name + +*Result---the index info* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the descriptor +→
`name` | string | Required
(exactly 1) | The descriptor in canonical form, without private keys +→ →
`synced` | string | Required
(exactly 1) | The checksum for the input descriptor +→ →
`best_block_height` | bool | Required
(exactly 1) | Whether the descriptor is ranged + +*Example from Dash Core 20.0.0* + +Get index information: + +``` bash +dash-cli getindexinfo +``` + +Result: + +``` json +{ + "txindex": { + "synced": true, + "best_block_height": 917241 + } +} +``` + +*See also: none* + +## SignMessageWithPrivKey + +*Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0* + +The [`signmessagewithprivkey` RPC](../api/remote-procedure-calls-util.md#signmessagewithprivkey) signs a message with a given private key. + +*Parameter #1---the private key to sign with* + +Name | Type | Presence | Description +--- | --- | --- | --- +Private Key | string (base58) | Required
(exactly 1) | The private key to sign the message with encoded in base58check using wallet import format (WIF) + +*Parameter #2---the message to sign* + +Name | Type | Presence | Description +--- | --- | --- | --- +Message | string | Required
(exactly 1) | The message to sign + +*Result---the message signature* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | string (base64) | Required
(exactly 1) | The signature of the message, encoded in base64. + +*Example from Dash Core 0.12.3* + +Sign a the message "Hello, World!" using the following private key: + +``` bash +dash-cli signmessagewithprivkey cNKbZBqUCjuBRSnAJWwFWxKESJ5Lw\ +G4uxBSJ1UeBNBGVRupFKr6S "Hello, World!" +``` + +Result: + +``` text +IBx8jxFjutPlcZcFdQPlA2n/B4yTrYhH43qYJURKRj7LWhSD0ERE/nnRLOnXi/gwULUcqfqOKqnqkSvuJjlgEvc= +``` + +*See also* + +* [SignMessage](../api/remote-procedure-calls-wallet.md#signmessage): signs a message with the private key of an address. +* [VerifyMessage](../api/remote-procedure-calls-util.md#verifymessage): verifies a signed message. + +## ValidateAddress + +The [`validateaddress` RPC](../api/remote-procedure-calls-util.md#validateaddress) returns information about the given Dash address. + +*Parameter #1---a P2PKH or P2SH address* + +Name | Type | Presence | Description +--- | --- | --- | --- +Address | string (base58) | Required
(exactly 1) | The P2PKH or P2SH address to validate encoded in base58check format + +*Result---information about the address* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object | Required
(exactly 1) | Information about the address +→
`isvalid` | bool | Required
(exactly 1) | Set to `true` if the address is a valid P2PKH or P2SH address; set to `false` otherwise +→
`address` | string (base58) | Optional
(0 or 1) | The Dash address given as parameter +→
`scriptPubKey` | string (hex) | Optional
(0 or 1) | The hex encoded scriptPubKey generated by the address +→
`isscript` | bool | Optional
(0 or 1) | Set to `true` if a P2SH address; otherwise set to `false`. Only returned if the address is in the wallet +→`error` | string | Optional
(0 or 1) | Error message, if any + +*Example from Dash Core 20.1.0* + +Validate the following P2PKH address from the wallet: + +``` bash +dash-cli validateaddress yNpezfFDfoikDuT1f4iK75AiLp2YLPsGAb +``` + +Result: + +``` json +{ + "isvalid": true, + "address": "yNpezfFDfoikDuT1f4iK75AiLp2YLPsGAb", + "scriptPubKey": "76a9141b767409bd8717b56cfcb00747811432ab1aa8a788ac", + "isscript": false +} +``` + +Validate the following P2SH multisig address from the wallet: + +``` bash +dash-cli -testnet validateaddress 8uJLxDxk2gEMbidF5vT8XLS2UCgQmVcroW +``` + +Result: + +``` json +{ + "isvalid": true, + "address": "8uJLxDxk2gEMbidF5vT8XLS2UCgQmVcroW", + "scriptPubKey": "a914a33155e490d146e656a9bac2cbee9c625ef42f0a87", + "isscript": true +} +``` + +*See also* + +* [ImportAddress](../api/remote-procedure-calls-wallet.md#importaddress): adds an address or pubkey script to the wallet without the associated private key, allowing you to watch for transactions affecting that address or pubkey script without being able to spend any of its outputs. +* [GetNewAddress](../api/remote-procedure-calls-wallet.md#getnewaddress): returns a new Dash address for receiving payments. If an account is specified, payments received with the address will be credited to that account. +* [GetAddressInfo](../api/remote-procedure-calls-wallet.md#getaddressinfo): returns information about the given Dash address. + +## VerifyMessage + +The [`verifymessage` RPC](../api/remote-procedure-calls-util.md#verifymessage) verifies a signed message. + +*Parameter #1---the address corresponding to the signing key* + +Name | Type | Presence | Description +--- | --- | --- | --- +Address | string (base58) | Required
(exactly 1) | The P2PKH address corresponding to the private key which made the signature. A P2PKH address is a hash of the public key corresponding to the private key which made the signature. When the ECDSA signature is checked, up to four possible ECDSA public keys will be reconstructed from from the signature; each key will be hashed and compared against the P2PKH address provided to see if any of them match. If there are no matches, signature validation will fail + +*Parameter #2---the signature* + +Name | Type | Presence | Description +--- | --- | --- | --- +Signature | string (base64) | Required
(exactly 1) | The signature created by the signer encoded as base-64 (the format output by the [`signmessage` RPC](../api/remote-procedure-calls-wallet.md#signmessage)) + +*Parameter #3---the message* + +Name | Type | Presence | Description +--- | --- | --- | --- +Message | string | Required
(exactly 1) | The message exactly as it was signed (e.g. no extra whitespace) + +*Result: `true`, `false`, or an error* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | boolean | Required
(exactly 1) | Set to `true` if the message was signed by a key corresponding to the provided P2PKH address; set to `false` if it was not signed by that key; set to JSON `null` if an error occurred + +*Example from Dash Core 0.12.2* + +Check the signature on the message created in the example for +`signmessage`: + +``` bash +dash-cli -testnet verifymessage \ + yNpezfFDfoikDuT1f4iK75AiLp2YLPsGAb \ + H4XULzfHCf16In2ECk9Ta9QxQPq639zQto2JA3OLlo3JbUdrClvJ89+A1z+Z9POd6l8LJhn1jGpQYF8mX4jkQvE= \ + 'Hello, World!' +``` + +Result: + +``` json +true +``` + +*See also* + +* [SignMessage](../api/remote-procedure-calls-wallet.md#signmessage): signs a message with the private key of an address. diff --git a/docs/core/api/remote-procedure-calls-wallet-deprecated.md b/docs/core/api/remote-procedure-calls-wallet-deprecated.md new file mode 100644 index 000000000..91a9a747b --- /dev/null +++ b/docs/core/api/remote-procedure-calls-wallet-deprecated.md @@ -0,0 +1,13 @@ +```{eval-rst} +.. meta:: + :title: Wallet RPCs + :description: A list of deprecated Wallet RPCs. +``` + +# Wallet RPCs (Deprecated) + +:::{attention} +RPCs that require wallet support are **not available on masternodes** for security reasons. Such RPCs are designated with a "_Requires wallet support_" message. +::: + +The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/api/remote-procedure-calls-wallet-deprecated.html) for RPCs removed longer ago. diff --git a/docs/core/api/remote-procedure-calls-wallet.md b/docs/core/api/remote-procedure-calls-wallet.md new file mode 100644 index 000000000..949114340 --- /dev/null +++ b/docs/core/api/remote-procedure-calls-wallet.md @@ -0,0 +1,3886 @@ +```{eval-rst} +.. meta:: + :title: Wallet RPCs + :description: A list of remote procedure calls in Dash that are used to perform wallet operations such as sending, creating and categorizing addresses, etc. +``` + +# Wallet RPCs + +:::{attention} +RPCs that require wallet support are **not available on masternodes** for security reasons. Such RPCs are designated with a "_Requires wallet support_" message. +::: + +## AbandonTransaction + +_Added in Bitcoin Core 0.12.0_ + +The [`abandontransaction` RPC](../api/remote-procedure-calls-wallet.md#abandontransaction) marks an in-wallet transaction and all its in-wallet descendants as abandoned. This allows their inputs to be respent. + +_Parameter #1---a transaction identifier (TXID)_ + +| Name | Type | Presence | Description | +| ---- | ------------ | ----------------------- | -------------------------------------------------------------------------------------------------------- | +| TXID | string (hex) | Required
(exactly 1) | The TXID of the transaction that you want to abandon. The TXID must be encoded as hex in RPC byte order | + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | JSON `null` when the transaction and all descendants were abandoned | + +_Example from Dash Core 0.12.2_ + +Abandons the transaction on your node. + +```bash +dash-cli abandontransaction fa3970c341c9f5de6ab13f128cbfec58d732e736a505fe32137ad551c799ecc4 +``` + +Result (no output from `dash-cli` because result is set to `null`). + +_See also_ + +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. + +## AbortRescan + +The [`abortrescan` RPC](../api/remote-procedure-calls-wallet.md#abortrescan) Stops current wallet rescan + +Stops current wallet rescan triggered e.g. by an [`importprivkey` RPC](../api/remote-procedure-calls-wallet.md#importprivkey) call. + +_Parameters: none_ + +_Result---`true` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | -------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | `true` when the command was successful or `false` if not successful. | + +_Example from Dash Core 0.15.0_ + +Abort the running wallet rescan + +```bash +dash-cli -testnet abortrescan +``` + +Result: + +```text +true +``` + +_See also: none_ + +## AddMultiSigAddress + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`addmultisigaddress` RPC](../api/remote-procedure-calls-wallet.md#addmultisigaddress) adds a P2SH multisig address to the wallet. Each key is a Dash address or hex-encoded public key. This functionality is only intended for use with non-watchonly addresses. See [`importaddress` RPC](../api/remote-procedure-calls-wallet.md#importaddress) for watchonly p2sh address support. If 'label' is specified, assign address to that label. + +_Parameter #1---the number of signatures required_ + +| Name | Type | Presence | Description | +| -------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------ | +| Required | number (int) | Required
(exactly 1) | The minimum (_m_) number of signatures required to spend this m-of-n multisig script | + +_Parameter #2---the full public keys, or addresses for known public keys_ + +| Name | Type | Presence | Description | +| ------------------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Keys Or Addresses | array | Required
(exactly 1) | An array of strings with each string being a public key or address | +| →
Key Or Address | string | Required
(1 or more) | A public key against which signatures will be checked. Alternatively, this may be a P2PKH address belonging to the wallet---the corresponding public key will be substituted. There must be at least as many keys as specified by the Required parameter, and there may be more keys | + +_Parameter #3---label_ + +| Name | Type | Presence | Description | +| ----- | ------ | -------------------- | ----------------------------------- | +| Label | string | Optional
(0 or 1) | A label to assign the addresses to. | + +_Result---P2SH address and hex-encoded redeem script_ + +| Name | Type | Presence | Description | +| ------------------- | --------------- | ----------------------- | ------------------------------------------------ | +| `result` | object | Required
(exactly 1) | An object describing the multisig address | +| →
`address` | string (base58) | Required
(exactly 1) | The P2SH address for this multisig redeem script | +| →
`redeemScript` | string (hex) | Required
(exactly 1) | The multisig redeem script encoded as hex | + +_Example from Dash Core 20.0.0_ + +Adding a 1-of-2 P2SH multisig address with the label "test label" by combining one P2PKH address and one full public key: + +```bash +dash-cli -testnet -rpcwallet="" addmultisigaddress 1 ''' + [ + "ySxkBWzPwMrZLAY9ZPitMnSwf4NSUBPbiH", + "02594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb6223" + ] +''' 'test label' +``` + +Result: + +```json +{ + "address": "8jYUv8hJcbSUPbwYmzp1XMPU6SXoic3hwi", + "redeemScript": "512103283a224c2c014d1d0ef82b00470b6b277d71e227c0e2394f9baade5d666e57d32102594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb622352ae", + "descriptor": "sh(multi(1,[48de9d39]03283a224c2c014d1d0ef82b00470b6b277d71e227c0e2394f9baade5d666e57d3,[dec361f1]02594523b004e82849a66b3da096b1e680bf2ed5f7d03a3443c027aa5777bb6223))#vtc5zmh2" +} +``` + +(New P2SH multisig address also stored in wallet.) + +_See also_ + +* [CreateMultiSig](../api/remote-procedure-calls-util.md#createmultisig): creates a P2SH multi-signature address. +* [DecodeScript](../api/remote-procedure-calls-raw-transactions.md#decodescript): decodes a hex-encoded P2SH redeem script. + +## BackupWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`backupwallet` RPC](../api/remote-procedure-calls-wallet.md#backupwallet) safely copies `wallet.dat` to the specified file, which can be a directory or a path with filename. + +_Parameter #1---destination directory or filename_ + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Destination | string | Required
(exactly 1) | A filename or directory name. If a filename, it will be created or overwritten. If a directory name, the file `wallet.dat` will be created or overwritten within that directory | + +_Result---`null` or error_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `result` | null | Required
(exactly 1) | Always `null` whether success or failure. The JSON-RPC error and message fields will be set if a failure occurred | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet backupwallet /tmp/backup.dat +``` + +_See also_ + +* [DumpWallet](../api/remote-procedure-calls-wallet.md#dumpwallet): creates or overwrites a file with all wallet keys in a human-readable format. +* [ImportWallet](../api/remote-procedure-calls-wallet.md#importwallet): imports private keys from a file in wallet dump file format (see the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet)). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes. + +## CreateWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`createwallet` RPC](../api/remote-procedure-calls-wallet.md#createwallet) creates and loads a new wallet. + +_Parameter #1---wallet name_ + +| Name | Type | Presence | Description | +| ------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------ | +| `wallet_name` | string | Required
(exactly 1) | The name for the new wallet. If this is a path, the wallet will be created at the path location. | + +_Parameter #2---disable private keys_ + +| Name | Type | Presence | Description | +| ---------------------- | ---- | -------------------- | ----------------------------------------------------------------------------------- | +| `disable_private_keys` | bool | Optional
(0 or 1) | Disable the possibility of private keys. Only watchonlys are possible in this mode. | + +_Parameter #3---blank_ + +| Name | Type | Presence | Description | +| ------- | ---- | -------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `blank` | bool | Optional
(0 or 1) | Create a blank wallet. A blank wallet has no keys or HD seed. Use [`upgradetohd`](#upgradetohd) (mnemonic) or [`sethdseed`](#sethdseed) (WIF private key) to add an HD seed. | + +_Parameter #4---passphrase_ + +| Name | Type | Presence | Description | +| ------------ | ------ | -------------------- | ---------------------------------------- | +| `passphrase` | string | Optional
(0 or 1) | Encrypt the wallet with this passphrase. | + +_Parameter #5---avoid coin reuse_ + +| Name | Type | Presence | Description | +| ------------- | ---- | -------------------- | ---------------------------------------------------------------------------------------------------------- | +| `avoid_reuse` | bool | Optional
(0 or 1) | Keep track of coin reuse, and treat dirty and clean coins differently with privacy considerations in mind. | + +_Parameter #6---descriptors_ + +| Name | Type | Presence | Description | +| ------------- | ---- | -------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `descriptors` | bool | Optional
(0 or 1) | Create a native descriptor wallet. The wallet will use descriptors internally to handle address creation. | + +_Parameter #7---load on startup_ + +| Name | Type | Presence | Description | +| ----------------- | ---- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| `load_on_startup` | bool | Optional
(0 or 1) | Save wallet name to persistent settings and load on startup. True to add wallet to startup list, false to remove, null to leave unchanged. | + +_Result---wallet name and any warnings_ + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object containing information about wallet creation | +| →
`name` | string | Required
(exactly 1) | The wallet name if created successfully. If the wallet was created using a full path, the `wallet_name` will be the full path | +| →
`warning` | string | Required
(exactly 1) | Warning message if wallet was not loaded cleanly. | + +_Example from Dash Core 0.17.0_ + +```bash +dash-cli -testnet createwallet new-wallet +``` + +Result: + +```json +{ + "name": "new-wallet", + "warning": "" +} +``` + +:::{note} +In the example above, a new directory named `new-wallet` was created in the current data directory (`~/.dashcore/testnet3/`). This new directory contains the wallet.dat file and other related wallet files for the new wallet. +::: + +_See also_ + +* [LoadWallet](../api/remote-procedure-calls-wallet.md#loadwallet): loads a wallet from a wallet file or directory. + +## DumpHDInfo + +The [`dumphdinfo` RPC](../api/remote-procedure-calls-wallet.md#dumphdinfo) returns an object containing sensitive private info about this HD wallet + +_Parameters: none_ + +_Result---HD wallet information_ + +| Name | Type | Presence | Description | +| -------------------------- | ------ | ----------------------- | ----------------------------------------------------------------- | +| Result | object | Required
(exactly 1) | An object containing sensitive private info about this HD wallet. | +| →
`hdseed` | string | Required
(exactly 1) | The BIP-32 HD seed (in hex) | +| →
`mnemonic` | string | Required
(exactly 1) | The BIP-39 mnemonic for this HD wallet (English words) | +| →
`mnemonicpassphrase` | string | Required
(exactly 1) | The BIP-39 mnemonic passphrase for this HD wallet (may be empty) | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet dumphdinfo +``` + +Result (truncated for security reasons): + +```json +{ + "hdseed": "20c63c3fb298ebd52de3 ...", + "mnemonic": "cost circle shiver ...", + "mnemonicpassphrase": "" +} +``` + +_See also: none_ + +## DumpPrivKey + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked or unencrypted wallet. +::: + +The [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey) returns the wallet-import-format (WIP) private key corresponding to an address. (But does not remove it from the wallet.) + +_Parameter #1---the address corresponding to the private key to get_ + +| Name | Type | Presence | Description | +| ------------- | --------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| P2PKH Address | string (base58) | Required
(exactly 1) | The P2PKH address corresponding to the private key you want returned. Must be the address corresponding to a private key in this wallet | + +_Result---the private key_ + +| Name | Type | Presence | Description | +| -------- | --------------- | ----------------------- | ----------------------------------------------------------------- | +| `result` | string (base58) | Required
(exactly 1) | The private key encoded as base58check using wallet import format | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet dumpprivkey ycBuREgSskHHkWLxDa9A5WppCki6PfFycL +``` + +Result: + +```text +cQZZ4awQvcXXyES3CmUJqSgeTobQm9t9nyUr337kvUtsWsnvvMyw +``` + +_See also_ + +* [ImportPrivKey](../api/remote-procedure-calls-wallet.md#importprivkey): adds a private key to your wallet. The key should be formatted in the wallet import format created by the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey). +* [DumpWallet](../api/remote-procedure-calls-wallet.md#dumpwallet): creates or overwrites a file with all wallet keys in a human-readable format. + +## DumpWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked or unencrypted wallet. +::: + +The [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet) creates or overwrites a file with all wallet keys in a human-readable format. + +_Parameter #1---a filename_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Filename | string | Required
(exactly 1) | The filename with path (either absolute or relative to Dash Core) into which the wallet dump will be placed. An existing file with that name will be overwritten. | + +_Result---information about exported wallet_ + +| Name | Type | Presence | Description | +| ---------------------- | ------------ | ----------------------- | ------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | An object describing dumped wallet file | +| →
`dashcoreversion` | string | Required
(exactly 1) | Dash Core build details | +| →
`lastblockheight` | int | Required
(exactly 1) | Height of the most recent block received | +| →
`lastblockhash` | string (hex) | Required
(exactly 1) | Hash of the most recent block received | +| →
`lastblocktime` | string | Required
(exactly 1) | Timestamp of the most recent block received | +| →
`keys` | int | Required
(exactly 1) | Number of keys dumped | +| →
`filename` | string | Required
(exactly 1) | Name of the file the wallet was dumped to | +| →
`warning` | string | Required
(exactly 1) | Warning to not share the file due to it containing the private keys | + +_Example from Dash Core 0.13.0_ + +Create a wallet dump and then print its first 10 lines. + +```bash +dash-cli -testnet dumpwallet /tmp/dump.txt +head /tmp/dump.txt +``` + +Results: + +```json +{ + "dashcoreversion": "v0.17.0.0", + "lastblockheight": 250186, + "lastblockhash": "0000000000a82fb1890de5da4740d0671910a436fe6fc4503a3e553adef073b4", + "lastblocktime": "2018-10-23T12:50:44Z", + "keys": 8135, + "file": "/tmp/dump.txt", + "warning": "/tmp/dump.txt file contains all private keys from this wallet. Do not share it with anyone!" +} +``` + +Results (the first 10 lines of the file): + +```bash +>>>>>>>># Wallet dump created by Dash Core v0.13.0.0 +>>>>>>>># * Created on 2020-12-09T18:40:52Z +>>>>>>>># * Best block at time of backup was 405635 (000000b2304f57eefd42cdd943e7736d479468beb08049b8f88d11ebc7cf6f02), +>>>>>>>># mined on 2020-12-09T18:40:23Z + +cQZZ4awQvcXXyES3CmUJqSgeTobQm9t9nyUr337kvUtsWsnvvMyw 2018-12-14T17:24:37Z change=1 # addr=ycBuREgSskHHkWLxDa9A5WppCki6PfFycL +cTBRPnJoPjEMh67v1zes437v8Po5bFLDWKgEudTJMhVaLs1ZVGJe 2018-12-14T17:24:37Z change=1 # addr=yNsWkgPLN1u7p5dfWYnasYdgirU2J3tjUj +cRkkwrFnQUrih3QiT87sNy1AxyfjzqVYSyVYuL3qnJcSiQfE4QJa 2018-12-14T17:24:37Z change=1 # addr=yRkHzRbRKn8gBp5826mbaBvxLuBBNDVQg3 +cQM7KoqQjHCCTrDhnfBEY1vpW9W65zRvaQeTb41UbFb6WX8Q8UkQ 2018-12-14T17:24:37Z change=1 # addr=yVEdefApUYiDLHApvvWCK5afTtJeQada8Y +cTGSKYaQTQabnjNSwCqpjYXiucVujTXiwp9dzmJV9cNAiayAJusi 2018-12-14T17:24:37Z change=1 # addr=ybQYgp21ZyZK8JuMLb2CVwG4TaWrXVXD5M +``` + +_See also_ + +* [BackupWallet](../api/remote-procedure-calls-wallet.md#backupwallet): safely copies `wallet.dat` to the specified file, which can be a directory or a path with filename. +* [ImportWallet](../api/remote-procedure-calls-wallet.md#importwallet): imports private keys from a file in wallet dump file format (see the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet)). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes. + +## EncryptWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`encryptwallet` RPC](../api/remote-procedure-calls-wallet.md#encryptwallet) encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. + +:::{warning} +If using this RPC on the command line, remember that your shell probably saves your command lines (including the value of the passphrase parameter). In addition, there is no RPC to completely disable encryption. If you want to return to an unencrypted wallet, you must create a new wallet and restore your data from a backup made with the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet). +::: + +_Parameter #1---a passphrase_ + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | ------------------------------------------------------------------------------- | +| Passphrase | string | Required
(exactly 1) | The passphrase to use for the encrypted wallet. Must be at least one character | + +_Result---a notice (with program shutdown)_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------------------------------------------------------------------------------------------- | +| `result` | string | Required
(exactly 1) | A notice that the server is stopping and that you need to make a new backup. The wallet is now encrypted | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet encryptwallet "test" +``` + +Result: + +```text +Wallet encrypted; Dash Core server stopping, restart to run with encrypted wallet. +The keypool has been flushed and a new HD seed was generated (if you are using +HD). You need to make a new backup. + +``` + +_See also_ + +* [WalletPassphrase](../api/remote-procedure-calls-wallet.md#walletpassphrase): stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. +* [WalletLock](../api/remote-procedure-calls-wallet.md#walletlock): removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. +* [WalletPassphraseChange](../api/remote-procedure-calls-wallet.md#walletpassphrasechange): changes the wallet passphrase from 'old passphrase' to 'new passphrase'. + +## GetAddressInfo + +*Added in Dash Core 0.17.0* + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getaddressinfo` RPC](../api/remote-procedure-calls-wallet.md#getaddressinfo) returns information about the given Dash address. Note: Some information requires the address to be in the wallet. + +_Parameter #1---a P2PKH or P2SH address_ + +| Name | Type | Presence | Description | +| ------- | --------------- | ----------------------- | ----------- | +| Address | string (base58) | Required
(exactly 1) | The P2PKH or P2SH address encoded in base58check format | + +_Result---returns information about the address_ + +| Name | Type | Presence | Description | +| -------------------------- | ---------------- | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | Information about the address | +| →
`address` | string (base58) | Required
(exactly 1) | The Dash address given as parameter | +| →
`scriptPubKey` | string (hex) | Required
(exactly 1) | The hex encoded scriptPubKey generated by the address | +| →
`ismine` | bool | Required
(exactly 1) | Set to `true` if the address belongs to the wallet; set to false if it does not. Only returned if wallet support enabled | +| →
`iswatchonly` | bool | Required
(exactly 1) | Set to `true` if the address is watch-only. Otherwise set to `false`. Only returned if address is in the wallet | +| →
`solvable` | bool | Required
(exactly 1) | Whether we know how to spend coins sent to this address, ignoring the possible lack of private keys | +| →
`desc` | string | Optional
(0 or 1) | A descriptor for spending coins sent to this address (only present when `solvable` is `true`) | +| →
`parent_desc` | string | Optional
(0 or 1) | The descriptor used to derive this address if this is a descriptor wallet. | +| →
`isscript` | bool | Required
(exactly 1) | Set to `true` if a P2SH address; otherwise set to `false`. Only returned if the address is in the wallet | +| →
`ischange` | bool | Required
(exactly 1) | Set to `true` if the address was used for change output. | +| →
`script` | string | Optional
(0 or 1) | The output script type. Possible types include: `nonstandard`, `pubkey`, `pubkeyhash`, `scripthash`, `multisig`, `nulldata`. Only returned if `isscript` is true and the redeemscript is known. | +| →
`script` | string | Optional
(0 or 1) | Only returned for P2SH addresses belonging to this wallet. This is the type of script:
• `pubkey` for a P2PK script inside P2SH
• `pubkeyhash` for a P2PKH script inside P2SH
• `multisig` for a multisig script inside P2SH
• `nonstandard` for unknown scripts | +| →
`hex` | string (hex) | Optional
(0 or 1) | Only returned for P2SH addresses belonging to this wallet. This is the redeem script encoded as hex | +| →
`pubkeys` | array | Optional
(0 or 1) | Array of pubkeys associated with the known redeemscript (only if `script` is "multisig") | +| → →
Pubkey | string | Optional
(0 or more) | A public key | +| →
`addresses` | array | Optional
(0 or 1) | Array of addresses associated with the known redeemscript (only if "script" is "multisig"). | +| → →
Address | string | Optional
(0 or more) | An address. | +| →
`sigsrequired` | number (int) | Optional
(0 or 1) | Only returned for multisig P2SH addresses belonging to the wallet. The number of signatures required by this script | +| →
`pubkey` | string (hex) | Optional
(0 or 1) | The public key corresponding to this address. Only returned if the address is a P2PKH address in the wallet | +| →
`iscompressed` | bool | Optional
(0 or 1) | Set to `true` if a compressed public key or set to `false` if an uncompressed public key. Only returned if the address is a P2PKH address in the wallet | +| →
`timestamp` | number (int) | Optional
(0 or 1) | The creation time of the key if available in seconds since epoch (Jan 1 1970 GMT) | +| →
`hdchainid` | string (hash160) | Optional
(0 or 1) | The ID of the HD chain | +| →
`hdkeypath` | string | Optional
(0 or 1) | The HD keypath if the key is HD and available | +| →
`hdseedid` | string (hex) | Optional
(0 or 1) | The Hash160 of the HD seed. | +| →
`hdmasterfingerprint` | string | Optional
(0 or 1) | The fingerprint of the master key | +| →
`labels` | array | Optional
(0 or 1) | **Updated in Dash Core 21.0.0**
An array of labels associated with the address. Currently limited to one label but returned as an array to keep the API stable if multiple labels are enabled in the future. | + +_Example from Dash Core 21.0.0_ + +Get info for the following P2PKH address from the wallet: + +```bash +dash-cli getaddressinfo "yZ9fa6vzAS5yz3QjA8etgA4ka1GD2X9ouq" +``` + +Result: + +```json +{ + "address": "yZ9fa6vzAS5yz3QjA8etgA4ka1GD2X9ouq", + "scriptPubKey": "76a9148cc018804bcca348bae6c8cdf8c0890b09cc42ca88ac", + "ismine": true, + "solvable": true, + "desc": "pkh([2849fa86/44'/1'/0'/0/1]03ad075b0b163e9cd17a24143f8914c51abc697e0706c7a0d54594b3487f0ff15c)#k2juu6h5", + "iswatchonly": false, + "isscript": false, + "pubkey": "03ad075b0b163e9cd17a24143f8914c51abc697e0706c7a0d54594b3487f0ff15c", + "iscompressed": true, + "ischange": false, + "timestamp": 1692213593, + "hdchainid": "51cbaf0337e7f59ae8ad81360b20ebbb68019bab8d9d2d84ce39e20dc635b940", + "hdkeypath": "m/44'/1'/0'/0/1", + "hdmasterfingerprint": "2849fa86", + "labels": [ + "" + ] +} +``` + +Get info for the following P2SH multisig address from the wallet: + +```bash +dash-cli -testnet getaddressinfo 8uJLxDxk2gEMbidF5vT8XLS2UCgQmVcroW +``` + +Result: + +```json +{ + "address": "8uJLxDxk2gEMbidF5vT8XLS2UCgQmVcroW", + "scriptPubKey": "a914a33155e490d146e656a9bac2cbee9c625ef42f0a87", + "ismine": false, + "solvable": false, + "iswatchonly": false, + "isscript": true, + "ischange": false, + "labels": [ + "" + ] +} +``` + +_See also_ + +* [ImportAddress](../api/remote-procedure-calls-wallet.md#importaddress): adds an address or pubkey script to the wallet without the associated private key, allowing you to watch for transactions affecting that address or pubkey script without being able to spend any of its outputs. +* [GetNewAddress](../api/remote-procedure-calls-wallet.md#getnewaddress): returns a new Dash address for receiving payments. If an account is specified, payments received with the address will be credited to that account. +* [ValidateAddress](../api/remote-procedure-calls-util.md#validateaddress): returns information about the given Dash address. + +## GetAddressesByLabel + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getaddressesbylabel` RPC](../api/remote-procedure-calls-wallet.md#getaddressesbylabel) returns a list of every address assigned to a particular label. + +_Parameter #1---the label name_ + +| Name | Type | Presence | Description | +| ----- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| Label | string | Required
(exactly 1) | The name of the label associated with the addresses to get. To get addresses from the default account, pass an empty string (`""`). | + +_Result---a list of addresses_ + +| Name | Type | Presence | Description | +| ----------- | ------ | ----------------------- | ----------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | A JSON object containing all addresses belonging to the specified label as keys. | +| →Address | object | Optional
(1 or more) | A JSON object with information about a P2PKH or P2SH address belonging to the label | +| →→`purpose` | string | Optional
(1 or more) | Purpose of address (`send` for sending address, `receive` for receiving address) | + +_Example from Dash Core 0.17.0_ + +Get the addresses assigned to the label "doc test": + +```bash +dash-cli -testnet getaddressesbylabel "doc test" +``` + +Result: + +```json +{ + "yacJKd6tRz2JSn8Wfp9GKgCbuowAEBivrA": { + "purpose": "receive" + } +} +``` + +_See also_ + +* [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. + +## GetBalance + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getbalance` RPC](../api/remote-procedure-calls-wallet.md#getbalance) gets the total _available balance_ in Dash. The _available balance_ is what the wallet considers currently spendable, and is thus affected by options which limit spendability such as `-spendzeroconfchange`. + +_Parameter #1---unused parameter_ + +| Name | Type | Presence | Description | +| ------ | ------ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Unused | string | Optional
(0 or 1) | **Deprecated: (previously account) will be removed in a later version of Dash Core**

Remains for backward compatibility. Must be excluded or set to `"*"`. | + +_Parameter #2---the minimum number of confirmations_ + +| Name | Type | Presence | Description | +| ------------- | ------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Confirmations | number (int) | Optional
(0 or 1) | The minimum number of confirmations an externally-generated transaction must have before it is counted towards the balance. Transactions generated by this node are counted immediately. Typically, externally-generated transactions are payments to this wallet and transactions generated by this node are payments to other wallets. Use `0` to count unconfirmed transactions. Default is `1` | + +_Parameter #3---whether to add the balance from transactions locked via InstantSend_ + +| Name | Type | Presence | Description | +| --------- | ---- | ----------------------- | ---------------------------------------------------- | +| addlocked | bool | Optional
(exactly 1) | Add the balance from InstantSend locked transactions | + +_Parameter #4---whether to include watch-only addresses_ + +| Name | Type | Presence | Description | +| ------------------ | ---- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Include Watch-Only | bool | Optional
(0 or 1) | If set to `true`, include watch-only addresses in details and calculations as if they were regular addresses belonging to the wallet. If set to `false` (the default for non-watching only wallets), treat watch-only addresses as if they didn't belong to this wallet.
As of Dash Core 18.1, `true` is used as the default for watching-only wallets. | + +_Parameter #5---avoids partial respends_ + +| Name | Type | Presence | Description | +| ----------- | ---- | -------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| avoid_reuse | bool | Optional
(0 or 1) | Do not include balance in dirty outputs; addresses are considered dirty if they have previously been used in a transaction. | + +_Result---the balance in Dash_ + +| Name | Type | Presence | Description | +| -------- | ------------- | ----------------------- | ---------------------------------------------------- | +| `result` | number (dash) | Required
(exactly 1) | The balance of the account (or all accounts) in dash | + +_Examples from Dash Core 0.17.0_ + +Get the balance, including transactions with at least three confirmations and those spent to watch-only addresses. Do not include InstantSend locked transactions. + +```bash +dash-cli -testnet getbalance "*" 3 false true +``` + +Result: + +```json +0.00000000 +``` + +Get the balance, including transactions with at least three confirmations and those spent to watch-only addresses. Include the balance from InstantSend locked transactions. + +```bash +dash-cli -testnet getbalance "" 3 true true +``` + +Result: + +```json +1.00000000 +``` + +_See also_ + +* [GetBalances](../api/remote-procedure-calls-wallet.md#getbalances): returns an object with all balances denominated in DASH. +* [GetReceivedByAddress](../api/remote-procedure-calls-wallet.md#getreceivedbyaddress): returns the total amount received by the specified address in transactions with the specified number of confirmations. It does not count coinbase transactions. + +## GetBalances + +The `getbalances` RPC returns an object with all available balances denominated in DASH. + +_Result---balances in Dash_ + +| Name | Type | Presence | Description | +| --------------------- | ------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | A JSON object returns an object with all balances in DASH. | +| → `mine` | object | Optional
(1 or more) | A JSON object that has balances from outputs that the wallet can sign. | +| →→`trusted` | numeric | Optional
(1 or more) | Trusted balance (outputs created by the wallet or confirmed outputs) | +| →→`untrusted_pending` | numeric | Optional
(1 or more) | Untrusted pending balance (outputs created by others that are in the mempool) | +| →→`immature` | numeric | Optional
(1 or more) | Balance from immature coinbase outputs | +| →→`used` | numeric | Only present if avoid_reuse is set | Balance from coins sent to addresses that were previously spent from (potentially privacy violating) | +| →→`coinjoin` | numeric | Optional
(1 or more) | CoinJoin balance (outputs with enough rounds created by the wallet via mixing). | +| →`watchonly` | object | not present if wallet does not watch anything | Watchonly balances. | +| →→`trusted` | numeric | Optional
(1 or more) | Trusted balance (outputs created by the wallet or confirmed outputs). | +| →→`untrusted_pending` | numeric | Optional
(1 or more) | Untrusted pending balance (outputs created by others that are in the mempool). | +| →→`immature` | numeric | Optional
(1 or more) | Balance from immature coinbase outputs. | + +_Example from Dash Core 18.2.0_ + +```bash +dash-cli getbalances +``` + +Result: + +``` +"mine": { + "trusted": 0.00000000, + "untrusted_pending": 0.00000000, + "immature": 0.00000000, + "used": 0.00000000, + "coinjoin": 0.00000000 + } + +``` + +_See also_ + +* [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. +* [GetReceivedByAddress](../api/remote-procedure-calls-wallet.md#getreceivedbyaddress): returns the total amount received by the specified address in transactions with the specified number of confirmations. It does not count coinbase transactions. + +## GetNewAddress + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getnewaddress` RPC](../api/remote-procedure-calls-wallet.md#getnewaddress) returns a new Dash address for receiving payments. If `label` is specified, the address is added to the address book so payments received with the address will be associated with `label`. + +_Parameter #1---an account name_ + +| Name | Type | Presence | Description | +| ------- | ------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `label` | string | Optional
(0 or 1) | The label name for the address to be linked to. If not provided, the default label `""` is used. It can also be set to the empty string `""` to represent the default label. The label does not need to exist, it will be created if there is no label by the given name. | + +_Result---a dash address never previously returned_ + +| Name | Type | Presence | Description | +| -------- | --------------- | ----------------------- | --------------------- | +| `result` | string (base58) | Required
(exactly 1) | The new Dash address. | + +_Example from Dash Core 0.17.0_ + +Create a new address in the "doc test" account: + +```bash +dash-cli -testnet getnewaddress "doc test" +``` + +Result: + +```text +yPuNTqCGzXtU3eEV5jHvhhJkzEPyJLmVkb +``` + +_See also_ + +* [GetRawChangeAddress](../api/remote-procedure-calls-wallet.md#getrawchangeaddress): returns a new Dash address for receiving change. This is for use with raw transactions, not normal use. +* [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. + +## GetRawChangeAddress + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getrawchangeaddress` RPC](../api/remote-procedure-calls-wallet.md#getrawchangeaddress) returns a new Dash address for receiving change. This is for use with raw transactions, not normal use. + +_Parameters: none_ + +_Result---a P2PKH address which can be used in raw transactions_ + +| Name | Type | Presence | Description | +| -------- | --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | string (base58) | Required
(exactly 1) | A P2PKH address which has not previously been returned by this RPC. The address will be removed from the keypool but not marked as a receiving address, so RPCs such as the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet) will show it as a change address. The address may already have been part of the keypool, so other RPCs such as the [`dumpwallet` RPC](../api/remote-procedure-calls-wallet.md#dumpwallet) may have disclosed it previously. If the wallet is unlocked, its keypool will also be filled to its max (by default, 100 unused keys). If the wallet is locked and its keypool is empty, this RPC will fail | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet getrawchangeaddress +``` + +Result: + +```text +yXBr9BiJmugTzHPgByDmvjJMAkvhTmXVJ8 +``` + +_See also_ + +* [GetNewAddress](../api/remote-procedure-calls-wallet.md#getnewaddress): returns a new Dash address for receiving payments. If an account is specified, payments received with the address will be credited to that account. + +## GetReceivedByAddress + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +![Warning icon](https://raw.githubusercontent.com/dashpay/docs-core/main/img/icons/icon_warning.svg) Note: This RPC only returns a balance for addresses contained in the local wallet. + +The [`getreceivedbyaddress` RPC](../api/remote-procedure-calls-wallet.md#getreceivedbyaddress) returns the total amount received by the specified address in transactions with the specified number of confirmations. It does not count coinbase transactions. + +_Parameter #1---the address_ + +| Name | Type | Presence | Description | +| ------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------ | +| Address | string | Required
(exactly 1) | **Only works for addresses contained in the local wallet**

The address whose transactions should be tallied | + +_Parameter #2---the minimum number of confirmations_ + +| Name | Type | Presence | Description | +| ------------- | ------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Confirmations | number (int) | Optional
(0 or 1) | The minimum number of confirmations an externally-generated transaction must have before it is counted towards the balance. Transactions generated by this node are counted immediately. Typically, externally-generated transactions are payments to this wallet and transactions generated by this node are payments to other wallets. Use `0` to count unconfirmed transactions. Default is `1` | + +_Parameter #3---whether to include transactions locked via InstantSend_ + +| Name | Type | Presence | Description | +| --------- | ---- | ----------------------- | ---------------------------------------------------- | +| addlocked | bool | Optional
(exactly 1) | Add the balance from InstantSend locked transactions | + +_Result---the amount of dash received_ + +| Name | Type | Presence | Description | +| -------- | ------------- | ----------------------- | ---------------------------------------------------------------------------------------- | +| `result` | number (dash) | Required
(exactly 1) | The amount of dash received by the address, excluding coinbase transactions. May be `0` | + +_Example from Dash Core 0.13.0_ + +Get the dash received for a particular address, only counting +transactions with six or more confirmations (ignore InstantSend locked transactions): + +```bash +dash-cli -testnet getreceivedbyaddress yYoCWcjbykWsQJ7MVJrTMeQd8TZe5N4Q7g 6 +``` + +Result: + +```json +0.00000000 +``` + +Get the dash received for a particular address, only counting +transactions with six or more confirmations (include InstantSend locked transactions): + +```bash +dash-cli -testnet getreceivedbyaddress yYoCWcjbykWsQJ7MVJrTMeQd8TZe5N4Q7g 6 true +``` + +Result: + +```json +0.30000000 +``` + +_See also: none_ + +## GetReceivedByLabel + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`getreceivedbylabel` RPC](../api/remote-procedure-calls-wallet.md#getreceivedbylabel) returns the total amount received by addresses with
)`: Outputs whose scriptPubKey corresponds to the specified address (does not include P2PK)
- `raw()`: Outputs whose scriptPubKey equals the specified hex scripts
- `combo()`: P2PK and P2PKH outputs for the given pubkey
- `pkh()`: P2PKH outputs for the given pubkey
- `sh(multi(,,,...))`: P2SH-multisig outputs for the given threshold and pubkeys | +| → →
desc | string | Required
(exactly 1) | An output descriptor | +| → →
range | number (int) | Optional
(0 or 1) | The child index HD that chains should be explored (default: 1000) | + +In the above, either refers to a fixed public key in hexadecimal notation, or to an xpub/xprv optionally followed by one or more path elements separated by "/", and optionally ending in "/_" (unhardened), or "/_'" or "/\*h" (hardened) to specify all unhardened or hardened child keys. In the latter case, a range needs to be specified by below if different from 1000. + +_Result---The unspent and total amount_ + +| Name | Type | Presence | Description | +| ----------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | An object containing the the unspent and total amounts. | +| →
`success` | bool | Required
(exactly 1) | Whether the scan was completed | +| →
`txouts` | number (int) | Required
(exactly 1) | The number of unspent transaction outputs scanned | +| →
`height` | number (int) | Required
(exactly 1) | The current block height (index) | +| →
`bestblock` | string (hex) | Required
(exactly 1) | The hash of the block at the tip of the chain | +| →
`unspents` | array | Required
(exactly 1) | An array containing unspent output objects | +| → →
Unspent output | array | Required
(1 or more) | An object containing unspent output information | +| → → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the transaction the output appeared in. The TXID must be encoded in hex in RPC byte order | +| → → →
`vout` | number (int) | Required
(exactly 1) | The index number of the output (vout) as it appeared in its transaction, with the first output being 0 | +| → → →
`scriptPubKey` | string (hex) | Required
(exactly 1) | The output's pubkey script encoded as hex | +| → → →
`desc` | string | Required
(exactly 1) | A specialized descriptor for the matched scriptPubKey | +| → → →
`amount` | number (int) | Required
(exactly 1) | The total amount in DASH of the unspent output | +| → → →
`height` | number (int) | Required
(exactly 1) | The height of the unspent transaction output | +| →
`total_amount` | numeric | Required
(exactly 1) | The total amount of all found unspent outputs in DASH | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet scantxoutset start '["addr(yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ)"]' +``` + +Result: + +```json +{ + "success": true, + "txouts": 639756, + "height": 667140, + "bestblock": "000000ec777dd903c5a378ab209a7815b24a5365b5c53a0c22e64ef3350d33db", + "unspents": [ + { + "txid": "571028a9a2f69c5eec75dbae10c8724b8afd44530fac97936ae6676a9c61e03c", + "vout": 0, + "scriptPubKey": "76a914724c86a5dc23ecac05474d9be3ac76a6aa4bcb4488ac", + "desc": "addr(yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ)#sycxjztu", + "amount": 1.00000000, + "height": 494777 + }, + { + "txid": "3e76165230a3ff5bb8df0a9e278caa81f9a653c2b7a075f8dc16e56103c8f68e", + "vout": 0, + "scriptPubKey": "76a914724c86a5dc23ecac05474d9be3ac76a6aa4bcb4488ac", + "desc": "addr(yWjoZBvnUKWhpKMbBkVVnnMD8Bzno9j6tQ)#sycxjztu", + "amount": 7.76020488, + "height": 494777 + } + ], + "total_amount": 8.76020488 +} +``` + +_See also_ + +* [ListUnspent](../api/remote-procedure-calls-wallet.md#listunspent): returns an array of unspent transaction outputs belonging to this wallet. + +## Send + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). + +EXPERIMENTAL warning: This call may be changed in future releases. +::: + +The [`send` RPC](../api/remote-procedure-calls-wallet.md#send) sends a transaction with specified outputs. This command creates and optionally broadcasts a transaction where none of the keys are duplicated in the output JSON array. + +_Parameter #1---Outputs_ + +| Name | Type | Presence | Description | +| ------- | ------------ | ----------------------- | -------------------------------------------- | +| outputs | json array | Required
(exactly 1) | A JSON array with outputs as key-value pairs. Each address can only appear once, and only one 'data' object is allowed. | +| → Output | object | Required
(1 or more) | Each object in the array represents an output of the transaction. | +| → →
`address` | string: number (DASH) | Optional
(0 or 1) | A key-value pair where the key is the Dash address and the value is the amount in DASH. The value can be specified as a numeric value or a string representing the amount. | +| → →
`data` | string: string (hex) | Optional
(0 or 1) | A key-value pair where the key must be `"data"`, and the value is hex-encoded data. | + +_Parameter #2---conf_target_ + +| Name | Type | Presence | Description | +| ------------ | ------------- | -------------------- | ----------------------------------------- | +| conf_target | numeric (int) | Optional
(0 or 1) | Confirmation target (in blocks) for the transaction, or fee rate (for DASH/kB or duff/B estimate modes). Uses wallet's default configuration. | + +_Parameter #3---estimate_mode_ + +| Name | Type | Presence | Description | +| -------------- | ------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| estimate_mode | string | Optional
(0 or 1) | The fee estimate mode. Must be one of: `unset`, `economical`, `conservative`, `DASH/kB`, `duff/B`. Default is `unset`. | + +_Parameter #4---Options_ + +| Name | Type | Presence | Description | +| --------------------------- | ------------------ | ----------------------- | --------------------------------------------------- | +| options | json object | Optional
(0 or 1) | Additional configuration settings for the transaction. | +| →
`add_inputs` | bool | Optional
(0 or 1) | If set to `true`, automatically includes more inputs if the initially specified inputs are not sufficient. Defaults to `false`.| +| →
`add_to_wallet` | bool | Optional
(0 or 1) | If `false`, returns the transaction as a serialized hex string and does not add it to the wallet or broadcast it. Defaults to `true`. | +| →
`change_address` | string (hex) | Optional
(0 or 1) | The Dash address to receive the change. | +| →
`change_position` | numeric (int) | Optional
(0 or 1) | The index of the change output. | +| →
`conf_target` | numeric (int) | Optional
(0 or 1) | Confirmation target (in blocks) for the transaction, or fee rate for DASH/kB or duff/B estimate modes. Defaults to wallet's default configuration. | +| →
`estimate_mode` | string | Optional
(0 or 1) | The fee estimate mode. Must be one of: `unset`, `economical`, `conservative`, `DASH/kB`, `duff/B`. Default is `unset`. | +| →
`include_watching` | bool | Optional
(0 or 1) | Also select inputs which are watch only. Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported, e.g. with `importpubkey` or `importmulti` with the 'pubkeys' or 'desc' field. | +| → `inputs` | array | Optional
(0 or 1) | Specify inputs instead of adding them automatically. Array of JSON objects | +| → → Input | object | Required
(1 or more) | Each object in the array represents an input of the transaction. | +| → → →
`txid` | string (hex) | Required
(exactly 1) | The transaction ID of the outpoint to be spent. | +| → → →
`vout` | numeric (int) | Required
(exactly 1) | The output number (vout) of the outpoint to be spent. | +| → → →
`sequence` | numeric (int) | Optional
(0 or 1) | The sequence number to use for the input. | +| →
`locktime` | numeric | Optional
(0 or 1) | Sets the transaction's locktime. If non-zero, it also activates the inputs. Default is `0`. | +| →
`lock_unspents` | bool | Optional
(0 or 1) | If `true`, locks the selected unspent outputs. Defaults to `false`. | +| →
`psbt` | bool | Optional
(0 or 1) | If `true`, always returns the transaction as a PSBT. Implies `add_to_wallet` is `false`. Default is automatic.| +| → `subtract_fee_from_outputs` | array | Optional
(0 or 1) | A JSON array of integers. The fee will be equally deducted from the amount of each specified output. Those recipients will receive less funds than you enter in their corresponding amount field. If no outputs are specified here, the sender pays the fee. | +| → → Output index | numeric (int) | Required
(1 or more) | The zero-based output index, before a change output is added. | + +_Result---transaction details_ + +| Name | Type | Presence | Description | +| ----------- | ------------------ | ----------------------- | ---------------------------------- | +| Result | object | Required
(exactly 1) | JSON object containing transaction details | +| → `complete` | bool | Required
(exactly 1) | If the transaction has a complete set of signatures. | +| → `txid` | string (hex) | Required
(exactly 1) | The transaction id for the send. Only 1 transaction is created regardless of the number of addresses. | +| → `hex` | string (hex) | Optional
(0 or 1) | If `add_to_wallet` is false, the hex-encoded raw transaction with signatures. | +| → `psbt` | string | Optional
(0 or 1) | If more signatures are needed, or if `add_to_wallet` is false, the base64-encoded (partially) signed transaction. | + +_Examples from Dash Core 21.0.0_ + +```bash +# Send with a fee rate of 1 duff/B +dash-cli send '{"XunLY9Tf7Zsef8gMGL2fhWA9ZmMjt4KPw0": 0.1}' 1 "duff/B" +``` + +```bash +# Create a transaction that should confirm in the next block, specify a particular input, and return result without adding to wallet or broadcasting +dash-cli send '{"XunLY9Tf7Zsef8gMGL2fhWA9ZmMjt4KPw0": 0.1}' 1 "economical" '{"add_to_wallet": false, "inputs": [{"txid":"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0", "vout":1}]}' +``` + +_See also_ + +* [SendMany](../api/remote-procedure-calls-wallet.md#sendmany): creates and broadcasts a transaction which sends outputs to multiple addresses. +* [SendToAddress](../api/remote-procedure-calls-wallet.md#sendtoaddress): spends an amount to a given address. + +## SendMany + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked or unencrypted wallet. +::: + +The [`sendmany` RPC](../api/remote-procedure-calls-wallet.md#sendmany) creates and broadcasts a transaction which sends outputs to multiple addresses. + +_Parameter #1---unused parameter_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Unused | string | Required
(exactly 1) | **Deprecated: (previously account) will be removed in a later version of Dash Core**

Must be set to `""` for backwards compatibility. | + +_Parameter #2---the addresses and amounts to pay_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Outputs | object | Required
(exactly 1) | An object containing key/value pairs corresponding to the addresses and amounts to pay | +| →
Address/Amount | string (base58) : number (dash) | Required
(1 or more) | A key/value pair with a base58check-encoded string containing the P2PKH or P2SH address to pay as the key, and an amount of dash to pay as the value | + +_Parameter #3---minimum confirmations_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Confirmations | number (int) | Optional
(0 or 1) | _Deprecated and ignored since Dash Core 18.0.0_ | + +_Parameter #4--whether to add the balance from transactions locked via InstantSend_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| addlocked | bool | Optional
(0 or 1) | _Deprecated and ignored since Dash Core 18.0.0_ | + +_Parameter #5---a comment_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Comment | string | Optional
(0 or 1) | A locally-stored (not broadcast) comment assigned to this transaction. Default is no comment | + +_Parameter #6---automatic fee subtraction_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Subtract Fee From Amount | array | Optional
(0 or 1) | An array of addresses. The fee will be equally divided by as many addresses as are entries in this array and subtracted from each address. If this array is empty or not provided, the fee will be paid by the sender | +| →
Address | string (base58) | Optional (0 or more) | An address previously listed as one of the recipients. | + +_Parameter #7---use InstantSend_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Use InstantSend | bool | Optional
(0 or 1) | _Deprecated and ignored since Dash Core 0.15.0_ | + +_Parameter #8---use CoinJoin_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| Use CoinJoin | bool | Optional
(0 or 1) | If set to `true`, use CoinJoin funds only (default: false). | + +_Parameter #9---confirmation target_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `conf_target` | number (int) | Optional
(0 or 1) | Confirmation target (in blocks) | + +_Parameter #10---fee estimate mode_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `estimate_mode` | string | Optional
(0 or 1) | The fee estimate mode, must be one of:
`unset`
`economical`
`conservative`
`DASH/kB`
`duff/B` | + +_Parameter #11---verbose_ + +| Name | Type | Presence | Description | +| ------- | ------- | ----------------------- | ---------------------------------------------------------- | +| verbose | boolean | Optional
(0 or 1) | If `true`, return extra information about the transaction. Default is `false` | + +_Result---execution result_ + +If `verbose` is not set or set to `false`: + +| Name | Type | Presence | Description | +| ---- | ------ | ----------------------- | ------------------------------------------------- | +| hex | string | Required
(exactly 1) | The transaction id for the send. Only one transaction is created regardless of the number of addresses | + +If `verbose` is set to `true`: + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ------------------------------------------------- | +| result | json object | Required
(exactly 1) | A JSON object containing transaction details | +| → txid | string | Required
(exactly 1) | The transaction id for the send. Only one transaction is created regardless of the number of addresses | +| → fee reason | string | Required
(exactly 1) | The transaction fee reason | + +_Example from Dash Core 0.17.0_ + +Send 0.1 DASH to the first address and 0.2 DASH to the second address, with a comment of "Example Transaction". + +```bash +dash-cli -testnet sendmany \ + "" \ + ''' + { + "ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv": 0.1, + "yhQrX8CZTTfSjKmaq5h7DgSShyEsumCRBi": 0.2 + } ''' \ + 6 \ + false \ + "Example Transaction" +``` + +Result: + +```text +a7c0194a005a220b9bfeb5fdd12d5b90979c10f53de4f8a48a1495aa198a6b95 +``` + +_Example from Dash Core 0.12.2 (CoinJoin)_ + +Send 0.1 DASH to the first address and 0.2 DASH to the second address using CoinJoin, with a comment of "Example Transaction". + +```bash +dash-cli -testnet sendmany \ + "" \ + ''' + { + "ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv": 0.1, + "yhQrX8CZTTfSjKmaq5h7DgSShyEsumCRBi": 0.2 + } ''' \ + 6 \ + false \ + "Example Transaction" + ''' + [""] + ''' \ + false \ + true +``` + +Result: + +```text +43337c8e4f3b21bedad7765fa851a6e855e4bb04f60d6b3e4c091ed21ffc5753 +``` + +_See also_ + +* [Send](../api/remote-procedure-calls-wallet.md#send): sends a transaction with specified outputs. +* [SendToAddress](../api/remote-procedure-calls-wallet.md#sendtoaddress): spends an amount to a given address. + +## SendToAddress + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked or unencrypted wallet. +::: + +The [`sendtoaddress` RPC](../api/remote-procedure-calls-wallet.md#sendtoaddress) spends an amount to a given address. + +_Parameter #1---to address_ + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------------------------- | +| To Address | string | Required
(exactly 1) | A P2PKH or P2SH address to which the dash should be sent | + +_Parameter #2---amount to spend_ + +| Name | Type | Presence | Description | +| ------ | ------------- | ----------------------- | --------------------------- | +| Amount | number (dash) | Required
(exactly 1) | The amount to spent in dash | + +_Parameter #3---a comment_ + +| Name | Type | Presence | Description | +| ------- | ------ | -------------------- | --------------------------------------------------------------------------------------------- | +| Comment | string | Optional
(0 or 1) | A locally-stored (not broadcast) comment assigned to this transaction. Default is no comment | + +_Parameter #4---a comment about who the payment was sent to_ + +| Name | Type | Presence | Description | +| ---------- | ------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Comment To | string | Optional
(0 or 1) | A locally-stored (not broadcast) comment assigned to this transaction. Meant to be used for describing who the payment was sent to. Default is no comment | + +_Parameter #5---automatic fee subtraction_ + +| Name | Type | Presence | Description | +| ------------------------ | ------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| Subtract Fee From Amount | boolean | Optional
(0 or 1) | The fee will be deducted from the amount being sent. The recipient will receive less dash than you enter in the amount field. Default is `false` | + +_Parameter #6---use InstantSend_ + +| Name | Type | Presence | Description | +| --------------- | ---- | -------------------- | ----------------------------------------------- | +| Use InstantSend | bool | Optional
(0 or 1) | _Deprecated and ignored since Dash Core 0.15.0_ | + +_Parameter #7---use CoinJoin_ + +| Name | Type | Presence | Description | +| ------------ | ---- | -------------------- | ----------------------------------------------------------- | +| Use CoinJoin | bool | Optional
(0 or 1) | If set to `true`, use CoinJoin funds only (default: false). | + +_Parameter #8---confirmation target_ + +| Name | Type | Presence | Description | +| ------------- | ------------ | -------------------- | ------------------------------- | +| `conf_target` | number (int) | Optional
(0 or 1) | Confirmation target (in blocks) | + +_Parameter #9---fee estimate mode_ + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `estimate_mode` | string | Optional
(0 or 1) | The fee estimate mode, must be one of:
`unset`
`economical`
`conservative`
`DASH/kB`
`duff/B` | + +_Parameter #10---avoids partial respends_ + +| Name | Type | Presence | Description | +| ------------- | ------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| `avoid_reuse` | boolean | Optional
(0 or 1) | Avoid spending from dirty addresses; addresses are considered dirty if they have previously been used in a transaction. | + +_Parameter #11---verbose_ + +| Name | Type | Presence | Description | +| ------- | ------- | ----------------------- | ---------------------------------------------------------- | +| verbose | boolean | Optional
(0 or 1) | If `true`, return extra information about the transaction. Default is `false` | + +_Result---execution result_ + +If `verbose` is not set or set to `false`: + +| Name | Type | Presence | Description | +| ---- | ------ | ----------------------- | ------------------------------------------------- | +| hex | string | Required
(exactly 1) | The transaction id for the send | + +If `verbose` is set to `true`: + +| Name | Type | Presence | Description | +| ------------- | ------------ | ----------------------- | ------------------------------------------------- | +| result | json object | Required
(exactly 1) | A JSON object containing transaction details | +| → txid | string | Required
(exactly 1) | The transaction id for the send | +| → fee reason | string | Required
(exactly 1) | The transaction fee reason | + +_Example from Dash Core 0.12.2_ + +Spend 0.1 dash to the address below with the comment "sendtoaddress +example" and the comment-to "Nemo From Example.com": + +```bash +dash-cli -testnet sendtoaddress ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv \ + 1.0 "sendtoaddress example" "Nemo From Example.com" +``` + +Result: + +```text +70e2029d363f0110fe8a0aa2ba7bd771a579453135568b2aa559b2cb30f875aa +``` + +_Example from Dash Core 0.12.2 (InstantSend)_ + +Spend 0.1 dash via InstantSend to the address below with the comment "sendtoaddress +example" and the comment-to "Nemo From Example.com": + +```bash +dash-cli -testnet sendtoaddress ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv \ + 1.0 "sendtoaddress example" "Nemo From Example.com" false true +``` + +Result: + +```text +af002b9c931b5efb5b2852df3d65efd48c3b9ac2ba0ef8a4cf97b894f3ff08c2 +``` + +_Example from Dash Core 0.12.2 (CoinJoin)_ + +Spend 0.1 dash via CoinJoin to the address below with the comment "sendtoaddress +example" and the comment-to "Nemo From Example.com": + +```bash +dash-cli -testnet sendtoaddress ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv \ + 1.0 "sendtoaddress example" "Nemo From Example.com" false false true +``` + +Result: + +```text +949833bc49e0643f63e2afed1704ccccf005a93067a4e46165b06ace42544694 +``` + +_Example from Dash Core 0.12.2 (InstantSend + CoinJoin)_ + +Spend 0.1 dash via InstantSend and CoinJoin to the address below with the +comment "sendtoaddressexample" and the comment-to "Nemo From Example.com": + +```bash +dash-cli -testnet sendtoaddress ySutkc49Khpz1HQN8AfWNitVBLwqtyaxvv \ + 1.008 "sendtoaddress example" "Nemo From Example.com" false true true +``` + +Result: + +```text +ba4bbe29fa06b67d6f3f3a73e381627e66abe22e217ce329aefad41ea72c3922 +``` + +_See also_ + +* [Send](../api/remote-procedure-calls-wallet.md#send): sends a transaction with specified outputs. +* [SendMany](../api/remote-procedure-calls-wallet.md#sendmany): creates and broadcasts a transaction which sends outputs to multiple addresses. + +## SetHDSeed + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +_Added in Dash Core 21.0.0_ + +The `sethdseed` RPC sets or generates a new HD wallet seed. Non-HD wallets will not be upgraded to +HD wallets. Wallets that are already HD cannot be updated to a new HD seed. + +**Note:** You will need to make a new backup of your wallet after setting the HD wallet seed. +Requires wallet passphrase to be set with walletpassphrase call if wallet is encrypted. + +_Parameter #1---newkeypool_ + +| Name | Type | Presence | Description | +| ----------- | ------- | ----------------------- | ----------- | +| newkeypool | boolean | Optional
(0 or 1) | Whether to flush old unused addresses, including change addresses, from the keypool and regenerate it. Default is `true`. If `true`, the next address from `getnewaddress` and change address from `getrawchangeaddress` will be from this new seed. If `false`, addresses from the existing keypool will be used until it has been depleted. | + +_Parameter #2---seed_ + +| Name | Type | Presence | Description | +| ---- | ------ | ----------------------- | ----------- | +| seed | string | Optional
(0 or 1) | The WIF private key to use as the new HD seed. The seed value can be retrieved using the `dumpwallet` command. It is the private key marked `hdseed=1`. Default is a random seed. | + +_Result---execution result_ + +| Name | Type | Presence | Description | +| ---- | -------- | ----------------------- | ----------- | +| null | json null| Required
(exactly 1) | No result | + +_Examples_ + +Set a new HD seed: + +```bash +dash-cli sethdseed +``` + +_See also_ + +* [UpgradeToHD](../api/remote-procedure-calls-wallet.md#upgradetohd): upgrades non-HD wallets to HD. + +## SetLabel + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`setlabel` RPC](../api/remote-procedure-calls-wallet.md#setlabel) sets the label associated with the given address. + +_Parameter #1---a Dash address_ + +| Name | Type | Presence | Description | +| ------- | --------------- | ----------------------- | ------------------------------------------------------------- | +| Address | string (base58) | Required
(exactly 1) | The P2PKH or P2SH Dash address to be associated with a label. | + +_Parameter #2---a label_ + +| Name | Type | Presence | Description | +| ----- | ------ | ----------------------- | ----------------------------------- | +| Label | string | Required
(exactly 1) | The label to assign to the address. | + +_Result---`null` if successful_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------------ | +| `result` | null | Required
(exactly 1) | Set to JSON `null` if the address was successfully placed in the account | + +_Example from Dash Core 0.17.0_ + +Assign the "doc test" label to the provided address. + +```bash +dash-cli -testnet setlabel yMTFRnrfJ4NpnYVeidDNHVwT7uuNsVjevq "doc test" +``` + +(Success: no result displayed.) + +_See also_ + +* [ListLabels](../api/remote-procedure-calls-wallet.md#listlabels): returns the list of all labels, or labels that are assigned to addresses with a specific purpose. +* [GetAddressesByLabel](../api/remote-procedure-calls-wallet.md#getaddressesbylabel): returns the list of addresses assigned the specified label. + + + +## SetCoinJoinAmount + +The [`setcoinjoinamount` RPC](../api/remote-procedure-calls-wallet.md#setcoinjoinamount) sets the amount of DASH to be processed with CoinJoin (previously named `setprivatesendamount` prior to Dash Core 0.17.0) + +_Parameter #1---amount to process_ + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | --------------------------------------------------------------- | +| Amount | int | Required
(exactly 1) | The number of DASH to process (minimum: 2, maximum: 21,000,000) | + +_Result---`null` on success_ + +_Example from Dash Core 0.13.0_ + +```bash +dash-cli -testnet setcoinjoinamount 2000 +``` + +(Success: no result displayed.) + +_See also:_ + +* [SetCoinJoinRounds](../api/remote-procedure-calls-wallet.md#setcoinjoinrounds): sets the number of rounds to use + + + +## SetCoinJoinRounds + +The [`setcoinjoinrounds` RPC](../api/remote-procedure-calls-wallet.md#setcoinjoinrounds) sets the number of rounds to use (previously named `setprivatesendrounds` prior to Dash Core 0.17.0) + +_Parameter #1---number of rounds to use_ + +| Name | Type | Presence | Description | +| ------ | ---- | ----------------------- | ----------------------------------------------------- | +| Rounds | int | Required
(exactly 1) | The number of rounds to use (minimum: 1, maximum: 16) | + +_Result---`null` on success_ + +_Example from Dash Core 0.13.0_ + +```bash +dash-cli -testnet setcoinjoinrounds 4 +``` + +(Success: no result displayed.) + +_See also:_ + +* [SetCoinJoinAmount](../api/remote-procedure-calls-wallet.md#setcoinjoinamount): sets the amount of DASH to be processed with CoinJoin + +## SetTxFee + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`settxfee` RPC](../api/remote-procedure-calls-wallet.md#settxfee) sets the transaction fee per kilobyte paid by transactions created by this wallet. + +_Parameter #1---the transaction fee amount per kilobyte_ + +| Name | Type | Presence | Description | +| ---------------------------- | ------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Transaction Fee Per Kilobyte | number (dash) | Required
(exactly 1) | The transaction fee to pay, in dash, for each kilobyte of transaction data. Be careful setting the fee too low---your transactions may not be relayed or included in blocks | + +_Result: `true` on success_ + +| Name | Type | Presence | Description | +| -------- | ----------- | ----------------------- | --------------------------------------------- | +| `result` | bool (true) | Required
(exactly 1) | Set to `true` if the fee was successfully set | + +_Example from Dash Core 0.12.2_ + +Set the transaction fee per kilobyte to 10,000 duffs. + +```bash +dash-cli -testnet settxfee 0.00010000 +``` + +Result: + +```json +true +``` + +_See also_ + +* [GetWalletInfo](../api/remote-procedure-calls-wallet.md#getwalletinfo): provides information about the wallet. +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. + +## SetWalletFlag + +The SetWalletFlag RPC changes the state of the given wallet flag for a wallet. + +\*Parameter #1---states the name of the flag to change + +| Name | Type | Presence | Description | +| ---- | ------ | ----------------------- | -------------------------------------------------------------------- | +| flag | string | Required
(exactly 1) | The name of the flag to change. Current available flags: avoid_reuse | + +\*Parameter #2---defining the new state + +| Name | Type | Presence | Description | +| ----- | ------- | -------------------------- | -------------- | +| value | boolean | Optional
(default TRUE) | The new state. | + +_Result_ + +| Name | Type | Presence | Description | +| ----------------- | --------------------- | ----------------------- | ----------------------------------------------------------------------------- | +| `result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred | +| →
`flag_name` | str (string) | Required
(exactly 1) | the name of the flag that was modified | +| →
`flag_state` | true\|false (boolean) | Required
(0 or 1) | the new state of the flag | +| →
`warnings` | str (string) | Required
(exactly 1) | any warnings associated with the change | + +_Example from Dash Core 18.1.0_ + +```bash +dash-cli setwalletflag avoid_reuse +``` + +Result: + +```json +{ + "flag_name": "avoid_reuse", + "flag_state": true, + "warnings": "You need to rescan the blockchain in order to correctly mark used destinations in the past. Until this is done, some destinations may be considered unused, even if the opposite is the case." +} +``` + +_See also: none_ + +## SignMessage + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked or unencrypted wallet. +::: + +The [`signmessage` RPC](../api/remote-procedure-calls-wallet.md#signmessage) signs a message with the private key of an address. + +_Parameter #1---the address corresponding to the private key to sign with_ + +| Name | Type | Presence | Description | +| ------- | --------------- | ----------------------- | -------------------------------------------------------- | +| Address | string (base58) | Required
(exactly 1) | A P2PKH address whose private key belongs to this wallet | + +_Parameter #2---the message to sign_ + +| Name | Type | Presence | Description | +| ------- | ------ | ----------------------- | ------------------- | +| Message | string | Required
(exactly 1) | The message to sign | + +_Result---the message signature_ + +| Name | Type | Presence | Description | +| -------- | --------------- | ----------------------- | ------------------------------------------------ | +| `result` | string (base64) | Required
(exactly 1) | The signature of the message, encoded in base64. | + +_Example from Dash Core 0.12.2_ + +Sign a the message "Hello, World!" using the following address: + +```bash +dash-cli -testnet signmessage yNpezfFDfoikDuT1f4iK75AiLp2YLPsGAb "Hello, World!" +``` + +Result: + +```text +H4XULzfHCf16In2ECk9Ta9QxQPq639zQto2JA3OLlo3JbUdrClvJ89+A1z+Z9POd6l8LJhn1jGpQYF8mX4jkQvE= +``` + +_See also_ + +* [VerifyMessage](../api/remote-procedure-calls-util.md#verifymessage): verifies a signed message. + +## SignRawTransactionWithWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked wallet. +::: + +The [`signrawtransactionwithwallet` RPC](#signrawtransactionwithwallet) signs a transaction in the serialized transaction format using private keys stored in the wallet. + +_Parameter #1---the transaction to sign_ + +| Name | Type | Presence | Description | +| ----------- | ------------ | ----------------------- | --------------------------------------------------- | +| Transaction | string (hex) | Required
(exactly 1) | The transaction to sign as a serialized transaction | + +_Parameter #2---unspent transaction output details_ + +| Name | Type | Presence | Description | +| --------------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------ | +| Dependencies | array | Optional
(0 or 1) | The previous outputs being spent by this transaction | +| →
Output | object | Optional
(0 or more) | An output being spent | +| → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the transaction the output appeared in. The TXID must be encoded in hex in RPC byte order | +| → →
`vout` | number (int) | Required
(exactly 1) | The index number of the output (vout) as it appeared in its transaction, with the first output being 0 | +| → →
`scriptPubKey` | string (hex) | Required
(exactly 1) | The output's pubkey script encoded as hex | +| → →
`redeemScript` | string (hex) | Optional
(0 or 1) | If the pubkey script was a script hash, this must be the corresponding redeem script | +| → →
`amount` | numeric | Required
(exactly 1) | The amount of Dash spent | + +_Parameter #3---signature hash type_ + +| Name | Type | Presence | Description | | | | +| :------ | :----- | :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------- | :------------------------- | :------------- | +| SigHash | string | Optional
(0 or 1) | The type of signature hash to use for all of the signatures performed. (You must use separate calls to the [`signrawtransactionwithwallet` RPC](#signrawtransactionwithwallet) if you want to use different signature hash types for different signatures. The allowed values are: `ALL`, `NONE`, `SINGLE`, `ALL \| ANYONECANPAY`,`NONE \| ANYONECANPAY`, and`SINGLE \| ANYONECANPAY` | + +_Result---the transaction with any signatures made_ + +| Name | Type | Presence | Description | +| --------------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | The results of the signature | +| →
`hex` | string (hex) | Required
(exactly 1) | The resulting serialized transaction encoded as hex with any signatures made inserted. If no signatures were made, this will be the same transaction provided in parameter #1 | +| →
`complete` | bool | Required
(exactly 1) | The value `true` if transaction is fully signed; the value `false` if more signatures are required | + +_Example from Dash Core 0.17.0_ + +Sign the hex generated from the `createrawtransaction` RPC: + +```bash +dash-cli -testnet signrawtransactionwithwallet 020000000121f39228a11ddf19\ +7ac3658e93bd264d0afd927f0cdfc7caeb760537e529c94a0100000000ffffffff0180969\ +800000000001976a914fe64a96d6660e30c433e1189082466a95bdf9ceb88ac00000000 +``` + +Result: + +```json +{ + "hex": "020000000121f39228a11ddf197ac3658e93bd264d0afd927f0cdfc7caeb760537e529c94a010000006b483045022100811c5679ef097b0e5a338fc3cd05ee50e1802680ea8a172d0fd3a81da3c1fc2002204804b18a44e888ac1ee9b6a7cbadc211ecdc30f8c889938c95125206e39554220121025d81ce6581e547dd34194385352053abb17f0246768d75443b25ded5e37d594fffffffff0180969800000000001976a914fe64a96d6660e30c433e1189082466a95bdf9ceb88ac00000000", + "complete": true +} +``` + +_See also_ + +* [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. +* [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. +* [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. +* [SignRawTransactionWithKey](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey): signs inputs for a transaction in the serialized transaction format using private keys provided in the call. + +## UnloadWallet + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`unloadwallet` RPC](../api/remote-procedure-calls-wallet.md#unloadwallet) unloads the wallet referenced by the request endpoint otherwise unloads the wallet specified in the argument. Specifying the wallet name on a wallet endpoint is invalid. + +_Parameter #1---wallet name_ + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------------------- | +| Filename | string | Required
(exactly 1) | The name of the wallet to unload. If provided both here and in the RPC endpoint, the two must be identical. | + +_Parameter #2---load of startup_ + +| Name | Type | Presence | Description | +| --------------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| load_on_startup | boolean | Optional
(0 or 1) | Save wallet name to persistent settings and load on startup. True to add wallet to startup list, false to remove, null to leave unchanged. | + +_Result---null on success_ + +_Example from Dash Core 0.17.0_ + +```bash +dash-cli -testnet unloadwallet wallet-test.dat +``` + +Result: + +```shell +null +``` + +_See also_ + +* [LoadWallet](../api/remote-procedure-calls-wallet.md#loadwallet): loads a wallet from a wallet file or directory. + +## UpgradeToHD + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**). +::: + +The [`upgradetohd` RPC](../api/remote-procedure-calls-wallet.md#upgradetohd) upgrades non-HD wallets to HD. + +_Parameters_ + +| Name | Type | Presence | Description | +| -------------------- | ------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `mnemonic` | string | Optional
(0 or 1) | Mnemonic as defined in BIP39 to use for the new HD wallet. Use an empty string `""` to generate a new random mnemonic. | +| `mnemonicpassphrase` | string | Optional
(0 or 1) | Optional mnemonic passphrase as defined in [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#From_mnemonic_to_seed) | +| `walletpassphrase` | string | Optional
(0 or 1) | If your wallet is encrypted you must have your wallet passphrase here. If your wallet is not encrypted, specifying wallet passphrase will trigger wallet encryption. | +| `rescan` | boolean | Optional
(0 or 1) | Whether to rescan the blockchain for missing transactions or not (default=`false` if mnemonic is empty) | + +_Result---`true` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | -------------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | `true` when the command was successful or error message if not successful. | + +_Example from Dash Core 0.17.0_ + +Upgrade wallet to HD without specifying any optional parameters: + +```bash +dash-cli -testnet upgradetohd +``` + +```bash +true +``` + +_See also_ + +* [DumpHDInfo](../api/remote-procedure-calls-wallet.md#dumphdinfo): returns an object containing sensitive private info about this HD wallet + +## UpgradeWallet + +The [`upgradewallet` RPC](#upgradewallet) upgrades the wallet to the latest version if no version number is specified. New keys may be generated and a new wallet backup will need to be made. + +_Parameters_ + +| Name | Type | Presence | Description | +| --------- | ------ | -------------------- | ----------------------------------------------------------------------- | +| `version` | number | Optional
(0 or 1) | The version number to upgrade to. Default is the latest wallet version. | + +_Result---JSON object on success or failure_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | -------------------------------------------------------------------------- | +| `result` | object | Required
(exactly 1) | A JSON object which may contain an `error` field if the upgrade fails. | +| →
`error` | string | Optional
(0 or 1) | The error message describing why the upgrade failed, if applicable. | + +_Example from Dash Core 21.0.0_ + +Upgrade wallet without specifying any optional parameters: + +```bash +dash-cli -testnet upgradewallet +``` + +Result (success indicated by empty object): + +```json +{ +} +``` + +_See also_ + +* [DumpHDInfo](../api/remote-procedure-calls-wallet.md#dumphdinfo): returns an object containing sensitive private info about this HD wallet + +## WalletCreateFundedPSBT + +The [`walletcreatefundedpsbt` RPC](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt) creates and funds a transaction in the Partially Signed Transaction (PST) format. Inputs will be added if supplied inputs are not enough. + +Implements the Creator and Updater roles. + +_Parameter #1---Inputs_ + +| Name | Type | Presence | Description | +| ----------------- | ------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| Inputs | array | Required
(exactly 1) | An array of objects, each one to be used as an input to the transaction. Leave empty to add inputs automatically. See `add_inputs` option. | +| → Input | object | Required
(1 or more) | An object describing a particular input | +| → →
`txid` | string (hex) | Required
(exactly 1) | The TXID of the outpoint to be spent encoded as hex in RPC byte order | +| → →
`vout` | number (int) | Required
(exactly 1) | The output index number (vout) of the outpoint to be spent; the first output in a transaction is index `0` | +| → →
`Sequence` | number (int) | Optional
(0 or 1) | The sequence number to use for the input | + +_Parameter #2---Outputs_ + +| Name | Type | Presence | Description | +| -------------- | --------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------- | +| Outputs | array | Required
(exactly 1) | A JSON array with outputs as key-value pairs | +| → Output | object | Required
(1 or more) | An object describing a particular output | +| → →
Address | string: number (Dash) | Optional
(0 or 1) | A key-value pair. The key (string) is the Dash address, the value (float or string) is the amount in DASH | +| → →
Data | `data`: string (hex) | Optional
(0 or 1) | A key-value pair. The key must be `data`, the value is hex encoded data | + +_Parameter #3---locktime_ + +| Name | Type | Presence | Description | +| -------- | ------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| Locktime | numeric (int) | Optional
(0 or 1) | Indicates the earliest time a transaction can be added to the block chain (default=`0`). Non-0 value also locktime-activates inputs. | + +_Parameter #4---Additional options_ + +| Name | Type | Presence | Description | +| ------------------------------ | ----------------- | ----------------------- | ----------- | +| Options | Object | Optional
(0 or 1) | Additional options | +| →
`add_inputs` | bool | Optional
(0 or 1) | If inputs are specified, automatically include more if they are not enough. Defaults to `false`. | +| →
`changeAddress` | string | Optional
(0 or 1) | The dash address to receive the change (default=pool address) | +| →
`changePosition` | numeric (int) | Optional
(0 or 1) | The index of the change output (default=random) | +| →
`includeWatching` | bool | Optional
(0 or 1) | Also select inputs which are watch only (default=`false` for non-watching only wallets and `true` for watching only-wallets) | +| →
`lockUnspents` | bool | Optional
(0 or 1) | Lock selected unspent outputs (default=`false`). This applies to manually selected coins also since Dash Core 20.1.0. | +| →
`feeRate` | numeric or string | Optional
(0 or 1) | Set a specific fee rate in DASH/kB | +| →
`subtractFeeFromOutputs` | array | Optional
(0 or 1) | A json array of integers. The fee will be equally deducted from the amount of each specified output. The outputs are specified by their zero-based index, before any change output is added. Those recipients will receive less Dash than you enter in their corresponding amount field. If no outputs are specified here, the sender pays the fee. | +| → →
Output index | numeric (int) | Optional
(0 or more) | An output index number (vout) from which the fee should be subtracted. If multiple vouts are provided, the total fee will be divided by the number of vouts listed and each vout will have that amount subtracted from it. | +| →
`conf_target` | numeric (int) | Optional
(0 or 1) | Confirmation target (in blocks) | +| →
`estimate_mode` | numeric (int) | Optional
(0 or 1) | The fee estimate mode, must be one of:
`unset`
`economical`
`conservative`
`DASH/kB`
`duff/B` | + +_Parameter #5---bip32derivs_ + +| Name | Type | Presence | Description | +| ------------- | ---- | ---------------------------- | -------------------------------------------------------------------------------- | +| `bip32derivs` | bool | Optional
(exactly 0 or 1) | Includes the BIP 32 derivation paths for public keys if known (default = `true`) | + +_Result---information about the created transaction_ + +| Name | Type | Presence | Description | +| ----------------- | ------------------ | ----------------------- | ------------------------------------------------------------------------------ | +| `result` | object | Required
(exactly 1) | An object including information about the created transaction | +| →
`psbt` | string (base64) | Required
(Exactly 1) | The resulting raw transaction (base64-encoded string) | +| →
`fee` | numeric (bitcoins) | Required
(Exactly 1) | Fee in DASH the resulting transaction pays | +| →
`changepos` | numeric (int) | Required
(Exactly 1) | The position of the added change output, or `-1` if no change output was added | + +_Example from Dash Core 18.0.0_ + +```bash +dash-cli -testnet walletcreatefundedpsbt "[{\"txid\":\"2662c87e1761ed5f4e98a0640b2608114d86f282824a51bd624985d236c71178\",\"vout\":0}]" "[{\"data\":\"00010203\"}]" +``` + +Result: + +```json +{ + "psbt": "cHNidP8BAGQCAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AgAAAAAAAAAABmoEAAECA6PmxgkAAAAAGXapFFNPqpebN9gMkzsFJWixaDCZ3S8OiKwAAAAAAAEA4QIAAAABlIu3UCzRFVGowPY3H7RvS5g6QGc71ZYEFXIrcS+NfEIBAAAAakcwRAIgT+T8SIyVXyhsUshI7HlQtA7EduG0NMat1oa0dL3eCakCIGIi0pH9naNBQIqopHIPWmlZmXcVod34GH51J3tr/K5+ASEDxn2GlEMVg4rqfsgNOQtdCbkbYkgzcNSXnaXM96ffd6n+////ArTnxgkAAAAAGXapFM78RkkEwDgUwBkG4ZfcdZp0XkfuiKwAypo7AAAAABl2qRQ++by+kvd8j63QVm7qf/jUfyK94IisVUgIAAAAAA==", + "fee": 0.00000273, + "changepos": 1 +} +``` + +## WalletLock + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an unlocked wallet. +::: + +The [`walletlock` RPC](../api/remote-procedure-calls-wallet.md#walletlock) removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. + +_Parameters: none_ + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------- | +| `result` | null | Required
(exactly 1) | Always set to JSON `null` | + +_Example from Dash Core 0.12.2_ + +```bash +dash-cli -testnet walletlock +``` + +(Success: nothing printed.) + +_See also_ + +* [EncryptWallet](../api/remote-procedure-calls-wallet.md#encryptwallet): encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. +* [WalletPassphrase](../api/remote-procedure-calls-wallet.md#walletpassphrase): stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. +* [WalletPassphraseChange](../api/remote-procedure-calls-wallet.md#walletpassphrasechange): changes the wallet passphrase from 'old passphrase' to 'new passphrase'. + +## WalletPassphrase + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an encrypted wallet. +::: + +The [`walletpassphrase` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrase) stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. + +:::{warning} +If using this RPC on the command line, remember that your shell probably saves your command lines (including the value of the passphrase parameter). +::: + +_Parameter #1---the passphrase_ + +| Name | Type | Presence | Description | +| ---------- | ------ | ----------------------- | -------------------------------------- | +| Passphrase | string | Required
(exactly 1) | The passphrase that unlocks the wallet | + +_Parameter #2---the number of seconds to leave the wallet unlocked_ + +| Name | Type | Presence | Description | +| ------- | ------------ | ----------------------- | ---------------------------------------------------------------------------------------------- | +| Seconds | number (int) | Required
(exactly 1) | The number of seconds after which the decryption key will be automatically deleted from memory | + +_Parameter #3---unlock for mixing processing only_ + +| Name | Type | Presence | Description | +| ----------- | ---- | -------------------- | ---------------------------------------------------------------------------------------------------------------- | +| Mixing Only | bool | Optional
(0 or 1) | If `true`, the wallet will be locked for sending functions but unlocked for mixing transactions (default: false) | + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------- | +| `result` | null | Required
(exactly 1) | Always set to JSON `null` | + +_Example from Dash Core 0.12.2_ + +Unlock the wallet for 10 minutes (the passphrase is "test"): + +```bash +dash-cli -testnet walletpassphrase test 600 +``` + +(Success: no result printed.) + +Unlock the wallet for CoinJoin processing transactions only for 10 minutes (the passphrase is "test"): + +```bash +dash-cli -testnet walletpassphrase test 600 true +``` + +(Success: no result printed.) + +_See also_ + +* [EncryptWallet](../api/remote-procedure-calls-wallet.md#encryptwallet): encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. +* [WalletPassphraseChange](../api/remote-procedure-calls-wallet.md#walletpassphrasechange): changes the wallet passphrase from 'old passphrase' to 'new passphrase'. +* [WalletLock](../api/remote-procedure-calls-wallet.md#walletlock): removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. + +## WalletPassphraseChange + +:::{note} +Requires [wallet](../resources/glossary.md#wallet) support (**unavailable on masternodes**) and an encrypted wallet. +::: + +The [`walletpassphrasechange` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrasechange) changes the wallet passphrase from 'old passphrase' to 'new passphrase'. + +:::{warning} +If using this RPC on the command line, remember that your shell probably saves your command lines (including the value of the passphrase parameter). +::: + +_Parameter #1---the current passphrase_ + +| Name | Type | Presence | Description | +| ------------------ | ------ | ----------------------- | ----------------------------- | +| Current Passphrase | string | Required
(exactly 1) | The current wallet passphrase | + +_Parameter #2---the new passphrase_ + +| Name | Type | Presence | Description | +| -------------- | ------ | ----------------------- | --------------------------------- | +| New Passphrase | string | Required
(exactly 1) | The new passphrase for the wallet | + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------- | +| `result` | null | Required
(exactly 1) | Always set to JSON `null` | + +_Example from Dash Core 0.12.2_ + +Change the wallet passphrase from "test" to "example": + +```bash +dash-cli -testnet walletpassphrasechange "test" "example" +``` + +(Success: no result printed.) + +_See also_ + +* [EncryptWallet](../api/remote-procedure-calls-wallet.md#encryptwallet): encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. +* [WalletLock](../api/remote-procedure-calls-wallet.md#walletlock): removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. +* [WalletPassphrase](../api/remote-procedure-calls-wallet.md#walletpassphrase): stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. + +## WalletProcessPSBT + +The [`walletprocesspsbt` RPC](../api/remote-procedure-calls-wallet.md#walletprocesspsbt) updates a PSBT with input information from a wallet and then allows the signing of inputs. + +_Parameter #1---PSBT_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------- | +| `psbt` | string | Required
(exactly 1) | The transaction base64 string | + +_Parameter #2---Sign Transaction_ + +| Name | Type | Presence | Description | +| ------ | ---- | ---------------------------- | ----------------------------------------------------- | +| `sign` | bool | Optional
(exactly 0 or 1) | Sign the transaction when updating (default = `true`) | + +_Parameter #3---Signature Hash Type_ + +| Name | Type | Presence | Description | +| ------------- | ------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `sighashtype` | string | Optional
(exactly 0 or 1) | The signature hash type to sign with if not specified by the PSBT. Must be one of the following (default = ALL):
- ALL
- NONE
- SINGLE
- ALL\|ANYONECANPAY
- NONE\|ANYONECANPAY
- SINGLE\|ANYONECANPAY | + +_Parameter #4---bip32derivs_ + +| Name | Type | Presence | Description | +| ------------- | ---- | ---------------------------- | --------------------------------------------------------------------------------- | +| `bip32derivs` | bool | Optional
(exactly 0 or 1) | Includes the BIP 32 derivation paths for public keys if known (default = `true`). | + +_Result---the processed wallet_ + +| Name | Type | Presence | Description | +| --------------- | ------ | ----------------------- | --------------------------------------------------- | +| `result` | object | Required
(exactly 1) | The results of the signature | +| →
`psbt` | string | Required
(exactly 1) | The base64-encoded partially signed transaction | +| →
`complete` | bool | Required
(exactly 1) | If the transaction has a complete set of signatures | + +_Example from Dash Core 18.0.0_ + +Change the wallet passphrase from "test" to "example": + +```bash +dash-cli walletprocesspsbt "cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAAA=" +``` + +Result: + +```json +{ + "psbt": "cHNidP8BAEICAAAAAXgRxzbShUlivVFKgoLyhk0RCCYLZKCYTl/tYRd+yGImAAAAAAD/////AQAAAAAAAAAABmoEAAECAwAAAAAAAQDhAgAAAAGUi7dQLNEVUajA9jcftG9LmDpAZzvVlgQVcitxL418QgEAAABqRzBEAiBP5PxIjJVfKGxSyEjseVC0DsR24bQ0xq3WhrR0vd4JqQIgYiLSkf2do0FAiqikcg9aaVmZdxWh3fgYfnUne2v8rn4BIQPGfYaUQxWDiup+yA05C10JuRtiSDNw1Jedpcz3p993qf7///8CtOfGCQAAAAAZdqkUzvxGSQTAOBTAGQbhl9x1mnReR+6IrADKmjsAAAAAGXapFD75vL6S93yPrdBWbup/+NR/Ir3giKxVSAgAAQdqRzBEAiAF1fgBDg2M/WAeYTYzCkEiSSrDVzcYoe8wwrw/MbdgOQIgJzoYBQ9hAm6jqk2cLFitUd1/iL1ku8w9unadjNfsCdoBIQJn2pETmk8U2X6veADqnny5/6j8Iy7Oizij0SeJHm9x6AAA", + "complete": true +} +``` + +_See also_ + +* [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. +* [CombinePSBT](../api/remote-procedure-calls-raw-transactions.md#combinepsbt): combine multiple partially-signed Dash transactions into one transaction. +* [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. +* [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. +* [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. + +## WipeWalletTxes + +The [`wipewallettxes` RPC](../api/remote-procedure-calls-wallet.md#wipewallettxes) wipes all transaction from the wallet. Note: Use the [`rescanblockchain` RPC](../api/remote-procedure-calls-wallet.md#rescanblockchain) to initiate the scanning progress and recover wallet transactions. + +_Parameter #1---Keep confirmed txes_ + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------------------------- | +| `keep_confirmed` | boolean | Optional
(0 or 1) | Do not wipe confirmed transactions (default=`false`) | + +_Result---`null` on success_ + +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ------------------------------------------------------------------- | +| `result` | null | Required
(exactly 1) | JSON `null` when the transaction and all descendants were abandoned | + +_Example from Dash Core 20.0.0_ + +Wipe all transactions from the wallet: + +```bash +dash-cli -testnet wipewallettxes +``` + +_See also_ + +* [RescanBlockchain](../api/remote-procedure-calls-wallet.md#rescanblockchain): rescans the local blockchain for wallet related transactions. diff --git a/docs/core/api/remote-procedure-calls-zmq.md b/docs/core/api/remote-procedure-calls-zmq.md new file mode 100644 index 000000000..99110b46a --- /dev/null +++ b/docs/core/api/remote-procedure-calls-zmq.md @@ -0,0 +1,53 @@ +```{eval-rst} +.. meta:: + :title: ZeroMQ (ZMQ) RPCs + :description: A list of remote procedure calls in Dash Core used to check ZeroMQ (ZMQ) settings. +``` + +# ZeroMQ (ZMQ) RPCs + +## GetZmqNotifications + +The [`getzmqnotifications` RPC](../api/remote-procedure-calls-blockchain.md#getblockchaininfo) returns information about the active ZeroMQ notifications. + +*Parameters: none* + +*Result---A JSON array of objects providing information about the enabled ZMQ notifications* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | array | Required
(exactly 1) | Array of objects containing Information about the enabled ZMQ notifications +→
Notification | object | Required
(0 or more) | Information about a ZMQ notification +→ →
`type` | string | Required
(exactly 1) | Type of notification +→ →
`address` | string | Required
(exactly 1) | Address of the publisher +→ →
`hwm` | number | Required
(exactly 1) | Outbound message high water mark + +*Example from Dash Core 18.0.0* + +``` bash +dash-cli -testnet getzmqnotifications +``` + +Result: + +``` json +[ + { + "type": "pubhashblock", + "address": "tcp://0.0.0.0:20009", + "hwm": 1000 + }, + { + "type": "pubhashchainlock", + "address": "tcp://0.0.0.0:20009", + "hwm": 1000 + }, + { + "type": "pubhashgovernanceobject", + "address": "tcp://0.0.0.0:20009", + "hwm": 1000 + } +] +``` + +*See also: none* diff --git a/docs/core/api/remote-procedure-calls.md b/docs/core/api/remote-procedure-calls.md new file mode 100644 index 000000000..07a988775 --- /dev/null +++ b/docs/core/api/remote-procedure-calls.md @@ -0,0 +1,357 @@ +```{eval-rst} +.. _api-rpc: +.. meta:: + :title: Remote Procedure Calls (RPCs) + :description: Dash Core provides an RPC interface for administrative tasks, wallet operations, and network/blockchain queries, with client libraries available in multiple languages and a built-in dash-cli program for command-line and RPC interaction. +``` + +# Remote Procedure Calls (RPCs) + +## Overview + +Dash Core provides a remote procedure call (RPC) interface for various administrative tasks, [wallet](../resources/glossary.md#wallet) operations, and queries about [network](../resources/glossary.md#network) and [block chain](../resources/glossary.md#block-chain) data. + +Open-source client libraries for the RPC interface are readily available in most modern programming languages, so you probably don't need to write your own from scratch. Dash Core also ships with its own compiled C++ RPC client, `dash-cli`, located in the `bin` directory alongside `dashd` and `dash-qt`. The `dash-cli` program can be used as a command-line interface (CLI) to Dash Core or for making RPC calls from applications written in languages lacking a suitable native client. The remainder of this section describes the Dash Core RPC protocol in detail. + +:::{note} +The following subsections reference setting configuration values. See the [Examples Page](../examples/introduction.md) for more information about setting Dash Core configuration values. +::: + +### Enabling RPC + +If you start Dash Core using `dash-qt`, the RPC interface is disabled by default. To enable it, set `server=1` in `dash.conf` or supply the `-server` argument when invoking the program. If you start Dash Core using `dashd`, the RPC interface is enabled by default. + +### Basic Security + +The interface requires the user to provide a password for authenticating RPC requests. This password can be set either using the `rpcpassword` property in `dash.conf` or by supplying the `-rpcpassword` program argument. Optionally a username can be set using the `rpcuser` configuration value. + +### RPC-Auth Security + +Alternatively, the authentication details can be provided using the `rpcauth` property. This removes the need to include a plaintext password in the dash.conf file by instead including a salt and hash of the password along with a username in the format: +`:$` + +``` shell +# Example dash.conf rpcauth entry +rpcauth=myuser:933fff1aaefa1fc5b3e981fd3ceacf03$f799757c0d36be8f1faa1dd3a01562b17ada82f2ff6c968c959103afda9e7c6f +``` + +:::{note} +The `rpcauth` option can be specified multiple times if multiple users are required. +::: + +A canonical python script is included in Dash Core's repository under [share/rpcuser](https://github.com/dashpay/dash/tree/master/share/rpcauth) to generate the information required for the dash.conf file as well as the password required by clients using the rpcauth name. + +``` text +String to be appended to dash.conf: +rpcauth=myuser:b87393f6957f80448f8a0aba5eb8cc00$f67a3321106b13acc2a8881c9eb64e7bbc6eeb4681261b2918cc54da8915be6e +Your password: +2-Cl0O92-MT-XavyEIkkV_hxqdC_7fag8w7EF7t3UVg= +``` + +### RPC Whitelist + +The RPC whitelist system can limit certain RPC users to only have access to some RPC calls. The system is configured by specifying the following two parameters in the `dash.conf` file or by setting them as program arguments on the command line: + +* `rpcwhitelist`: set a whitelist to filter incoming RPC calls for a specific user. The field comes in the format: `:,,...,`. If multiple whitelists are set for a given user, they are set-intersected. Default whitelist behavior is defined by `rpcwhitelistdefault`. +* `rpcwhitelistdefault`: sets default behavior for RPC whitelisting. Unless `rpcwhitelistdefault` is set to `0`, if any `rpcwhitelist` is set, the RPC server acts as if all RPC users are subject to empty-unless-otherwise-specified whitelists. If `rpcwhitelistdefault` is set to `1` and no `rpcwhitelist` is set, the RPC server acts as if all RPC users are subject to empty whitelists. + +Example configuration + +```text +rpcauth=user1:4cc74397d6e9972e5ee7671fd241$11849357f26a5be7809c68a032bc2b16ab5dcf6348ef3ed1cf30dae47b8bcc71 +rpcauth=user2:181b4a25317bff60f3749adee7d6bca0$d9c331474f1322975fa170a2ffbcb176ba11644211746b27c1d317f265dd4ada +rpcauth=user3:a6c8a511b53b1edcf69c36984985e$13cfba0e626db19061c9d61fa58e712d0319c11db97ad845fa84517f454f6675 +rpcwhitelist=user1:getnetworkinfo +rpcwhitelist=user2:getnetworkinfo,getwalletinfo, getbestblockhash + +# Allow users to access any RPC unless they are listed in an `rpcwhitelist` entry +rpcwhitelistdefault=0 +``` + +In this example, user1 can only call `getnetworkinfo`, user2 can only call `getnetworkinfo` or `getwalletinfo`, while user3 can still call all RPCs. + +### Restricted Access Users + +:::{note} +This feature is only available on masternodes +::: + +As of Dash Core 0.17.0, an option is provided to add an RPC user that is restricted to a small subset of RPCs that will be used by Dash Platform. The `platform-user` configuration value sets the name of the RPC user to be restricted. + +The `platform-user` configuration value must be set to a previously configured [rpcauth user](#rpc-auth-security). + +Only the following RPCs are accessible to the restricted user: + +* [`getbestblockhash`](../api/remote-procedure-calls-blockchain.md#getbestblockhash) +* [`getblockhash`](../api/remote-procedure-calls-blockchain.md#getblockhash) +* [`getblockcount`](../api/remote-procedure-calls-blockchain.md#getblockcount) +* [`getbestchainlock`](../api/remote-procedure-calls-blockchain.md#getbestchainlock) +* [`quorum sign 4`](../api/remote-procedure-calls-evo.md#quorum-sign) - The restricted user can only request quorum signatures from the Platform quorum (LLMQ type 4) +* [`quorum verify`](../api/remote-procedure-calls-evo.md#quorum-verify) +* [`verifyislock`](../api/remote-procedure-calls-evo.md#verifyislock) + +### Default Connection Info + +The Dash Core RPC service listens for HTTP `POST` requests on port 9998 in [mainnet](../resources/glossary.md#mainnet) mode, 19998 in [testnet](../resources/glossary.md#testnet), or 19898 in [regression test mode](../resources/glossary.md#regression-test-mode). The port number can be changed by setting `rpcport` in `dash.conf`. By default the RPC service binds to your server's [localhost](https://en.wikipedia.org/wiki/Localhost) loopback network interface so it's not accessible from other servers. Authentication is implemented using [HTTP basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). RPC HTTP requests must include a `Content-Type` header set to `text/plain` and a `Content-Length` header set to the size of the request body. + +## Data Formats + +The format of the request body and response data is based on [version 1.0 of the JSON-RPC specification](http://json-rpc.org/wiki/specification). + +### Request Format + +Specifically, the HTTP `POST` data of a request must be a JSON object with the following format: + +| Name | Type | Presence | Description +|----------------------|-----------------|-----------------------------|---------------- +| Request | object | Required
(exactly 1) | The JSON-RPC request object +| →
`jsonrpc` | number (real) | Optional
(0 or 1) | Version indicator for the JSON-RPC request. Currently ignored by Dash Core. +| →
`id` | string | Optional
(0 or 1) | An arbitrary string that will be returned with the response. May be omitted or set to an empty string ("") +| →
`method` | string | Required
(exactly 1) | The RPC method name (e.g. `getblock`). See the RPC section for a list of available methods. +| →
`params` | array | Optional
(0 or 1) | An array containing positional parameter values for the RPC. May be an empty array or omitted for RPC calls that don't have any required parameters. +| →
`params` | object | Optional
(0 or 1) | Starting from Dash Core 0.12.3 / Bitcoin Core 0.14.0 (replaces the params array above) An object containing named parameter values for the RPC. May be an empty object or omitted for RPC calls that don’t have any required parameters. +| → →
Parameter | *any* | Optional
(0 or more) | A parameter. May be any JSON type allowed by the particular RPC method + +In the table above and in other tables describing RPC input and output, we use the following conventions + +* "→" indicates an argument that is the child of a JSON array or JSON object. For example, "→ → Parameter" above means Parameter is the child of the `params` array which itself is a child of the Request object. + +* Plain-text names like "Request" are unnamed in the actual JSON object + +* Code-style names like `params` are literal strings that appear in the JSON object. + +* "Type" is the JSON data type and the specific Dash Core type. + +* "Presence" indicates whether or not a field must be present within its containing array or object. Note that an optional object may still have required children. + +### Response Format + +The HTTP response data for a RPC request is a JSON object with the following format: + +| Name | Type | Presence | Description +|----------------------|-----------------|-----------------------------|---------------- +| Response | object | Required
(exactly 1) | The JSON-RPC response object. +| →
`result` | *any* | Required
(exactly 1) | The RPC output whose type varies by call. Has value `null` if an error occurred. +| →
`error` | null/object | Required
(exactly 1) | An object describing the error if one occurred, otherwise `null`. +| → →
`code` | number (int) | Required
(exactly 1) | The error code returned by the RPC function call. See [rpcprotocol.h](https://github.com/dashpay/dash/blob/v0.15.x/src/rpc/protocol.h) for a full list of error codes and their meanings. +| → →
`message` | string | Required
(exactly 1) | A text description of the error. May be an empty string (""). +| →
`id` | string | Required
(exactly 1) | The value of `id` provided with the request. Has value `null` if the `id` field was omitted in the request. + +## Example + +As an example, here is the JSON-RPC request object for the hash of the [genesis block](../resources/glossary.md#genesis-block): + +```json +{ + "method": "getblockhash", + "params": [0], + "id": "foo" +} +``` + +The command to send this request using `dash-cli` is: + +```shell Shell +dash-cli getblockhash 0 +``` + +The command to send this request using `dash-cli` with named parameters is: + +```shell Shell +dash-cli -named getblockhash height=0 +``` + +Alternatively, we could `POST` this request using the cURL command-line program as follows: + +```shell Shell +curl --user 'my_username:my_secret_password' --data-binary ''' + { + "method": "getblockhash", + "params": [0], + "id": "foo" + }''' \ + --header 'Content-Type: text/plain;' localhost:9998 +``` + +The HTTP response data for this request would be: + +```json +{ + "result": "00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c", + "error": null, + "id": "foo" +} +``` + +:::{note} +To minimize its size, the raw JSON response from Dash Core does not include any extraneous whitespace characters. +::: + +Here whitespace has been added to make the object more readable. `dash-cli` also transforms the raw response to make it more human-readable. It: + +* Adds whitespace indentation to JSON objects +* Expands escaped newline characters ("\n") into actual newlines +* Returns only the value of the `result` field if there's no error +* Strips the outer double-quotes around `result`s of type string +* Returns only the `error` field if there's an error + +Continuing with the example above, the output from the `dash-cli` command would be simply: + +```text +00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c +``` + +```{eval-rst} +.. _api-rpc-multi-wallet-support: +``` + +### Multi-wallet Support + +Since Dash Core 18.0 introduced the ability to have multiple wallets loaded at +the same time, wallet-related RPCs require providing the wallet name when more +than one wallet file is loaded. This is to ensure the RPC command is executed +using the correct wallet. + +**Dash-cli Example** + +Use the dash-cli `-rpcwallet` option to specify the path of the wallet file to +access, for example: + +```shell +dash-cli -rpcwallet= +``` + +To use the default wallet, use `""` for the wallet filename as shown in the +example below: + +```shell +dash-cli -rpcwallet="" getwalletinfo +``` + +**JSON-RPC Example** + +Specify which wallet file to access by setting the HTTP endpoint in the JSON-RPC +request using the format `:/wallet/`, for +example: + +```shell +curl --user 'my_username:my_secret_password' --data-binary ''' + { + "method": "getwalletinfo", + "params": [], + "id":"foo" + }'''\ + --header 'content-type: text/plain;' localhost:19998/wallet/testnet-wallet +``` + +Access the default wallet using the format `:/wallet/` +(the final "`/`" must be included): + +```shell +curl --user 'my_username:my_secret_password' --data-binary ''' + { + "method": "getwalletinfo", + "params": [], + "id":"foo" + }'''\ + --header 'content-type: text/plain;' localhost:19998/wallet/ +``` + +### RPCs with sub-commands + +Dash Core has a number of RPC requests that use sub-commands to group access to related data under one RPC method name. Examples of this include the [`gobject`](../api/remote-procedure-calls-dash.md#gobject), [`masternode`](../api/remote-procedure-calls-dash.md#masternode), [`protx`](../api/remote-procedure-calls-evo.md#protx), and [`quorum`](../api/remote-procedure-calls-evo.md#quorum) RPCs. If using cURL, the sub-commands should be included in the requests `params` field as shown here: + +```shell +curl --user 'my_username:my_secret_password' --data-binary ''' + { + "method": "gobject", + "params": ["list", "valid", "proposals"], + "id": "foo" + }''' \ + --header 'Content-Type: text/plain;' localhost:9998 +``` + +### Error Handling + +If there's an error processing a request, Dash Core sets the `result` field to `null` and provides information about the error in the `error` field. For example, a request for the block hash at block height -1 would be met with the following response (again, whitespace added for clarity): + +```json +{ + "result": null, + "error": { + "code": -8, + "message": "Block height out of range" + }, + "id": "foo" +} +``` + +If `dash-cli` encounters an error, it exits with a non-zero status code and outputs the `error` field as text to the process's standard error stream: + +```text +error code: -8 +error message: +Block height out of range +``` + +### Batch Requests + +The RPC interface supports request batching as described in [version 2.0 of the JSON-RPC specification](http://www.jsonrpc.org/specification#batch). To initiate multiple RPC requests within a single HTTP request, a client can `POST` a JSON array filled with Request objects. The HTTP response data is then a JSON array filled with the corresponding Response objects. Depending on your usage pattern, request batching may provide significant performance gains. The `dash-cli` RPC client does not support batch requests. + +```shell +curl --user 'my_username:my_secret_password' --data-binary ''' + [ + { + "method": "getblockhash", + "params": [0], + "id": "foo" + }, + { + "method": "getblockhash", + "params": [1], + "id": "foo2" + } + ]''' \ + --header 'Content-Type: text/plain;' localhost:9998 +``` + +To keep this documentation compact and readable, the examples for each of the available RPC calls will be given as `dash-cli` commands: + +```shell +dash-cli [options] ... +``` + +This translates into an JSON-RPC Request object of the form: + +```json +{ + "method": "", + "params": [ "", "", "..." ], + "id": "foo" +} +``` + +:::{warning} +If you write programs using the JSON-RPC interface, you must ensure they handle high-precision real numbers correctly. See the [Proper Money Handling](https://en.bitcoin.it/wiki/Proper_Money_Handling_%28JSON-RPC%29) Bitcoin Wiki article for details and example code. +::: + +```{toctree} +:maxdepth: 3 +:titlesonly: + +remote-procedure-call-quick-reference +remote-procedure-calls-address-index +remote-procedure-calls-blockchain +remote-procedure-calls-control +remote-procedure-calls-dash +remote-procedure-calls-evo +remote-procedure-calls-generating +remote-procedure-calls-mining +remote-procedure-calls-network +remote-procedure-calls-raw-transactions +remote-procedure-calls-util +remote-procedure-calls-wallet +remote-procedure-calls-wallet-deprecated +remote-procedure-calls-removed +remote-procedure-calls-zmq +``` diff --git a/docs/core/api/zmq.md b/docs/core/api/zmq.md new file mode 100644 index 000000000..6e16f461e --- /dev/null +++ b/docs/core/api/zmq.md @@ -0,0 +1,110 @@ +```{eval-rst} +.. meta:: + :title: ZeroMQ (ZMQ) Notifications + :description: In Dash, ZeroMQ is a lightweight wrapper for TCP connections and inter-process communication, supporting various messaging patterns. +``` + +# ZeroMQ (ZMQ) Notifications + +## Overview + +ZeroMQ is a lightweight wrapper around TCP connections, inter-process communication, and shared-memory, providing various message-oriented semantics such as publish/subscribe, request/reply, and push/pull. + +The Dash Core daemon can be configured to act as a trusted "border router", implementing the dash wire protocol and relay, making consensus decisions, maintaining the local blockchain database, broadcasting locally generated transactions into the network, and providing a queryable RPC interface to interact on a polled basis for requesting blockchain related data. However, there exists only a limited service to notify external software of events like the arrival of new blocks or transactions. + +The ZeroMQ facility implements a notification interface through a set of specific notifiers. Currently there are notifiers that publish blocks and transactions. This read-only facility requires only the connection of a corresponding ZeroMQ subscriber port in receiving software; it is not authenticated nor is there any two-way protocol involvement. Therefore, subscribers should validate the received data since it may be out of date, incomplete or even invalid. + +ZeroMQ sockets are self-connecting and self-healing; that is, connections made between two endpoints will be automatically restored after an outage, and either end may be freely started or stopped in any order. + +Because ZeroMQ is message oriented, subscribers receive transactions and blocks all-at-once and do not need to implement any sort of buffering or reassembly. + +## Available Notifications + +Currently, the following notifications are supported: + +| Notification | Description | +| - | - | +| zmqpubhashblock | Block hash | +| zmqpubhashchainlock | Hash of a block with a [ChainLock](../guide/dash-features-chainlocks.md) | +| zmqpubhashtx | Transaction hash (TXID) | +| zmqpubhashtxlock | Hash of a transaction receiving and [InstantSend](../guide/dash-features-instantsend.md) lock (TXID) | +| zmqpubhashgovernancevote | Governance vote hash | +| zmqpubhashgovernanceobject | Governance object hash | +| zmqpubhashinstantsend
doublespend | Hash of a transaction attempting to double-spend an InstantSend-locked input | +| zmqpubhashrecoveredsig | Hash of recovered signatures (recovered by LLMQs) +| zmqpubrawblock | Raw [`block`](../reference/p2p-network-data-messages.md#block) | +| zmqpubrawchainlock | Raw [`block`](../reference/p2p-network-data-messages.md#block) receiving a ChainLock | +| zmqpubrawchainlocksig | Raw [`block`](../reference/p2p-network-data-messages.md#block) with ChainLock signature ([`clsig`](../reference/p2p-network-instantsend-messages.md#clsig)) concatenated | +| zmqpubrawtx | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) | +| zmqpubrawtxlock | Raw InstantSend transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) | +| zmqpubrawtxlocksig | Raw InstantSend transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) with InstantSend lock signature ([`isdlock`](../reference/p2p-network-instantsend-messages.md#isdlock)) concatenated | +| zmqpubrawgovernancevote | Raw governance vote ([`govobjvote`](../reference/p2p-network-governance-messages.md#govobjvote)) | +| zmqpubrawgovernanceobject | Raw governance object ([`govobject`](../reference/p2p-network-governance-messages.md#govobj)) | +| zmqpubrawinstantsend
doublespend | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) attempting to double-spend an InstantSend-locked input | +| zmqpubrawrecoveredsig | Raw recovered signatures (recovered by LLMQs) + +## High Water Mark + +The option to set the PUB socket's outbound message [high water mark](https://zeromq.org/socket-api/#high-water-mark) (SNDHWM) may be set individually for each notification: + +| High water mark name | Description | +| - | - | +| zmqpubhashtxhwm | Transaction hash (TXID) high water mark | +| zmqpubhashblockhwm | Block hash high water mark | +| zmqpubhashchainlockhwm | Hash of a block with a [ChainLock](../guide/dash-features-chainlocks.md) high water mark | +| zmqpubhashtxlockhwm | Hash of a transaction receiving and [InstantSend](../guide/dash-features-instantsend.md) lock (TXID) high water mark | +| zmqpubhashgovernancevotehwm | Governance vote hash high water mark | +| zmqpubhashgovernanceobjecthwm | Governance object hash high water mark | +| zmqpubhashinstantsenddoublespendhwm | Hash of a transaction attempting to double-spend an InstantSend-locked input high water mark | +| zmqpubhashrecoveredsighwm | Hash of recovered signatures (recovered by LLMQs) high water mark | +| zmqpubrawblockhwm | Raw [`block`](../reference/p2p-network-data-messages.md#block) high water mark | +| zmqpubrawtxhwm | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) high water mark | +| zmqpubrawchainlockhwm | Raw [`block`](../reference/p2p-network-data-messages.md#block) receiving a ChainLock high water mark | +| zmqpubrawchainlocksighwm | Raw [`block`](../reference/p2p-network-data-messages.md#block) with ChainLock signature ([`clsig`](../reference/p2p-network-instantsend-messages.md#clsig)) concatenated high water mark | +| zmqpubrawtxlockhwm | Raw InstantSend transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) high water mark | +| zmqpubrawtxlocksighwm | Raw InstantSend transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) with InstantSend lock signature ([`isdlock`](../reference/p2p-network-instantsend-messages.md#isdlock)) concatenated high water mark | +| zmqpubrawgovernancevotehwm | Raw governance vote ([`govobjvote`](../reference/p2p-network-governance-messages.md#govobjvote)) high water mark | +| zmqpubrawgovernanceobjecthwm | Raw governance object ([`govobject`](../reference/p2p-network-governance-messages.md#govobj)) high water mark | +| zmqpubrawinstantsenddoublespendhwm | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) attempting to double-spend an InstantSend-locked input high water mark | +| zmqpubrawrecoveredsighwm | Raw recovered signatures (recovered by LLMQs) high water mark | + +## Dash Core Configuration + +ZMQ notifications can be enabled via either command line arguments or the configuration file (typically `dash.conf`). + +### Command Line + +``` +$ dashd -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=ipc:///tmp/dashd.tx.raw +``` + +### Config File + +``` +# ZMQ +zmqpubhashtx=tcp://0.0.0.0:28332 +zmqpubrawtx=tcp://0.0.0.0:28332 +``` + +## Usage + +The socket type is PUB and the address must be a valid ZeroMQ socket address. Each PUB notification has a topic and body, where the header corresponds to the notification type. For instance, for the notification `-zmqpubhashtx` the topic is `hashtx` (no null terminator) and the body is the hexadecimal transaction hash (32 bytes). + +:::{note} +The same address can be used in more than one notification. +::: + +ZeroMQ endpoint specifiers for TCP (and others) are documented in the [ZeroMQ API](http://api.zeromq.org/4-0:_start). + +Client side, then, the ZeroMQ subscriber socket must have the `ZMQ_SUBSCRIBE` option set to one or either of these prefixes (for instance, just `hash`); without doing so will result in no messages arriving. Please see the Dash Core repository for a [working example](https://github.com/dashpay/dash/blob/master/contrib/zmq/zmq_sub3.4.py). + +## Notes + +From the perspective of dashd, the ZeroMQ socket is write-only; PUB sockets don't even have a read function. Thus, there is no state introduced into dashd directly. Furthermore, no information is broadcast that wasn't already received from the public P2P network. + +No authentication or authorization is done on connecting clients; it is assumed that the ZeroMQ port is exposed only to trusted entities, using other means such as firewalling. + +Note that when the block chain tip changes, a reorganisation may occur and just the tip will be notified. It is up to the subscriber to retrieve the chain from the last known block to the new tip. + +There are several possibilities that ZMQ notification can get lost during transmission depending on the communication type your are using. Dashd appends an up-counting sequence number to each notification which allows listeners to detect lost notifications. diff --git a/docs/core/dashcore/wallet-arguments-and-commands-dash-cli.md b/docs/core/dashcore/wallet-arguments-and-commands-dash-cli.md new file mode 100644 index 000000000..54798024d --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands-dash-cli.md @@ -0,0 +1,192 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands-dash-cli: +.. meta:: + :title: dash-cli Wallet Arguments and Commands + :description: The section includes command-line option for accessing Dash Core RPCs via the dash-cli application. +``` + +# dash-cli + +The `dash-cli` application provides a command-line option for accessing Dash Core RPCs. + +## Usage + +:::{attention} +Since Dash Core 18.0 introduced the ability to have multiple wallets loaded at the same time, wallet-related RPCs require using the `-rpcwallet` option any time more than one wallet file is loaded. This is to ensure the RPC command is executed using the correct wallet. The syntax is: +`dash-cli -rpcwallet= ` +::: + +```bash Send command +dash-cli [options] [params] +``` + +```bash Send command using wallet +dash-cli [options] -rpcwallet= [params] +``` + +```bash Send command (with named arguments) + dash-cli [options] -named [name=value] ... +``` + +```bash List commands +dash-cli [options] help +``` + +```bash Get help for command +dash-cli [options] help +``` + +:::{note} +View [the list of RPCs](../api/remote-procedure-call-quick-reference.md) for more detailed information. Using dash-cli, this information is available using the `dash-cli [options] help` and `dash-cli [options] help ` commands. +::: + +### Options + +```text + -? + Print this help message and exit + + -addrinfo + Get the number of addresses known to the node, per network and total. + + -color= + Color setting for CLI output (default: auto). Valid values: always, auto + (add color codes when standard output is connected to a terminal + and OS is not WIN32), never. + + -conf= + Specify configuration file. Relative paths will be prefixed by datadir + location. (default: dash.conf) + + -datadir=
+ Specify data directory + + -generate + Generate blocks immediately, equivalent to RPC getnewaddress followed by + RPC generatetoaddress. Optional positional integer arguments are + number of blocks to generate (default: 1) and maximum iterations + to try (default: 1000000), equivalent to RPC generatetoaddress + nblocks and maxtries arguments. Example: dash-cli -generate 4 + 1000 + + -getinfo + Get general information from the remote server. Note that unlike + server-side RPC calls, the results of -getinfo is the result of + multiple non-atomic requests. Some entries in the result may + represent results from different states (e.g. wallet balance may + be as of a different block from the chain state reported) + + -named + Pass named instead of positional arguments (default: false) + + -netinfo + Get network peer connection information from the remote server. An + optional integer argument from 0 to 4 can be passed for different + peers listings (default: 0). Pass "help" for detailed help + documentation. + + -rpcclienttimeout= + Timeout in seconds during HTTP requests, or 0 for no timeout. (default: + 900) + + -rpcconnect= + Send commands to node running on (default: 127.0.0.1) + + -rpccookiefile= + Location of the auth cookie. Relative paths will be prefixed by a + net-specific datadir location. (default: data dir) + + -rpcpassword= + Password for JSON-RPC connections + + -rpcport= + Connect to JSON-RPC on (default: 9998, testnet: 19998, regtest: + 19898) + + -rpcuser= + Username for JSON-RPC connections + + -rpcwait + Wait for RPC server to start + + -rpcwaittimeout= + Timeout in seconds to wait for the RPC server to start, or 0 for no + timeout. (default: 0) + + -rpcwallet= + Send RPC for non-default wallet on RPC server (needs to exactly match + corresponding -wallet option passed to dashd). This changes the + RPC endpoint used, e.g. http://127.0.0.1:9998/wallet/ + + -stdin + Read extra arguments from standard input, one per line until EOF/Ctrl-D + (recommended for sensitive information such as passphrases). When + combined with -stdinrpcpass, the first line from standard input + is used for the RPC password. + + -stdinrpcpass + Read RPC password from standard input as a single line. When combined + with -stdin, the first line from standard input is used for the + RPC password. When combined with -stdinwalletpassphrase, + -stdinrpcpass consumes the first line, and -stdinwalletpassphrase + consumes the second. + + -stdinwalletpassphrase + Read wallet passphrase from standard input as a single line. When + combined with -stdin, the first line from standard input is used + for the wallet passphrase. + + -version + Print version and exit +``` + +### Chain selection options + +```text + -chain= + Use the chain (default: main). Allowed values: main, test, + regtest + + -devnet= + Use devnet chain with provided name + + -highsubsidyblocks= + The number of blocks with a higher than normal subsidy to mine at the + start of a chain. Block after that height will have fixed subsidy + base. (default: 0, devnet-only) + + -highsubsidyfactor= + The factor to multiply the normal block subsidy by while in the + highsubsidyblocks window of a chain (default: 1, devnet-only) + + -llmqchainlocks= + Override the default LLMQ type used for ChainLocks. Allows using + ChainLocks with smaller LLMQs. (default: llmq_devnet, + devnet-only) + + -llmqdevnetparams=: + Override the default LLMQ size for the LLMQ_DEVNET quorum (devnet-only) + + -llmqinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. (default: + llmq_devnet_dip0024, devnet-only) + + -llmqmnhf= + Override the default LLMQ type used for EHF. (default: llmq_devnet, + devnet-only) + + -llmqplatform= + Override the default LLMQ type used for Platform. (default: + llmq_devnet_platform, devnet-only) + + -minimumdifficultyblocks= + The number of blocks that can be mined with the minimum difficulty at + the start of a chain (default: 0, devnet-only) + + -powtargetspacing= + Override the default PowTargetSpacing value in seconds (default: 2.5 + minutes, devnet-only) + + -testnet + Use the test chain. Equivalent to -chain=test +``` diff --git a/docs/core/dashcore/wallet-arguments-and-commands-dash-qt.md b/docs/core/dashcore/wallet-arguments-and-commands-dash-qt.md new file mode 100644 index 000000000..8753d036e --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands-dash-qt.md @@ -0,0 +1,70 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands-dash-qt: +.. meta:: + :title: dash-qt Wallet Arguments and Commands + :description: The section shows all available options including debug options that are not normally displayed for dash-qt +``` + +# dash-qt + +## Usage + +```bash +dash-qt [command-line options] +``` + +:::{attention} +The following sections show all available options including debug options that are not normally displayed. To see only regular options, run dash-qt --help. +::: + +Dash Core QT GUI includes all the same command line options as [dashd](../dashcore/wallet-arguments-and-commands-dashd.md) with the exception of `-daemon`. It also provides additional options for UI as described below. + +### UI Options + +```text + -choosedatadir + Choose data directory on startup (default: 0) + + -custom-css-dir + Set a directory which contains custom css files. Those will be used as + stylesheets for the UI. + + -debug-ui + Updates the UI's stylesheets in realtime with changes made to the css + files in -custom-css-dir and forces some widgets to show up which + are usually only visible under certain circumstances. (default: + 0) + + -font-family + Set the font family. Possible values: SystemDefault, Montserrat. + (default: SystemDefault) + + -font-scale + Set a scale factor which gets applied to the base font size. Possible + range -100 (smallest fonts) to 100 (largest fonts). (default: 0) + + -font-weight-bold + Set the font weight for bold texts. Possible range 0 to 8 (default: 4) + + -font-weight-normal + Set the font weight for normal texts. Possible range 0 to 8 (default: 2) + + -lang= + Set language, for example "de_DE" (default: system locale) + + -min + Start minimized + + -resetguisettings + Reset all settings changed in the GUI + + -splash + Show splash screen on startup (default: 1) + + -uiplatform + Select platform to customize UI for (one of windows, macosx, other; + default: other) + + -windowtitle= + Sets a window title which is appended to "Dash Core - " +``` diff --git a/docs/core/dashcore/wallet-arguments-and-commands-dash-tx.md b/docs/core/dashcore/wallet-arguments-and-commands-dash-tx.md new file mode 100644 index 000000000..96c0fd10e --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands-dash-tx.md @@ -0,0 +1,142 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands-dash-tx: +.. meta:: + :title: dash-tx Wallet Arguments and Commands + :description: Command-line options for creating, parsing, or modifying transactions via dash-tx. +``` + +# dash-tx + +The `dash-tx` application provides a command-line option for creating, parsing, or modifying transactions. + +## Usage + +```bash +Usage: + dash-tx [options] [commands] Update hex-encoded dash transaction + dash-tx [options] -create [commands] Create hex-encoded dash transaction +``` + +### Options + +```text + -? + Print this help message and exit + + -create + Create new, empty TX. + + -json + Select JSON output + + -txid + Output only the hex-encoded transaction id of the resultant transaction. + + -version + Print version and exit +``` + +### Chain selection options + +```text + -chain= + Use the chain (default: main). Allowed values: main, test, + regtest + + -devnet= + Use devnet chain with provided name + + -highsubsidyblocks= + The number of blocks with a higher than normal subsidy to mine at the + start of a chain. Block after that height will have fixed subsidy + base. (default: 0, devnet-only) + + -highsubsidyfactor= + The factor to multiply the normal block subsidy by while in the + highsubsidyblocks window of a chain (default: 1, devnet-only) + + -llmqchainlocks= + Override the default LLMQ type used for ChainLocks. Allows using + ChainLocks with smaller LLMQs. (default: llmq_devnet, + devnet-only) + + -llmqdevnetparams=: + Override the default LLMQ size for the LLMQ_DEVNET quorum (devnet-only) + + -llmqinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. (default: + llmq_devnet_dip0024, devnet-only) + + -llmqmnhf= + Override the default LLMQ type used for EHF. (default: llmq_devnet, + devnet-only) + + -llmqplatform= + Override the default LLMQ type used for Platform. (default: + llmq_devnet_platform, devnet-only) + + -minimumdifficultyblocks= + The number of blocks that can be mined with the minimum difficulty at + the start of a chain (default: 0, devnet-only) + + -powtargetspacing= + Override the default PowTargetSpacing value in seconds (default: 2.5 + minutes, devnet-only) + + -testnet + Use the test chain. Equivalent to -chain=test +``` + +### Commands + +```text + delin=N + Delete input N from TX + + delout=N + Delete output N from TX + + in=TXID:VOUT(:SEQUENCE_NUMBER) + Add input to TX + + locktime=N + Set TX lock time to N + + nversion=N + Set TX version to N + + outaddr=VALUE:ADDRESS + Add address-based output to TX + + outdata=[VALUE:]DATA + Add data-based output to TX + + outmultisig=VALUE:REQUIRED:PUBKEYS:PUBKEY1:PUBKEY2:....[:FLAGS] + Add Pay To n-of-m Multi-sig output to TX. n = REQUIRED, m = PUBKEYS. + Optionally add the "S" flag to wrap the output in a + pay-to-script-hash. + + outpubkey=VALUE:PUBKEY[:FLAGS] + Add pay-to-pubkey output to TX. Optionally add the "S" flag to wrap the + output in a pay-to-script-hash. + + outscript=VALUE:SCRIPT[:FLAGS] + Add raw script output to TX. Optionally add the "S" flag to wrap the + output in a pay-to-script-hash. + + sign=SIGHASH-FLAGS + Add zero or more signatures to transaction. This command requires JSON + registers:prevtxs=JSON object, privatekeys=JSON object. See + signrawtransactionwithkey docs for format of sighash flags, JSON + objects. +``` + +### Register Commands + +```text + load=NAME:FILENAME + Load JSON file FILENAME into register NAME + + set=NAME:JSON-STRING + Set register NAME to given JSON-STRING +``` diff --git a/docs/core/dashcore/wallet-arguments-and-commands-dash-wallet.md b/docs/core/dashcore/wallet-arguments-and-commands-dash-wallet.md new file mode 100644 index 000000000..377c9c469 --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands-dash-wallet.md @@ -0,0 +1,132 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands-dash-wallet: +.. meta:: + :title: dash-wallet Arguments and Commands + :description: The dash-wallet application is an offline tool for creating and interacting with Dash Core wallet files. +``` + +# dash-wallet + +The `dash-wallet` application is an offline tool for creating and interacting with Dash Core wallet files. By default dash-wallet will act on wallets in the default mainnet wallet directory in the datadir. To change the target wallet, use the `-datadir`, `-wallet` and `-testnet`/`-regtest` arguments. + +## Usage + +```bash +Usage: + dash-wallet [options] +``` + +### Options + +```text + -? + Print this help message and exit + + -datadir= + Specify data directory + + -descriptors + Create descriptors wallet. Only for 'create' + + -dumpfile= + When used with 'dump', writes out the records to this file. When used + with 'createfromdump', loads the records into a new wallet. + + -format= + The format of the wallet file to create. Either "bdb" or "sqlite". Only + used with 'createfromdump' + + -usehd + Create HD (hierarchical deterministic) wallet (default: 1) + + -version + Print version and exit + + -wallet= + Specify wallet name +``` + +### Debugging/Testing options + +```text + -debug= + Output debugging information (default: 0). + + -printtoconsole + Send trace/debug info to console (default: 1 when no -debug is true, 0 + otherwise). +``` + +### Chain selection options + +```text + -chain= + Use the chain (default: main). Allowed values: main, test, + regtest + + -devnet= + Use devnet chain with provided name + + -highsubsidyblocks= + The number of blocks with a higher than normal subsidy to mine at the + start of a chain. Block after that height will have fixed subsidy + base. (default: 0, devnet-only) + + -highsubsidyfactor= + The factor to multiply the normal block subsidy by while in the + highsubsidyblocks window of a chain (default: 1, devnet-only) + + -llmqchainlocks= + Override the default LLMQ type used for ChainLocks. Allows using + ChainLocks with smaller LLMQs. (default: llmq_devnet, + devnet-only) + + -llmqdevnetparams=: + Override the default LLMQ size for the LLMQ_DEVNET quorum (devnet-only) + + -llmqinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. (default: + llmq_devnet_dip0024, devnet-only) + + -llmqmnhf= + Override the default LLMQ type used for EHF. (default: llmq_devnet, + devnet-only) + + -llmqplatform= + Override the default LLMQ type used for Platform. (default: + llmq_devnet_platform, devnet-only) + + -minimumdifficultyblocks= + The number of blocks that can be mined with the minimum difficulty at + the start of a chain (default: 0, devnet-only) + + -powtargetspacing= + Override the default PowTargetSpacing value in seconds (default: 2.5 + minutes, devnet-only) + + -testnet + Use the test chain. Equivalent to -chain=test +``` + +### Commands + +```text + create + Create new wallet file + + createfromdump + Create new wallet file from dumped records + + dump + Print out all of the wallet key-value records + + info + Get wallet info + + salvage + Attempt to recover private keys from a corrupt wallet. Warning: + 'salvage' is experimental. + + wipetxes + Wipe all transactions from a wallet +``` diff --git a/docs/core/dashcore/wallet-arguments-and-commands-dashd.md b/docs/core/dashcore/wallet-arguments-and-commands-dashd.md new file mode 100644 index 000000000..2fcc6b271 --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands-dashd.md @@ -0,0 +1,1208 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands-dashd: +.. meta:: + :title: dashd Arguments and Commands + :description: The following section shows all available options for dashd including debug options that are not normally displayed. +``` + +# dashd + +## Usage + +**Start Dash Core Daemon** + +```bash +dashd [options] +``` + +:::{attention} +The following sections show all available options including debug options that are not normally displayed. To see only regular options, run `dashd --help`. +::: + +### Options + +```text + -? + Print this help message and exit + + -alertnotify= + Execute command when an alert is raised (%s in cmd is replaced by + message) + + -assumevalid= + If this block is in the chain assume that it and its ancestors are valid + and potentially skip their script verification (0 to verify all, + default: + 000000000000001889bd33ef019065e250d32bd46911f4003d3fdd8128b5358d, + testnet: + 00000034bfeb926662ba547c0b8dd4ba8cbb6e0c581f4e7d1bddce8f9ca3a608) + + -blockfilterindex= + Maintain an index of compact filters by block (default: 0, values: + basic). If is not supplied or if = 1, indexes for + all known types are enabled. + + -blocknotify= + Execute command when the best block changes (%s in cmd is replaced by + block hash) + + -blockreconstructionextratxn= + Extra transactions to keep in memory for compact block reconstructions + (default: 100) + + -blocksdir= + Specify directory to hold blocks subdirectory for *.dat files (default: + ) + + -blocksonly + Whether to reject transactions from network peers. Automatic broadcast + and rebroadcast of any transactions from inbound peers is + disabled, unless the peer has the 'forcerelay' permission. RPC + transactions are not affected. (default: 0) + + -chainlocknotify= + Execute command when the best chainlock changes (%s in cmd is replaced + by chainlocked block hash) + + -coinstatsindex + Maintain coinstats index used by the gettxoutsetinfo RPC (default: 0) + + -conf= + Specify path to read-only configuration file. Relative paths will be + prefixed by datadir location. (default: dash.conf) + + -daemon + Run in the background as a daemon and accept commands (default: 0) + + -daemonwait + Wait for initialization to be finished before exiting. This implies + -daemon (default: 0) + + -datadir= + Specify data directory + + -dbbatchsize + Maximum database write batch size in bytes (default: 16777216) + + -dbcache= + Maximum database cache size MiB (4 to 16384, default: 300). In + addition, unused mempool memory is shared for this cache (see + -maxmempool). + + -debuglogfile= + Specify location of debug log file. Relative paths will be prefixed by a + net-specific datadir location. (-nodebuglogfile to disable; + default: debug.log) + + -includeconf= + Specify additional configuration file, relative to the -datadir path + (only useable from configuration file, not command line) + + -loadblock= + Imports blocks from external file on startup + + -maxmempool= + Keep the transaction memory pool below megabytes (default: 300) + + -maxorphantxsize= + Maximum total size of all orphan transactions in megabytes (default: 10) + + -maxrecsigsage= + Number of seconds to keep LLMQ recovery sigs (default: 604800) + + -mempoolexpiry= + Do not keep transactions in the mempool longer than hours (default: + 336) + + -minimumchainwork= + Minimum work assumed to exist on a valid chain in hex (default: + 00000000000000000000000000000000000000000000988117deadb0db9cd5b8, + testnet: + 000000000000000000000000000000000000000000000000031779704a0f54b4) + + -par= + Set the number of script verification threads (-16 to 15, 0 = auto, <0 = + leave that many cores free, default: 0) + + -persistmempool + Whether to save the mempool on shutdown and load on restart (default: 1) + + -pid= + Specify pid file. Relative paths will be prefixed by a net-specific + datadir location. (default: dashd.pid) + + -prune= + Reduce storage requirements by enabling pruning (deleting) of old + blocks. This allows the pruneblockchain RPC to be called to + delete specific blocks, and enables automatic pruning of old + blocks if a target size in MiB is provided. This mode is + incompatible with -txindex, -coinstatsindex, -rescan and + -disablegovernance=false. Warning: Reverting this setting + requires re-downloading the entire blockchain. (default: 0 = + disable pruning blocks, 1 = allow manual pruning via RPC, >945 = + automatically prune block files to stay under the specified + target size in MiB) + + -settings= + Specify path to dynamic settings data file. Can be disabled with + -nosettings. File is written at runtime and not meant to be + edited by users (use dash.conf instead for custom settings). + Relative paths will be prefixed by datadir location. (default: + settings.json) + + -startupnotify= + Execute command on startup. + + -syncmempool + Sync mempool from other nodes on start (default: 1) + + -sysperms + Create new files with system default permissions, instead of umask 077 + (only effective with disabled wallet functionality) + + -version + Print version and exit +``` + +### Connection options + +```text + -addnode= + Add a node to connect to and attempt to keep the connection open (see + the addnode RPC help for more info). This option can be specified + multiple times to add multiple nodes; connections are limited to + 8 at a time and are counted separately from the -maxconnections + limit. + + -allowprivatenet + Allow RFC1918 addresses to be relayed and connected to (default: 0) + + -asmap= + Specify asn mapping used for bucketing of the peers (default: + ip_asn.map). Relative paths will be prefixed by the net-specific + datadir location. + + -bantime= + Default duration (in seconds) of manually configured bans (default: + 86400) + + -bind=[:][=onion] + Bind to given address and always listen on it (default: 0.0.0.0). Use + [host]:port notation for IPv6. Append =onion to tag any incoming + connections to that address and port as incoming Tor connections + (default: 127.0.0.1:9996=onion, testnet: 127.0.0.1:19996=onion, + regtest: 127.0.0.1:19896=onion) + + -cjdnsreachable + If set, then this host is configured for CJDNS (connecting to fc00::/8 + addresses would lead us to the CJDNS network, see doc/cjdns.md) + (default: 0) + + -connect= + Connect only to the specified node; -noconnect disables automatic + connections (the rules for this peer are the same as for + -addnode). This option can be specified multiple times to connect + to multiple nodes. + + -discover + Discover own IP addresses (default: 1 when listening and no -externalip + or -proxy) + + -dns + Allow DNS lookups for -addnode, -seednode and -connect (default: 1) + + -dnsseed + Query for peer addresses via DNS lookup, if low on addresses (default: 1 + unless -connect used) + + -externalip= + Specify your own public address + + -fixedseeds + Allow fixed seeds if DNS seeds don't provide peers (default: 1) + + -forcednsseed + Always query for peer addresses via DNS lookup (default: 0) + + -i2pacceptincoming + Whether to accept inbound I2P connections (default: 1). Ignored if + -i2psam is not set. Listening for inbound I2P connections is done + through the SAM proxy, not by binding to a local address and + port. + + -i2psam= + I2P SAM proxy to reach I2P peers and accept I2P connections (default: + none) + + -listen + Accept connections from outside (default: 1 if no -proxy or -connect) + + -listenonion + Automatically create Tor onion service (default: 1) + + -maxconnections= + Maintain at most connections to peers (temporary service connections + excluded) (default: 125). This limit does not apply to + connections manually added via -addnode or the addnode RPC, which + have a separate limit of 8. + + -maxreceivebuffer= + Maximum per-connection receive buffer, *1000 bytes (default: 5000) + + -maxsendbuffer= + Maximum per-connection send buffer, *1000 bytes (default: 1000) + + -maxtimeadjustment + Maximum allowed median peer time offset adjustment. Local perspective of + time may be influenced by peers forward or backward by this + amount. (default: 4200 seconds) + + -maxuploadtarget= + Tries to keep outbound traffic under the given target (in MiB per 24h). + Limit does not apply to peers with 'download' permission. 0 = no + limit (default: 0) + + -natpmp + Use NAT-PMP to map the listening port (default: 0) + + -networkactive + Enable all P2P network activity (default: 1). Can be changed by the + setnetworkactive RPC command + + -onion= + Use separate SOCKS5 proxy to reach peers via Tor onion services, set + -noonion to disable (default: -proxy) + + -onlynet= + Make automatic outbound connections only to network (ipv4, ipv6, + onion, i2p, cjdns). Inbound and manual connections are not + affected by this option. It can be specified multiple times to + allow multiple networks. + + -peerblockfilters + Serve compact block filters to peers per BIP 157 (default: 0) + + -peerbloomfilters + Support filtering of blocks and transaction with bloom filters (default: + 1) + + -peertimeout= + Specify a p2p connection timeout delay in seconds. After connecting to a + peer, wait this amount of time before considering disconnection + based on inactivity (minimum: 1, default: 60) + + -permitbaremultisig + Relay non-P2SH multisig (default: 1) + + -port= + Listen for connections on . Nodes not using the default ports + (default: 9999, testnet: 19999, regtest: 19899) are unlikely to + get incoming connections. Not relevant for I2P (see doc/i2p.md). + + -proxy= + Connect through SOCKS5 proxy, set -noproxy to disable (default: + disabled) + + -proxyrandomize + Randomize credentials for every proxy connection. This enables Tor + stream isolation (default: 1) + + -seednode= + Connect to a node to retrieve peer addresses, and disconnect. This + option can be specified multiple times to connect to multiple + nodes. + + -socketevents= + Socket events mode, which must be one of 'select', 'poll', 'epoll' or + 'kqueue', depending on your system (default: Linux - 'epoll', + FreeBSD/Apple - 'kqueue', Windows - 'select') + + -timeout= + Specify socket connection timeout in milliseconds. If an initial attempt + to connect is unsuccessful after this amount of time, drop it + (minimum: 1, default: 5000) + + -torcontrol=: + Tor control port to use if onion listening enabled (default: + 127.0.0.1:9051) + + -torpassword= + Tor control port password (default: empty) + + -upnp + Use UPnP to map the listening port (default: 1 when listening and no + -proxy) + + -whitebind=<[permissions@]addr> + Bind to the given address and add permission flags to the peers + connecting to it. Use [host]:port notation for IPv6. Allowed + permissions: bloomfilter (allow requesting BIP37 filtered blocks + and transactions), noban (do not ban for misbehavior; implies + download), forcerelay (relay transactions that are already in the + mempool; implies relay), relay (relay even in -blocksonly mode), + mempool (allow requesting BIP35 mempool contents), download + (allow getheaders during IBD, no disconnect after maxuploadtarget + limit), addr (responses to GETADDR avoid hitting the cache and + contain random records with the most up-to-date info). Specify + multiple permissions separated by commas (default: + download,noban,mempool,relay). Can be specified multiple times. + + -whitelist=<[permissions@]IP address or network> + Add permission flags to the peers connecting from the given IP address + (e.g. 1.2.3.4) or CIDR-notated network (e.g. 1.2.3.0/24). Uses + the same permissions as -whitebind. Can be specified multiple + times. +``` + +### Indexing options + +```text + -addressindex + Maintain a full address index, used to query for the balance, txids and + unspent outputs for addresses (default: 0) + + -reindex + Rebuild chain state and block index from the blk*.dat files on disk + + -reindex-chainstate + Rebuild chain state from the currently indexed blocks. When in pruning + mode or if blocks on disk might be corrupted, use full -reindex + instead. + + -spentindex + Maintain a full spent index, used to query the spending txid and input + index for an outpoint (default: 0) + + -timestampindex + Maintain a timestamp index for block hashes, used to query blocks hashes + by a range of timestamps (default: 0) + + -txindex + Maintain a full transaction index, used by the getrawtransaction rpc + call (default: 1) +``` + +### Wallet options + +:::{attention} +Dash Core 18.1.0 removed the `-zapwallettxes` startup option and its functionality. This option was originally intended to allow for the fee bumping of transactions that did not signal RBF. This functionality has been superseded with the [abandon transaction capability](../api/remote-procedure-calls-wallet.md#abandontransaction) available via RPC/console or when right-clicking on unconfirmed transactions in Dash-Qt. +::: + +```text + -avoidpartialspends + Group outputs by address, selecting many (possibly all) or none, instead + of selecting on a per-output basis. Privacy is improved as + addresses are mostly swept with fewer transactions and outputs + are aggregated in clean change addresses. It may result in higher + fees due to less optimal coin selection caused by this added + limitation and possibly a larger-than-necessary number of inputs + being used. Always enabled for wallets with "avoid_reuse" + enabled, otherwise default: 0. + + -createwalletbackups= + Number of automatic wallet backups (default: 10) + + -disablewallet + Do not load the wallet and disable wallet RPC calls + + -instantsendnotify= + Execute command when a wallet InstantSend transaction is successfully + locked. %s in cmd is replaced by TxID and %w is replaced by + wallet name. %w is not currently implemented on Windows. On + systems where %w is supported, it should NOT be quoted because + this would break shell escaping used to invoke the command. + + -keypool= + Set key pool size to (default: 1000). Warning: Smaller sizes may + increase the risk of losing funds when restoring from an old + backup, if none of the addresses in the original keypool have + been used. + + -maxapsfee= + Spend up to this amount in additional (absolute) fees (in DASH) if it + allows the use of partial spend avoidance (default: 0.00) + + -rescan= + Rescan the block chain for missing wallet transactions on startup (1 = + start from wallet creation time, 2 = start from genesis block) + + -spendzeroconfchange + Spend unconfirmed change when sending transactions (default: 1) + + -wallet= + Specify wallet path to load at startup. Can be used multiple times to + load multiple wallets. Path is to a directory containing wallet + data and log files. If the path is not absolute, it is + interpreted relative to . This only loads existing + wallets and does not create new ones. For backwards compatibility + this also accepts names of existing top-level data files in + . + + -walletbackupsdir= + Specify full path to directory for automatic wallet backups (must exist) + + -walletbroadcast + Make the wallet broadcast transactions (default: 1) + + -walletdir= + Specify directory to hold wallets (default: /wallets if it + exists, otherwise ) + + -walletnotify= + Execute command when a wallet transaction changes. %s in cmd is replaced + by TxID and %w is replaced by wallet name. %w is not currently + implemented on windows. On systems where %w is supported, it + should NOT be quoted because this would break shell escaping used + to invoke the command. +``` + +### Wallet fee options + +```text + -discardfee= + The fee rate (in DASH/kB) that indicates your tolerance for discarding + change by adding it to the fee (default: 0.0001). Note: An output + is discarded if it is dust at this rate, but we will always + discard up to the dust relay fee and a discard fee above that is + limited by the fee estimate for the longest target + + -fallbackfee= + A fee rate (in DASH/kB) that will be used when fee estimation has + insufficient data. 0 to entirely disable the fallbackfee feature. + (default: 0.00001) + + -mintxfee= + Fee rates (in DASH/kB) smaller than this are considered zero fee for + transaction creation (default: 0.00001) + + -paytxfee= + Fee rate (in DASH/kB) to add to transactions you send (default: 0.00) + + -txconfirmtarget= + If paytxfee is not set, include enough fee so transactions begin + confirmation on average within n blocks (default: 6) +``` + +### HD wallet options + +```text + -hdseed= + User defined seed for HD wallet (should be in hex). Only has effect + during wallet creation/first start (default: randomly generated) + + -mnemonic= + User defined mnemonic for HD wallet (bip39). Only has effect during + wallet creation/first start (default: randomly generated) + + -mnemonicbits= + User defined mnemonic security for HD wallet in bits (BIP39). Only has + effect during wallet creation/first start (allowed values: 128, + 160, 192, 224, 256; default: 128) + + -mnemonicpassphrase= + User defined mnemonic passphrase for HD wallet (BIP39). Only has effect + during wallet creation/first start (default: empty string) + + -usehd + Use hierarchical deterministic key generation (HD) after BIP39/BIP44. + Only has effect during wallet creation/first start (default: 1) +``` + +### CoinJoin options + +```text + -coinjoinamount= + Target CoinJoin balance (2-21000000, default: 1000) + + -coinjoinautostart + Start CoinJoin automatically (0-1, default: 0) + + -coinjoindenomsgoal= + Try to create at least N inputs of each denominated amount (10-100000, + default: 50) + + -coinjoindenomshardcap= + Create up to N inputs of each denominated amount (10-100000, default: + 300) + + -coinjoinmultisession + Enable multiple CoinJoin mixing sessions per block, experimental (0-1, + default: 0) + + -coinjoinrounds= + Use N separate masternodes for each denominated input to mix funds + (2-16, default: 4) + + -coinjoinsessions= + Use N separate masternodes in parallel to mix funds (1-10, default: 4) + + -enablecoinjoin + Enable use of CoinJoin for funds stored in this wallet (0-1, default: 0) +``` + +### ZeroMQ notification options + +```text + -zmqpubhashblock=
+ Enable publish hash block in
+ + -zmqpubhashblockhwm= + Set publish hash block outbound message high water mark (default: 1000) + + -zmqpubhashchainlock=
+ Enable publish hash block (locked via ChainLocks) in
+ + -zmqpubhashchainlockhwm= + Set publish hash chain lock outbound message high water mark (default: + 1000) + + -zmqpubhashgovernanceobject=
+ Enable publish hash of governance objects (like proposals) in
+ + -zmqpubhashgovernanceobjecthwm= + Set publish hash governance object outbound message high water mark + (default: 1000) + + -zmqpubhashgovernancevote=
+ Enable publish hash of governance votes in
+ + -zmqpubhashgovernancevotehwm= + Set publish hash governance vote outbound message high water mark + (default: 1000) + + -zmqpubhashinstantsenddoublespend=
+ Enable publish transaction hashes of attempted InstantSend double spend + in
+ + -zmqpubhashinstantsenddoublespendhwm= + Set publish hash InstantSend double spend outbound message high water + mark (default: 1000) + + -zmqpubhashrecoveredsig=
+ Enable publish message hash of recovered signatures (recovered by LLMQs) + in
+ + -zmqpubhashrecoveredsighwm= + Set publish hash recovered signature outbound message high water mark + (default: 1000) + + -zmqpubhashtx=
+ Enable publish hash transaction in
+ + -zmqpubhashtxhwm= + Set publish hash transaction outbound message high water mark (default: + 1000) + + -zmqpubhashtxlock=
+ Enable publish hash transaction (locked via InstantSend) in
+ + -zmqpubhashtxlockhwm= + Set publish hash transaction lock outbound message high water mark + (default: 1000) + + -zmqpubrawblock=
+ Enable publish raw block in
+ + -zmqpubrawblockhwm= + Set publish raw block outbound message high water mark (default: 1000) + + -zmqpubrawchainlock=
+ Enable publish raw block (locked via ChainLocks) in
+ + -zmqpubrawchainlockhwm= + Set publish raw chain lock outbound message high water mark (default: + 1000) + + -zmqpubrawchainlocksig=
+ Enable publish raw block (locked via ChainLocks) and CLSIG message in +
+ + -zmqpubrawchainlocksighwm= + Set publish raw chain lock signature outbound message high water mark + (default: 1000) + + -zmqpubrawgovernanceobject=
+ Enable publish raw governance votes in
+ + -zmqpubrawgovernanceobjecthwm= + Set publish raw governance object outbound message high water mark + (default: 1000) + + -zmqpubrawgovernancevote=
+ Enable publish raw governance objects (like proposals) in
+ + -zmqpubrawgovernancevotehwm= + Set publish raw governance vote outbound message high water mark + (default: 1000) + + -zmqpubrawinstantsenddoublespend=
+ Enable publish raw transactions of attempted InstantSend double spend in +
+ + -zmqpubrawinstantsenddoublespendhwm= + Set publish raw InstantSend double spend outbound message high water + mark (default: 1000) + + -zmqpubrawrecoveredsig=
+ Enable publish raw recovered signatures (recovered by LLMQs) in +
+ + -zmqpubrawrecoveredsighwm= + Set publish raw recovered signature outbound message high water mark + (default: 1000) + + -zmqpubrawtx=
+ Enable publish raw transaction in
+ + -zmqpubrawtxhwm= + Set publish raw transaction outbound message high water mark (default: + 1000) + + -zmqpubrawtxlock=
+ Enable publish raw transaction (locked via InstantSend) in
+ + -zmqpubrawtxlockhwm= + Set publish raw transaction lock outbound message high water mark + (default: 1000) + + -zmqpubrawtxlocksig=
+ Enable publish raw transaction (locked via InstantSend) and ISLOCK in +
+ + -zmqpubrawtxlocksighwm= + Set publish raw transaction lock signature outbound message high water + mark (default: 1000) +``` + +### Debugging/Testing options + +```text + -addrmantest + Allows to test address relay on localhost + + -capturemessages + Capture all P2P messages to disk + + -checkaddrman= + Run addrman consistency checks every operations. Use 0 to disable. + (default: 0) + + -checkblockindex + Do a consistency check for the block tree, and occasionally. (default: + 0, regtest: 1) + + -checkblocks= + How many blocks to check at startup (default: 6, 0 = all) + + -checklevel= + How thorough the block verification of -checkblocks is: level 0 reads + the blocks from disk, level 1 verifies block validity, level 2 + verifies undo data, level 3 checks disconnection of tip blocks, + level 4 tries to reconnect the blocks, each level includes the + checks of the previous levels (0-4, default: 3) + + -checkmempool= + Run mempool consistency checks every transactions. Use 0 to disable. + (default: 0, regtest: 1) + + -checkpoints + Enable rejection of any forks from the known historical chain until + block 2109672 (default: 1) + + -debug= + Output debugging information (default: -nodebug, supplying is + optional). If is not supplied or if = 1, + output all debugging information. can be: addrman, + bench, chainlocks, cmpctblock, coindb, coinjoin, creditpool, ehf, + estimatefee, gobject, http, i2p, instantsend, leveldb, libevent, + llmq, llmq-dkg, llmq-sigs, lock, mempool, mempoolrej, mnpayments, + mnsync, net, netconn, proxy, prune, qt, rand, reindex, rpc, + selectcoins, spork, tor, validation, walletdb, zmq. This option + can be specified multiple times to output multiple categories. + + -debugexclude= + Exclude debugging information for a category. Can be used in conjunction + with -debug=1 to output debug logs for all categories except the + specified category. This option can be specified multiple times + to exclude multiple categories. + + -deprecatedrpc= + Allows deprecated RPC method(s) to be used + + -disablegovernance + Disable governance validation (0-1, default: 0) + + -fastprune + Use smaller block files and lower minimum prune height for testing + purposes + + -help-debug + Print help message with debugging options and exit + + -limitancestorcount= + Do not accept transactions if number of in-mempool ancestors is or + more (default: 25) + + -limitancestorsize= + Do not accept transactions whose size with all in-mempool ancestors + exceeds kilobytes (default: 101) + + -limitdescendantcount= + Do not accept transactions if any ancestor would have or more + in-mempool descendants (default: 25) + + -limitdescendantsize= + Do not accept transactions if any ancestor would have more than + kilobytes of in-mempool descendants (default: 101). + + -logips + Include IP addresses in debug output (default: 0) + + -logsourcelocations + Prepend debug output with name of the originating source location + (source file, line number and function name) (default: 0) + + -logthreadnames + Prepend debug output with name of the originating thread (only available + on platforms supporting thread_local) (default: 0) + + -logtimemicros + Add microsecond precision to debug timestamps (default: 0) + + -maxsigcachesize= + Limit sum of signature cache and script execution cache sizes to MiB + (default: 32) + + -maxtipage= + Maximum tip age in seconds to consider node in initial block download + (default: 21600) + + -maxtxfee= + Maximum total fees (in DASH) to use in a single wallet transaction; + setting this too low may abort large transactions (default: 0.10) + + -minsporkkeys= + Overrides minimum spork signers to change spork value. Only useful for + regtest and devnet. Using this on mainnet or testnet will ban + you. + + -mocktime= + Replace actual time with UNIX epoch time(default: 0) + + -printpriority + Log transaction fee per kB when mining blocks (default: 0) + + -printtoconsole + Send trace/debug info to console (default: 1 when no -daemon. To disable + logging to file, set -nodebuglogfile) + + -pushversion + Protocol version to report to other nodes + + -shrinkdebugfile + Shrink debug.log file on client startup (default: 1 when no -debug) + + -sporkaddr= + Override spork address. Only useful for regtest and devnet. Using this + on mainnet or testnet will ban you. + + -sporkkey= + Set the private key to be used for signing spork messages. + + -stopafterblockimport + Stop running after importing blocks from disk (default: 0) + + -stopatheight + Stop running after reaching the given height in the main chain (default: + 0) + + -uacomment= + Append comment to the user agent string + + -watchquorums= + Watch and validate quorum communication (default: 0) +``` + +### Chain selection options + +```text + -bip147height= + Override BIP147 activation height (regtest-only) + + -budgetparams=:: + Override masternode, budget and superblock start heights (regtest-only) + + -chain= + Use the chain (default: main). Allowed values: main, test, + regtest + + -devnet= + Use devnet chain with provided name + + -dip3params=: + Override DIP3 activation and enforcement heights (regtest-only) + + -dip8params= + Override DIP8 activation height (regtest-only) + + -highsubsidyblocks= + The number of blocks with a higher than normal subsidy to mine at the + start of a chain. Block after that height will have fixed subsidy + base. (default: 0, devnet-only) + + -highsubsidyfactor= + The factor to multiply the normal block subsidy by while in the + highsubsidyblocks window of a chain (default: 1, devnet-only) + + -llmqchainlocks= + Override the default LLMQ type used for ChainLocks. Allows using + ChainLocks with smaller LLMQs. (default: llmq_devnet, + devnet-only) + + -llmqdevnetparams=: + Override the default LLMQ size for the LLMQ_DEVNET quorum (devnet-only) + + -llmqinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. (default: + llmq_devnet_dip0024, devnet-only) + + -llmqmnhf= + Override the default LLMQ type used for EHF. (default: llmq_devnet, + devnet-only) + + -llmqplatform= + Override the default LLMQ type used for Platform. (default: + llmq_devnet_platform, devnet-only) + + -llmqtestinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. Used mainly + to test Platform. (default: llmq_test_dip0024, regtest-only) + + -llmqtestinstantsendparams=: + Override the default LLMQ size for the LLMQ_TEST_INSTANTSEND quorums + (default: 3:2, regtest-only) + + -llmqtestparams=: + Override the default LLMQ size for the LLMQ_TEST quorum (default: 3:2, + regtest-only) + + -minimumdifficultyblocks= + The number of blocks that can be mined with the minimum difficulty at + the start of a chain (default: 0, devnet-only) + + -powtargetspacing= + Override the default PowTargetSpacing value in seconds (default: 2.5 + minutes, devnet-only) + + -regtest + Enter regression test mode, which uses a special chain in which blocks + can be solved instantly. This is intended for regression testing + tools and app development. Equivalent to -chain=regtest + + -testnet + Use the test chain. Equivalent to -chain=test + + -vbparams=::(:min_activation_height(::(:::))) + Use given start/end times and min_activation_height for specified + version bits deployment (regtest-only). Specifying window, + threshold/thresholdstart, thresholdmin, falloffcoeff and + mnactivation is optional. +``` + +### Masternode options + +```text + -llmq-data-recovery= + Enable automated quorum data recovery (default: 1) + + -llmq-qvvec-sync=: + Defines from which LLMQ type the masternode should sync quorum + verification vectors. Can be used multiple times with different + LLMQ types. : 0 (sync always from all quorums of the type + defined by ), 1 (sync from all quorums of the type + defined by if a member of any of the quorums) + + -masternodeblsprivkey= + Set the masternode BLS private key and enable the client to act as a + masternode + + -platform-user= + Set the username for the "platform user", a restricted user intended to + be used by Dash Platform, to the specified username. +``` + +### Node relay options + +```text + -acceptnonstdtxn + Relay and mine "non-standard" transactions (testnet/regtest only; + default: 1) + + -bytespersigop + Equivalent bytes per sigop in transactions for relay and mining + (default: 20) + + -datacarrier + Relay and mine data carrier transactions (default: 1) + + -datacarriersize + Maximum size of data in data carrier transactions we relay and mine + (default: 83) + + -dustrelayfee= + Fee rate (in DASH/kB) used to define dust, the value of an output such + that it will cost more than its value in fees at this fee rate to + spend it. (default: 0.00003) + + -incrementalrelayfee= + Fee rate (in DASH/kB) used to define cost of relay, used for mempool + limiting and BIP 125 replacement. (default: 0.00001) + + -minrelaytxfee= + Fees (in DASH/kB) smaller than this are considered zero fee for + relaying, mining and transaction creation (default: 0.00001) + + -whitelistforcerelay + Add 'forcerelay' permission to whitelisted inbound peers with default + permissions. This will relay transactions even if the + transactions were already in the mempool. (default: 0) + + -whitelistrelay + Add 'relay' permission to whitelisted inbound peers with default + permissions. This will accept relayed transactions even when not + relaying transactions (default: 1) +``` + +### Block creation options + +```text + -blockmaxsize= + Set maximum block size in bytes (default: 2000000) + + -blockmintxfee= + Set lowest fee rate (in DASH/kB) for transactions to be included in + block creation. (default: 0.00001) + + -blockversion= + Override block version to test forking scenarios +``` + +### RPC server options + +```text + -rest + Accept public REST requests (default: 0) + + -rpcallowip= + Allow JSON-RPC connections from specified source. Valid for are a + single IP (e.g. 1.2.3.4), a network/netmask (e.g. + 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This + option can be specified multiple times + + -rpcauth= + Username and HMAC-SHA-256 hashed password for JSON-RPC connections. The + field comes in the format: :$. A + canonical python script is included in share/rpcuser. The client + then connects normally using the + rpcuser=/rpcpassword= pair of arguments. This + option can be specified multiple times + + -rpcbind=[:port] + Bind to given address to listen for JSON-RPC connections. Do not expose + the RPC server to untrusted networks such as the public internet! + This option is ignored unless -rpcallowip is also passed. Port is + optional and overrides -rpcport. Use [host]:port notation for + IPv6. This option can be specified multiple times (default: + 127.0.0.1 and ::1 i.e., localhost, or if -rpcallowip has been + specified, 0.0.0.0 and :: i.e., all addresses) + + -rpccookiefile= + Location of the auth cookie. Relative paths will be prefixed by a + net-specific datadir location. (default: data dir) + + -rpcexternaluser= + List of comma-separated usernames for JSON-RPC external connections + + -rpcexternalworkqueue= + Set the depth of the work queue to service external RPC calls (default: + 16) + + -rpcpassword= + Password for JSON-RPC connections + + -rpcport= + Listen for JSON-RPC connections on (default: 9998, testnet: + 19998, regtest: 19898) + + -rpcservertimeout= + Timeout during HTTP requests (default: 30) + + -rpcthreads= + Set the number of threads to service RPC calls (default: 4) + + -rpcuser= + Username for JSON-RPC connections + + -rpcwhitelist= + Set a whitelist to filter incoming RPC calls for a specific user. The + field comes in the format: :,,...,. If multiple whitelists are set for a given user, + they are set-intersected. See -rpcwhitelistdefault documentation + for information on default whitelist behavior. + + -rpcwhitelistdefault + Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault + is set to 0, if any -rpcwhitelist is set, the rpc server acts as + if all rpc users are subject to empty-unless-otherwise-specified + whitelists. If rpcwhitelistdefault is set to 1 and no + -rpcwhitelist is set, rpc server acts as if all rpc users are + subject to empty whitelists. + + -rpcworkqueue= + Set the depth of the work queue to service RPC calls (default: 16) + + -server + Accept command line and JSON-RPC commands +``` + +### Statsd options + +```text + -statsenabled + Publish internal stats to statsd (default: 0) + + -statshost= + Specify statsd host (default: 127.0.0.1) + + -statshostname= + Specify statsd host name (default: ) + + -statsns= + Specify additional namespace prefix (default: ) + + -statsperiod= + Specify the number of seconds between periodic measurements (default: + 60) + + -statsport= + Specify statsd port (default: 8125) +``` + +### Wallet debugging/testing options + +:::{attention} +These options are normally hidden and will only be shown if using the help debug option: `dashd --held -help-debug` +::: + +```text + -dblogsize= + Flush wallet database activity from memory to disk log every + megabytes (default: 100) + + -flushwallet + Run a thread to flush wallet periodically (default: 1) + + -privdb + Sets the DB_PRIVATE flag in the wallet db environment (default: 1) + + -unsafesqlitesync + Set SQLite synchronous=OFF to disable waiting for the database to sync + to disk. This is unsafe and can cause data loss and corruption. + This option is only used by tests to improve their performance + (default: false) + + -walletrejectlongchains + Wallet will not create transactions that violate mempool chain limits + (default: 0) +``` + +## Network Dependent Options + +The following options can only be used for specific network types. These options are provided support development (devnet) and regression test (regtest) networks. + +### Devnet Options + +```text + -highsubsidyblocks= + The number of blocks with a higher than normal subsidy to mine at the + start of a chain. Block after that height will have fixed subsidy + base. (default: 0, devnet-only) + + -highsubsidyfactor= + The factor to multiply the normal block subsidy by while in the + highsubsidyblocks window of a chain (default: 1, devnet-only) + + -llmqchainlocks= + Override the default LLMQ type used for ChainLocks. Allows using + ChainLocks with smaller LLMQs. (default: llmq_devnet, + devnet-only) + + -llmqdevnetparams=: + Override the default LLMQ size for the LLMQ_DEVNET quorum (default: 3:2, + devnet-only) + + -llmqinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. (default: + llmq_devnet_dip0024, devnet-only) + + -llmqmnhf= + Override the default LLMQ type used for EHF. (default: llmq_devnet, + devnet-only) + + -llmqplatform= + Override the default LLMQ type used for Platform. (default: + llmq_devnet_platform, devnet-only) + + -minimumdifficultyblocks= + The number of blocks that can be mined with the minimum difficulty at + the start of a chain (default: 0, devnet-only) + + -powtargetspacing= + Override the default PowTargetSpacing value in seconds (default: 2.5 + minutes, devnet-only) +``` + +The quorum names used in these options are: + +| LLMQ Type | LLMQ Name | +| :-------: | --------------------- | +| 1 | llmq50_60 | +| 2 | llmq400_60 | +| 3 | llmq400_85 | +| 4 | llmq100_67 | +| 5 | llmq60_75 | +| 6 | llmq25_67 | +| 100 | llmq_test | +| 101 | llmq_devnet | +| 102 | llmq_test_v17 | +| 103 | llmq_test_dip0024 | +| 104 | llqm_test_instantsend | +| 105 | llmq_devnet_dip0024 | +| 106 | llmq_test_platform | +| 107 | llmq_devnet_platform | + +Refer to [this table in DIP-6 - LLMQs](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) for details on each quorum type. + +### Regtest Options + +```text + -budgetparams=:: + Override masternode, budget and superblock start heights (regtest-only) + + -llmqtestinstantsenddip0024= + Override the default LLMQ type used for InstantSendDIP0024. Used mainly + to test Platform. (default: llmq_test_dip0024, regtest-only) + + -llmqtestinstantsendparams=: + Override the default LLMQ size for the LLMQ_TEST_INSTANTSEND quorums + (default: 3:2, regtest-only) + + -llmqtestparams=: + Override the default LLMQ size for the LLMQ_TEST quorum (default: 3:2, + regtest-only) + + -vbparams=::(::(:::)) + Use given start/end times for specified version bits deployment + (regtest-only). Specifying window, threshold/thresholdstart, + thresholdmin, falloffcoeff and mnactivation is optional. +``` diff --git a/docs/core/dashcore/wallet-arguments-and-commands.md b/docs/core/dashcore/wallet-arguments-and-commands.md new file mode 100644 index 000000000..c2d7d11a6 --- /dev/null +++ b/docs/core/dashcore/wallet-arguments-and-commands.md @@ -0,0 +1,97 @@ +```{eval-rst} +.. _dashcore-arguments-and-commands: +.. meta:: + :title: Dash Core Arguments and Commands + :description: Overview of arguments and commands for the components distributed with Dash Core, including dashd, dash-qt, and dash-cli. +``` + +# Arguments and Commands + +## Overview + +All command-line options (except for `-conf`) may be specified in a configuration file, and all configuration file options may also be specified on the command line. Command-line options override values set in the configuration file. The configuration file is a list of `=` pairs, one per line, with optional comments starting with the `#` character. + +The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, dash-qt (or dashd) will look for a file named `dash.conf` in the Dash data directory, but both the data directory and the configuration file path may be changed using the `-datadir` and `-conf` command-line arguments. + +| Platform | Path to data folder | Typical path to configuration file | +| - | - | - | +| Linux | ~/ | /home/username/.dashcore/dash.conf | +| macOS | ~/Library/Application Support/ | /Users/username/Library/Application Support/DashCore/dash.conf | +| Windows | %APPDATA% | _(Vista-10)_ C:\\Users\\username\\AppData\\Roaming\\DashCore\\dash.conf | +| Windows | %APPDATA% | _(2000-XP)_ C:\\Documents and Settings\\username\\Application Data\\DashCore\\dash.conf | + +:::{note} +If running Dash in testnet mode, the sub-folder `testnet3` will be appended to the data directory automatically. Likewise, if running in devnet mode, the subfolder `devnet-"devnet name"` will be appended to the data directory. +::: + +## Command Line Arguments + +The following sections provide details of the command line arguments for each of the five components distributed in Dash Core releases. + +| Component | Description | +| - | - | +| dashd | Dash Core daemon | +| dash-qt | Dash Core wallet GUI | +| dash-cli | Dash Core RPC Client | +| dash-tx | Dash Core transaction utility | +| dash-wallet | Dash Core wallet utility | + +### dashd + +View all [command line options for dashd](../dashcore/wallet-arguments-and-commands-dashd.md). + +```bash +Usage: + dashd [options] Start Dash Core Daemon +``` + +### dash-qt + + View all [command line options for dash-qt](../dashcore/wallet-arguments-and-commands-dash-qt.md). + +```bash +Usage: + dash-qt [command-line options] +``` + +### dash-cli + +View all [command line options for dash-cli](../dashcore/wallet-arguments-and-commands-dash-cli.md). + +```bash +Usage: + dash-cli [options] [params] Send command to Dash Core + dash-cli [options] -named [name=value] ... Send command to Dash Core (with named arguments) + dash-cli [options] help List commands + dash-cli [options] help Get help for a command +``` + +### dash-tx + +View all [command line options for dash-tx](../dashcore/wallet-arguments-and-commands-dash-tx.md). + +```bash +Usage: + dash-tx [options] [commands] Update hex-encoded dash transaction + dash-tx [options] -create [commands] Create hex-encoded dash transaction +``` + +### dash-wallet + +View all [command line options for dash-wallet](../dashcore/wallet-arguments-and-commands-dash-wallet.md). + +```bash +Usage: + dash-wallet [options] +``` + +```{toctree} +:maxdepth: 2 +:titlesonly: + +wallet-arguments-and-commands-dashd +wallet-arguments-and-commands-dash-qt +wallet-arguments-and-commands-dash-cli +wallet-arguments-and-commands-dash-tx +wallet-arguments-and-commands-dash-wallet +``` diff --git a/docs/core/dashcore/wallet-configuration-file.md b/docs/core/dashcore/wallet-configuration-file.md new file mode 100644 index 000000000..311942609 --- /dev/null +++ b/docs/core/dashcore/wallet-configuration-file.md @@ -0,0 +1,100 @@ +```{eval-rst} +.. meta:: + :title: Dash Core Configuration Files + :description: Details about the configuration files needed to run dashd and dash-cli, including dash.conf and settings.json. +``` + +# Configuration Files + +## dash.conf + +To use `dashd` and `dash-cli`, you will need to add a RPC password to your `dash.conf` file. Both programs will read from the same file if both run on the same system as the same user, so any long random password will work: + +``` text +rpcpassword=change_this_to_a_long_random_password +``` + +You should also make the `dash.conf` file only readable to its owner. On Linux, Mac OSX, and other Unix-like systems, this can be accomplished by running the following command in the Dash Core application directory: + +``` text +chmod 0600 dash.conf +``` + +For development, it's safer and cheaper to use Dash's test network ([testnet](../resources/glossary.md#testnet)), [regression test mode](../resources/glossary.md#regression-test-mode) (regtest), or a developer network ([devnet](../resources/glossary.md#devnet)) described below. + +Questions about Dash use are best sent to the [Dash forum](https://www.dash.org/forum/categories/dash-support.61/) and [Discord channels](http://www.dashchat.org). + +### Example Testnet Config + +```text +testnet=1 + +# RPC Settings +rpcuser=user +rpcpassword=pass +rpcallowip=127.0.0.1 +#---- +listen=1 +server=1 + +# Index Settings +txindex=1 +addressindex=1 +timestampindex=1 +spentindex=1 + +[test] +rpcport=19998 +``` + +### Configuration sections for different networks + +Since Dash Core 0.16 it is possible for a single configuration file to set different options for different networks. This is done by using sections or by prefixing the option with the network as shown below: + +:::{attention} +Please note that the only valid section names are **`[main]`**, **`[test]`**, **`[regtest]`**, and **`[devnet]`**. +::: + +``` text Example dash.conf +# Enable RPC server for all networks +server=1 + +[main] +# Set custom mainnet ports +port=9989 +rpcport=9988 +# Set custom mainnet RPC auth +rpcuser=mainnetuser +rpcpassword=mainnetpass + +[test] +# Set custom testnet RPC auth +rpcuser=testnetuser +rpcpassword=testnetpass + +# Enabling indexing +txindex=1 +addressindex=1 +timestampindex=1 +spentindex=1 + +[regtest] +mempoolsize=20 + +[devnet] +port=21999 +rpcport=21998 +``` + +With this configuration file, dashd, dash-qt, or dash-cli can be run with the `-conf=` along with the `-testnet`, `-regtest`, or `-devnet=` parameter to select the correct settings. + +:::{attention} +The following options will only apply to mainnet **_unless they are in a section_** (e.g., `[test]`): `addnode=`, `connect=`, `port=`, `bind=`, `rpcport=`, `rpcbind=` and `wallet=`. +The options to choose a network (`regtest=` and `testnet=`) must be specified outside of sections. +::: + +## settings.json + +Since Dash Core 18.1, wallets created or loaded in the GUI will now be automatically loaded on startup so they don't need to be manually reloaded the next time Dash is started. The list of wallets to load on startup is stored in `\/settings.json`. Additionally, any wallets specified in `-wallet=` settings on the command line or in the `dash.conf` file are also loaded. Wallets that are unloaded in the GUI are also removed from the settings list so they won't automatically load on the next startup. + +The `createwallet`, `loadwallet`, and `unloadwallet` RPCs now accept `load_on_startup` options to modify the settings list. Unless these options are explicitly set to true or false, the list is not modified, so the RPC methods remain backwards compatible. diff --git a/docs/core/dips/README.md b/docs/core/dips/README.md new file mode 100644 index 000000000..432838da1 --- /dev/null +++ b/docs/core/dips/README.md @@ -0,0 +1,48 @@ +# Dash Improvement Proposals (DIPs) + +DIP stands for Dash Improvement Proposal. Similar to Bitcoin's [BIPs](https://github.com/bitcoin/bips/), a DIP is a design document providing information to the Dash community, or describing a new feature for Dash or its processes or environment. The DIP should provide a concise technical specification of the feature and a rationale for the feature. + +Because Dash is forked from the Bitcoin codebase, many of the BIPs can be applied to Dash as well (a list of the BIPs updated to include Dash-specific details can be found [here](https://github.com/dashevo/bips)). The purpose of the DIPs is not to duplicate those which exist as BIPs, but to introduce protocol upgrades or feature specifications which are unique to Dash. + +## Contributions + +We use the same general guidelines for introducing a new DIP as specified in [BIP 2](https://github.com/bitcoin/bips/blob/master/bip-0002.mediawiki), with a few differences. Specifically: + +* Instead of the BIP editor, initiate contact with the Dash Core development team and your request should be routed to the DIP editor(s). The DIP workflow mimics the BIP workflow. +* Recommended licenses include the MIT license +* Markdown format is the preferred format for DIPs +* Following a discussion, the proposal should be submitted to the DIPs git repository as a pull request. This draft must be written in BIP/DIP style as described in [BIP 2](https://github.com/bitcoin/bips/blob/master/bip-0002.mediawiki), and named with an alias such as "dip-johndoe-infinitedash" until the editor has assigned it a DIP number (authors MUST NOT self-assign DIP numbers). + +## Dash Improvement Proposal Summary + +Number | Layer | Title | Owner | Type | Status +--- | --- | --- | --- | --- | --- +[1](dip-0001.md) | Consensus | Initial Scaling of the Network | Darren Tapp | Standard | Final +[2](dip-0002.md) | Consensus | Special Transactions | Samuel Westrich, Alexander Block, Andy Freer | Standard | Final +[3](dip-0003.md) | Consensus | Deterministic Masternode Lists | Samuel Westrich, Alexander Block, Andy Freer, Darren Tapp, Timothy Flynn, Udjinm6, Will Wray | Standard | Final +[4](dip-0004.md) | Consensus | Simplified Verification of Deterministic Masternode Lists | Alexander Block, Samuel Westrich, UdjinM6, Andy Freer | Standard | Final +[5](dip-0005.md) | Consensus | Blockchain Users | Alexander Block, Cofresi, Andy Freer, Nathan Marley, Anton Suprunchuk, Darren Tapp, Thephez, Udjinm6, Alex Werner, Samuel Westrich | Standard | Withdrawn +[6](dip-0006.md) | Consensus | Long-Living Masternode Quorums | Alexander Block | Standard | Final +[7](dip-0007.md) | Consensus | LLMQ Signing Requests / Sessions | Alexander Block | Standard | Final +[8](dip-0008.md) | Consensus | ChainLocks | Alexander Block | Standard | Final +[9](dip-0009.md) | Applications | Feature Derivation Paths | Samuel Westrich | Informational | Proposed +[10](dip-0010.md) | Consensus | LLMQ InstantSend | Alexander Block | Standard | Final +[11](dip-0011.md) | Consensus | Identities | Ivan Shumkov, Anton Suprunchuk, Samuel Westrich, Cofresi | Standard | Proposed +[12](dip-0012.md) | Consensus | Dash Platform Name Service | Ivan Shumkov, Anton Suprunchuk | Standard | Proposed +[13](dip-0013.md) | Applications | Identities in Hierarchical Deterministic Wallets | Samuel Westrich | Informational | Proposed +[14](dip-0014.md) | Applications | Extended Key Derivation using 256-Bit Unsigned Integers | Samuel Westrich | Informational | Proposed +[15](dip-0015.md) | Applications | DashPay | Samuel Westrich, Eric Britten | Standard | Proposed +[16](dip-0016.md) | Applications | Headers First Synchronization on Simple Payment Verification Wallets | Samuel Westrich | Informational | Proposed +[20](dip-0020.md) | Consensus | Dash Opcode Updates | Mart Mangus | Standard | Final +[21](dip-0021.md) | Consensus | LLMQ DKG Data Sharing | dustinface | Standard | Final +[22](dip-0022.md) | Consensus | Making InstantSend Deterministic using Quorum Cycles | Samuel Westrich, UdjinM6 | Standard | Proposed +[23](dip-0023.md) | Consensus | Enhanced Hard Fork Mechanism | Pasta | Standard | Proposed +[24](dip-0024.md) | Consensus | Long-Living Masternode Quorum Distribution and Rotation | Samuel Westrich & Virgile Bartolo | Standard | Proposed +[25](dip-0025.md) | Peer Services | Compressed Block Headers | gabriel-bjg, Thephez, UdjinM6 | Standard | Proposed +[26](dip-0026.md) | Consensus | Multi-Party Payout | Timothy Munsell, UdjinM6 | Standard | Proposed +27 | | | | | Reserved +[28](dip-0028.md) | Consensus | High-Performance Masternodes | Paul DeLucia, Odysseas Gabrielides, Łukasz Klimek, Ivan Shumkov, Samuel Westrich | Standard | Proposed + +## License + +Unless otherwise specified, Dash Improvement Proposals (DIPs) are released under the terms of the MIT license. See [LICENSE](LICENSE) for more information or see the [MIT License](https://opensource.org/licenses/MIT). diff --git a/docs/core/examples/configuration-file.md b/docs/core/examples/configuration-file.md new file mode 100644 index 000000000..1f3bcbb78 --- /dev/null +++ b/docs/core/examples/configuration-file.md @@ -0,0 +1,33 @@ +```{eval-rst} +.. meta:: + :title: Configuration File + :description: The DashCore configuration file, dash.conf, stores settings for Dash programs, including the RPC password required for dashd and dash-cli. +``` + +# Configuration File + +All three programs get settings from `dash.conf` in the `DashCore` application directory: + +* Windows: `%APPDATA%\DashCore\` + +* OSX: `$HOME/Library/Application Support/DashCore/` + +* Linux: `$HOME/.dashcore/` + +To use `dashd` and `dash-cli`, you will need to add a RPC password to your `dash.conf` file. Both programs will read from the same file if both run on the same system as the same user, so any long random password will work: + +``` text +rpcpassword=change_this_to_a_long_random_password +``` + +You should also make the `dash.conf` file only readable to its owner. On Linux, Mac OSX, and other Unix-like systems, this can be accomplished by running the following command in the Dash Core application directory: + +``` text +chmod 0600 dash.conf +``` + +For development, it's safer and cheaper to use Dash's test network ([testnet](../resources/glossary.md#testnet)), [regression test mode](../resources/glossary.md#regression-test-mode) (regtest), or a developer network ([devnet](../resources/glossary.md#devnet)) described below. + +Questions about Dash use are best sent to the [Dash forum](https://www.dash.org/forum/categories/dash-support.61/) and [Discord channels](http://www.dashchat.org). + +In the following documentation, some strings have been shortened or wrapped: "[...]" indicates extra data was removed, and lines ending in a single backslash "\\" are continued below. If you hover over a cross-reference link, a brief definition of the term will be displayed. diff --git a/docs/core/examples/introduction.md b/docs/core/examples/introduction.md new file mode 100644 index 000000000..39e3185d2 --- /dev/null +++ b/docs/core/examples/introduction.md @@ -0,0 +1,18 @@ +```{eval-rst} +.. _examples-index: +.. meta:: + :title: Dash Core Examples Introduction + :description: The following guide aims to provide examples to help you start building Dash-based applications. +``` + +# Introduction + +The following guide aims to provide examples to help you start building Dash-based applications. To make the best use of this document, you may want to install the current version of Dash Core, either from [source](https://github.com/dashpay/dash/) or from a [pre-compiled executable](https://www.dash.org/wallets/#wallets). + +Once installed, you'll have access to three programs: `dashd`, `dash-qt`, and `dash-cli`. + +* `dash-qt` provides a combination full Dash [peer](../resources/glossary.md#peer) and [wallet](../resources/glossary.md#wallet) frontend. From the Help menu, you can access a console where you can enter the RPC commands used throughout this document. + +* `dashd` is more useful for programming: it provides a full peer which you can interact with through RPCs to port 9998 (or 19998 for [testnet](../resources/glossary.md#testnet) / 19898 for regtest). + +* `dash-cli` allows you to send RPC commands to `dashd` from the command line. For example, `dash-cli help` diff --git a/docs/core/examples/p2p-network-bloom-filter-script.md b/docs/core/examples/p2p-network-bloom-filter-script.md new file mode 100644 index 000000000..4fea6b9d8 --- /dev/null +++ b/docs/core/examples/p2p-network-bloom-filter-script.md @@ -0,0 +1,117 @@ +```{eval-rst} +.. meta:: + :title: Bloom Filter Script + :description: Code which demonstrates the bloom filter script. +``` + +# Bloom Filter Script + +Complete Python script demonstrating the [Creating](../examples/p2p-network-creating-a-bloom-filter.md)/[Evaluating](../examples/p2p-network-evaluating-a-bloom-filter.md) bloom filter ([view as a GitHub Gist](https://gist.github.com/dash-docs/5d63f095352a717f90d41a5e7fbbdac1#file-bloom_filter_example-py)): + +``` python +#!/usr/bin/env python +from math import log +from bitarray import bitarray # from pypi.python.org/pypi/bitarray +import pyhash # from https://github.com/flier/pyfasthash + +# Based on BIP-37 +# https://github.com/QuantumExplorer/bips/blob/master/bip-0037.mediawiki + +# Defined in bloom.h +# https://github.com/dashpay/dash/blob/master/src/bloom.h#L19-#L20 +MAX_BLOOM_FILTER_SIZE = 36000 +MAX_HASH_FUNCS = 50 + +# Set of flags that control how matched items are added to the filter (per BIP-37) +# https://github.com/dashpay/dash/blob/master/src/bloom.h#L26 +nFlags = 0 + +nElements = 1 # Number of elements +nFPRate = 0.0001 # False positive rate + +nFilterBytes = int(min((-1 / log(2)**2 * nElements * log(nFPRate)) / 8, MAX_BLOOM_FILTER_SIZE)) + +# Calculate the number of hash functions to use in the filter +# Limit the maximum number to 50 per BIP-37 +nHashFuncs = int(min(nFilterBytes * 8 / nElements * log(2), MAX_HASH_FUNCS)) + +murmur3 = pyhash.murmur3_32() + +TEST_TXID = "019f5b01d4195ecbc9398fbf3c3b1fa9bb3183301d7a1fb3bd174fcfa40a2b65" + +def bloom_hash(nHashNum, data): + seed = (nHashNum * 0xfba4c795 + nTweak) & 0xffffffff + return( murmur3(data, seed=seed) % (nFilterBytes * 8) ) + + +# Bloom Filter creation +def create_filter(nTweak): + print('Creating bloom filter') + vData = nFilterBytes * 8 * bitarray('0', endian="little") + + data_to_hash = TEST_TXID + data_to_hash = data_to_hash.decode("hex") + + print('Filter bytes: {}; Hash functions: {}'.format(nFilterBytes, nHashFuncs)) + + print(" Filter (As Bits)") + print("nHashNum nIndex Filter 0123456789abcdef") + print("~~~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~") + for nHashNum in range(nHashFuncs): + nIndex = bloom_hash(nHashNum, data_to_hash) + + ## Set the bit at nIndex to 1 + vData[nIndex] = True + + ## Debug: print current state + print(' {0:2} {1:2} {2} {3}'.format( + nHashNum, + hex(int(nIndex)), + vData.tobytes().encode("hex"), + vData.to01() + )) + + print('Bloom filter: {}\n'.format(vData.tobytes().encode("hex"))) + + +# Bloom Filter evaluation +def evaluate_filter(): + print('Evaluating bloom filter') + vData = bitarray(endian='little') + vData.frombytes("b50f".decode("hex")) + nHashFuncs = 11 + nTweak = 0 + nFlags = 0 + + def contains(nHashFuncs, data_to_hash): + for nHashNum in range(nHashFuncs): + ## bloom_hash as defined in previous section + nIndex = bloom_hash(nHashNum, data_to_hash) + + if vData[nIndex] != True: + print("MATCH FAILURE: Index {0} not set in {1}\n".format( + hex(int(nIndex)), + vData.to01() + )) + return False + print("MATCH SUCCESS\n") + + ## Test 1: Same TXID as previously added to filter + data_to_hash = TEST_TXID + print('\nChecking: {}'.format(data_to_hash)) + data_to_hash = data_to_hash.decode("hex") + contains(nHashFuncs, data_to_hash) + + ## Test 2: Arbitrary string + data_to_hash = "1/10,000 chance this ASCII string will match" + print('Checking: {}'.format(data_to_hash)) + contains(nHashFuncs, data_to_hash) + + +# Tweak is a random value added to the seed value in the hash function +# used by the bloom filter +nTweak = 0 + +create_filter(nTweak) +evaluate_filter() +``` diff --git a/docs/core/examples/p2p-network-creating-a-bloom-filter.md b/docs/core/examples/p2p-network-creating-a-bloom-filter.md new file mode 100644 index 000000000..858962c3e --- /dev/null +++ b/docs/core/examples/p2p-network-creating-a-bloom-filter.md @@ -0,0 +1,122 @@ +```{eval-rst} +.. meta:: + :title: Creating a Bloom Filter + :description: Demonstrates how to create a bloom filter using Python and represent it in a filterload message. +``` + +# Creating a Bloom Filter + +In this section, we'll use variable names that correspond to the field names in the [`filterload` message documentation](../reference/p2p-network-control-messages.md#filterload). Each code block precedes the paragraph describing it. + +``` python +#!/usr/bin/env python + +BYTES_MAX = 36000 +FUNCS_MAX = 50 + +nFlags = 0 +``` + +We start by setting some maximum values defined in [BIP37](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki): the maximum number of bytes allowed in a filter and the maximum number of hash functions used to hash each piece of data. We also set nFlags to zero, indicating we don't want the remote node to update the filter for us. (We won't use nFlags again in the sample program, but real programs will need to use it.) + +``` python +n = 1 +p = 0.0001 +``` + +We define the number (n) of elements we plan to insert into the filter and the false positive rate (p) we want to help protect our privacy. For this example, we will set *n* to one element and *p* to a rate of 1-in-10,000 to produce a small and precise filter for illustration purposes. In actual use, your filters will probably be much larger. + +``` python +from math import log +nFilterBytes = int(min((-1 / log(2)**2 * n * log(p)) / 8, BYTES_MAX)) +nHashFuncs = int(min(nFilterBytes * 8 / n * log(2), FUNCS_MAX)) + +from bitarray import bitarray # from pypi.python.org/pypi/bitarray +vData = nFilterBytes * 8 * bitarray('0', endian="little") +``` + +Using the formula described in [BIP37](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki), we calculate the ideal size of the filter (in bytes) and the ideal number of hash functions to use. Both are truncated down to the nearest whole number and both are also constrained to the maximum values we defined earlier. The results of this particular fixed computation are 2 filter bytes and 11 hash functions. We then use *nFilterBytes* to create a little-endian bit array of the appropriate size. + +``` python +nTweak = 0 +``` + +We also should choose a value for *nTweak*. In this case, we'll simply use zero. + +``` python +import pyhash # from https://github.com/flier/pyfasthash +murmur3 = pyhash.murmur3_32() + +def bloom_hash(nHashNum, data): + seed = (nHashNum * 0xfba4c795 + nTweak) & 0xffffffff + return( murmur3(data, seed=seed) % (nFilterBytes * 8) ) +``` + +We setup our hash function template using the formula and 0xfba4c795 constant set in [BIP37](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki). Note that we limit the size of the seed to four bytes and that we're returning the result of the hash modulo the size of the filter in bits. + +``` python +data_to_hash = "019f5b01d4195ecbc9398fbf3c3b1fa9" \ + + "bb3183301d7a1fb3bd174fcfa40a2b65" +data_to_hash = data_to_hash.decode("hex") +``` + +For the data to add to the filter, we're adding a [TXID](../resources/glossary.md#transaction-identifiers). Note that the TXID is in [internal byte order](../resources/glossary.md#internal-byte-order). + +``` python +print " Filter (As Bits)" +print "nHashNum nIndex Filter 0123456789abcdef" +print "~~~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~" +for nHashNum in range(nHashFuncs): + nIndex = bloom_hash(nHashNum, data_to_hash) + + ## Set the bit at nIndex to 1 + vData[nIndex] = True + + ## Debug: print current state + print ' {0:2} {1:2} {2} {3}'.format( + nHashNum, + hex(int(nIndex)), + vData.tobytes().encode("hex"), + vData.to01() + ) + +print +print "Bloom filter:", vData.tobytes().encode("hex") +``` + +Now we use the hash function template to run a slightly different hash function for *nHashFuncs* times. The result of each function being run on the transaction is used as an index number: the bit at that index is set to 1. We can see this in the printed debugging output: + +``` text + Filter (As Bits) +nHashNum nIndex Filter 0123456789abcdef +~~~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~ + 0 0x7 8000 0000000100000000 + 1 0x9 8002 0000000101000000 + 2 0xa 8006 0000000101100000 + 3 0x2 8406 0010000101100000 + 4 0xb 840e 0010000101110000 + 5 0x5 a40e 0010010101110000 + 6 0x0 a50e 1010010101110000 + 7 0x8 a50f 1010010111110000 + 8 0x5 a50f 1010010111110000 + 9 0x8 a50f 1010010111110000 + 10 0x4 b50f 1010110111110000 + +Bloom filter: b50f +``` + +Notice that in iterations 8 and 9, the filter did not change because the corresponding bit was already set in a previous iteration (5 and 7, respectively). This is a normal part of [bloom filter](../resources/glossary.md#bloom-filter) operation. + +We only added one element to the filter above, but we could repeat the process with additional elements and continue to add them to the same filter. (To maintain the same false-positive rate, you would need a larger filter size as computed earlier.) + +Note: for a more optimized Python implementation with fewer external dependencies, see [python-bitcoinlib's](https://github.com/petertodd/python-bitcoinlib) bloom filter module which is based directly on Bitcoin Core's C++ implementation. + +Using the [`filterload` message](../reference/p2p-network-control-messages.md#filterload) format, the complete filter created above would be the binary form of the annotated hexdump shown below: + +``` text +02 ......... Filter bytes: 2 +b50f ....... Filter: 1010 1101 1111 0000 +0b000000 ... nHashFuncs: 11 +00000000 ... nTweak: 0/none +00 ......... nFlags: BLOOM_UPDATE_NONE +``` diff --git a/docs/core/examples/p2p-network-evaluating-a-bloom-filter.md b/docs/core/examples/p2p-network-evaluating-a-bloom-filter.md new file mode 100644 index 000000000..ae8060c21 --- /dev/null +++ b/docs/core/examples/p2p-network-evaluating-a-bloom-filter.md @@ -0,0 +1,57 @@ +```{eval-rst} +.. meta:: + :title: Evaluating a Bloom Filter + :description: Demonstrates how to check if a bloom filter finds any data matching the relevant criteria. +``` + +# Evaluating a Bloom Filter + +Using a [bloom filter](../resources/glossary.md#bloom-filter) to find matching data is nearly identical to constructing a bloom filter---except that at each step we check to see if the calculated index bit is set in the existing filter. + +``` python +vData = bitarray(endian='little') +vData.frombytes("b50f".decode("hex")) +nHashFuncs = 11 +nTweak = 0 +nFlags = 0 +``` + +Using the bloom filter created above, we import its various parameters. Note, as indicated in the section above, we won't actually use *nFlags* to update the filter. + +``` python +def contains(nHashFuncs, data_to_hash): + for nHashNum in range(nHashFuncs): + ## bloom_hash as defined in previous section + nIndex = bloom_hash(nHashNum, data_to_hash) + + if vData[nIndex] != True: + print "MATCH FAILURE: Index {0} not set in {1}".format( + hex(int(nIndex)), + vData.to01() + ) + return False +``` + +We define a function to check an element against the provided filter. When checking whether the filter might contain an element, we test to see whether a particular bit in the filter is already set to 1 (if it isn't, the match fails). + +``` python +## Test 1: Same TXID as previously added to filter +data_to_hash = "019f5b01d4195ecbc9398fbf3c3b1fa9" \ + + "bb3183301d7a1fb3bd174fcfa40a2b65" +data_to_hash = data_to_hash.decode("hex") +contains(nHashFuncs, data_to_hash) +``` + +Testing the filter against the data element we previously added, we get no output (indicating a possible match). Recall that bloom filters have a zero false negative rate---so they should always match the inserted elements. + +``` python +## Test 2: Arbitrary string +data_to_hash = "1/10,000 chance this ASCII string will match" +contains(nHashFuncs, data_to_hash) +``` + +Testing the filter against an arbitrary element, we get the failure output below. Note: we created the filter with a 1-in-10,000 false positive rate (which was rounded up somewhat when we truncated), so it was possible this arbitrary string would've matched the filter anyway. It is not possible to set a bloom filter to a false positive rate of zero, so your program will always have to deal with false positives. The output below shows us that one of the hash functions returned an index number of 0x06, but that bit wasn't set in the filter, causing the match failure: + +``` text +MATCH FAILURE: Index 0x6 not set in 1010110111110000 +``` diff --git a/docs/core/examples/p2p-network-parsing-a-merkleblock.md b/docs/core/examples/p2p-network-parsing-a-merkleblock.md new file mode 100644 index 000000000..2668bf1b0 --- /dev/null +++ b/docs/core/examples/p2p-network-parsing-a-merkleblock.md @@ -0,0 +1,73 @@ +```{eval-rst} +.. meta:: + :title: Parsing a MerkleBlock + :description: In this section we will parse a merkle block after having retrieved it from the network. +``` + +# Parsing a MerkleBlock + +In the section above, we retrieved a [merkle block](../resources/glossary.md#merkle-block) from the network; now we will parse it. Most of the [block header](../resources/glossary.md#block-header) has been omitted. For a more complete hexdump, see the example in the [`merkleblock` message section](../reference/p2p-network-data-messages.md#merkleblock). + +``` text +7f16c5962e8bd963659c793ce370d95f +093bc7e367117b3c30c1f8fdd0d97287 ... Merkle root + +07000000 ........................... Transaction count: 7 +04 ................................. Hash count: 4 + +3612262624047ee87660be1a707519a4 +43b1c1ce3d248cbfc6c15870f6c5daa2 ... Hash #1 +019f5b01d4195ecbc9398fbf3c3b1fa9 +bb3183301d7a1fb3bd174fcfa40a2b65 ... Hash #2 +41ed70551dd7e841883ab8f0b16bf041 +76b7d1480e4f0af9f3d4c3595768d068 ... Hash #3 +20d2a7bc994987302e5b1ac80fc425fe +25f8b63169ea78e68fbaaefa59379bbf ... Hash #4 + +01 ................................. Flag bytes: 1 +1d ................................. Flags: 1 0 1 1 1 0 0 0 +``` + +We parse the above [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) using the following instructions. Each illustration is described in the paragraph below it. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.svg) + +We start by building the structure of a [merkle tree](../resources/glossary.md#merkle-tree) based on the number of [transactions](../resources/glossary.md#transaction) in the [block](../resources/glossary.md#block). + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.svg) + +The first flag is a 1 and the [merkle root](../resources/glossary.md#merkle-root) is (as always) a non-TXID node, so we will need to compute the hash later based on this node's children. Accordingly, we descend into the merkle root's left child and look at the next flag for instructions. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.svg) + +The next flag in the example is a 0 and this is also a non-TXID node, so we apply the first hash from the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) to this node. We also don't process any child nodes---according to the peer which created the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock), none of those nodes will lead to [TXIDs](../resources/glossary.md#transaction-identifiers) of transactions that match our filter, so we don't need them. We go back up to the merkle root and then descend into its right child and look at the next (third) flag for instructions. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg) + +The third flag in the example is another 1 on another non-TXID node, so we descend into its left child. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg) + +The fourth flag is also a 1 on another non-TXID node, so we descend again---we will always continue descending until we reach a TXID node or a non-TXID node with a 0 flag (or we finish filling out the tree). + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg) + +Finally, on the fifth flag in the example (a 1), we reach a TXID node. The 1 flag indicates this TXID's transaction matches our filter and that we should take the next (second) hash and use it as this node's TXID. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg) + +The sixth flag also applies to a TXID, but it's a 0 flag, so this TXID's transaction doesn't match our filter; still, we take the next (third) hash and use it as this node's TXID. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.svg) + +We now have enough information to compute the hash for the fourth node we encountered---it's the hash of the concatenated hashes of the two TXIDs we filled out. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.svg) + +Moving to the right child of the third node we encountered, we fill it out using the seventh flag and final hash---and discover there are no more child nodes to process. + +![Parsing A MerkleBlock](../../img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.svg) + +We hash as appropriate to fill out the tree. Note that the eighth flag is not used---this is acceptable as it was required to pad out a flag byte. + +The final steps would be to ensure the computed [merkle root](../resources/glossary.md#merkle-root) is identical to the merkle root in the [header](../resources/glossary.md#header) and check the other steps of the parsing checklist in the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) section. diff --git a/docs/core/examples/p2p-network-retrieving-a-merkleblock.md b/docs/core/examples/p2p-network-retrieving-a-merkleblock.md new file mode 100644 index 000000000..d5ec3101f --- /dev/null +++ b/docs/core/examples/p2p-network-retrieving-a-merkleblock.md @@ -0,0 +1,102 @@ +```{eval-rst} +.. meta:: + :title: Retrieving a MerkleBlock + :description: This section walks through each step of the process, demonstrating basic network communication and merkle block processing. +``` + +# Retrieving a MerkleBlock + +For the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) documentation on the reference page, an actual [merkle block](../resources/glossary.md#merkle-block) was retrieved from the [network](../resources/glossary.md#network) and manually processed. This section walks through each step of the process, demonstrating basic network communication and merkle block processing. + +``` python +#!/usr/bin/env python + +from time import sleep +from hashlib import sha256 +import struct +import sys + +network_string = "f9beb4d9".decode("hex") # Mainnet + +def send(msg,payload): + ## Command is ASCII text, null padded to 12 bytes + command = msg + ( ( 12 - len(msg) ) * "\00" ) + + ## Payload length is a uint32_t + payload_raw = payload.decode("hex") + payload_len = struct.pack("I", len(payload_raw)) + + ## Checksum is first 4 bytes of SHA256(SHA256()) + checksum = sha256(sha256(payload_raw).digest()).digest()[:4] + + sys.stdout.write( + network_string + + command + + payload_len + + checksum + + payload_raw + ) + sys.stdout.flush() +``` + +To connect to the P2P [network](../resources/glossary.md#network), the trivial Python function above was developed to compute message headers and send payloads decoded from hex. + +``` python +## Create a version message +send("version", + "71110100" # ........................ Protocol Version: 70001 + + "0000000000000000" # ................ Services: Headers Only (SPV) + + "c6925e5400000000" # ................ Time: 1415484102 + + "00000000000000000000000000000000" + + "0000ffff7f000001208d" # ............ Receiver IP Address/Port + + "00000000000000000000000000000000" + + "0000ffff7f000001208d" # ............ Sender IP Address/Port + + "0000000000000000" # ................ Nonce (not used here) + + "1b" # .............................. Bytes in version string + + "2f426974636f696e2e6f726720457861" + + "6d706c653a302e392e332f" # .......... Version string + + "93050500" # ........................ Starting block height: 329107 + + "00" # .............................. Relay transactions: false +) +``` + +Peers on the network will not accept any requests until you send them a [`version` message](../reference/p2p-network-control-messages.md#version). The receiving node will reply with their [`version` message](../reference/p2p-network-control-messages.md#version) and a [`verack` message](../reference/p2p-network-control-messages.md#verack). + +``` python +sleep(1) +send("verack", "") +``` + +We're not going to validate their [`version` message](../reference/p2p-network-control-messages.md#version) with this simple script, but we will sleep a short bit and send back our own [`verack` message](../reference/p2p-network-control-messages.md#verack) as if we had accepted their [`version` message](../reference/p2p-network-control-messages.md#version). + +``` python +send("filterload", + "02" # ........ Filter bytes: 2 + + "b50f" # ....... Filter: 1010 1101 1111 0000 + + "0b000000" # ... nHashFuncs: 11 + + "00000000" # ... nTweak: 0/none + + "00" # ......... nFlags: BLOOM_UPDATE_NONE +) +``` + +We set a [bloom filter](../resources/glossary.md#bloom-filter) with the [`filterload` message](../reference/p2p-network-control-messages.md#filterload). This filter is described in the preceding sections. + +``` python +send("getdata", + "01" # ................................. Number of inventories: 1 + + "03000000" # ........................... Inventory type: filtered block + + "a4deb66c0d726b0aefb03ed51be407fb" + + "ad7331c6e8f9eef231b7000000000000" # ... Block header hash +) +``` + +We request a merkle block for transactions matching our filter, completing our script. + +To run the script, we simply pipe it to the Unix [`netcat` command](https://en.wikipedia.org/wiki/Netcat) or one of its many clones, one of which is available for practically any platform. For example, with the original netcat and using hexdump (`hd`) to display the output: + +``` bash +## Connect to the Bitcoin Core peer running on localhost +python get-merkle.py | nc localhost 8333 | hd +``` + +Part of the response is shown in the [Parsing a MerkleBlock](../examples/p2p-network-parsing-a-merkleblock.md) section. diff --git a/docs/core/examples/p2p-network.md b/docs/core/examples/p2p-network.md new file mode 100644 index 000000000..b0769de0a --- /dev/null +++ b/docs/core/examples/p2p-network.md @@ -0,0 +1,12 @@ +# P2P Network + +```{toctree} +:maxdepth: 3 +:titlesonly: + +p2p-network-creating-a-bloom-filter +p2p-network-evaluating-a-bloom-filter +p2p-network-bloom-filter-script +p2p-network-retrieving-a-merkleblock +p2p-network-parsing-a-merkleblock +``` diff --git a/docs/core/examples/receiving-zmq-notifications.md b/docs/core/examples/receiving-zmq-notifications.md new file mode 100644 index 000000000..38203b03c --- /dev/null +++ b/docs/core/examples/receiving-zmq-notifications.md @@ -0,0 +1,164 @@ +```{eval-rst} +.. _examples-receiving-zmq-notifications: +.. meta:: + :title: Receiving ZMQ Notifications + :description: Shows how to configure Dash Core's ZeroMQ support and subscribe to ZMQ notifications for block, transaction, and governance messages for efficient notification handling. +``` + +# Receiving ZMQ Notifications + +## Overview + +Receiving notifications from Dash Core is important for a variety of use-cases. Although polling [RPCs](../api/remote-procedure-calls.md) can be useful, in some scenarios it may be more desirable to have publish-subscribe functionality. Dash Core's built-in ZeroMQ (ZMQ) support provides the ability to subscribe to block, transaction, and governance related messages. + +Further information regarding ZMQ support may be found in the [ZMQ API Reference](../api/zmq.md). + +## Enabling Dash Core ZMQ Notifications + +:::{note} +This requires a Dash Core full node or masternode +::: + +In the [`dash.conf` configuration file](../examples/configuration-file.md), add the following [ZMQ notifications](../api/zmq.md#available-notifications) and assign the address that Dash Core should listen on. The notifications selected here relate to InstantSend and ChainLocks. + +``` +# ZMQ +zmqpubhashchainlock=tcp://0.0.0.0:20009 +zmqpubhashtx=tcp://0.0.0.0:20009 +zmqpubhashtxlock=tcp://0.0.0.0:20009 +zmqpubrawchainlock=tcp://0.0.0.0:20009 +zmqpubrawtxlock=tcp://0.0.0.0:20009 +``` + +Restart the Dash Core node once the configuration file has been updated. + +## JavaScript Example + +Requires an installation of [NodeJS](https://nodejs.org/en/download/) + +### 1. Install ZeroMq + +The JavaScript zeromq package is available from [npmjs.com](https://www.npmjs.com/package/zeromq) and can be installed from the command line by running: + +```shell +npm install zeromq@5 +``` + +:::{attention} +Version 5 of the zeromq package should be used for compatibility reasons. +::: + +### 2. Subscribe to ZeroMQ Messages + +Create a file with the following contents. Then run it by typing `node ` from the command line: + +::::{tab-set-code} + +```{code-block} javascript +const zmq = require('zeromq'); +const sock = zmq.socket('sub'); +const zmqPort = 20009; + +sock.connect('tcp://127.0.0.1:' + zmqPort); + +// Subscribe to transaction notifications +sock.subscribe('hashtx'); // Note: this will subscribe to hashtxlock also + +// Subscribe to InstantSend/ChainLock notifications +sock.subscribe('hashchainlock'); +sock.subscribe('hashtxlock'); +sock.subscribe('rawchainlock'); // Note: this will subscribe to rawchainlocksig also +sock.subscribe('rawtxlock'); // Note: this will subscribe to rawtxlocksig also + +console.log('Subscriber connected to port %d', zmqPort); + +sock.on('message', function(topic, message) { + console.log( + 'Received', + topic.toString().toUpperCase(), + 'containing:\n', + message.toString('hex'), + '\n' + ); +}); +``` + +```{code-block} python +import binascii +import asyncio +import zmq +import zmq.asyncio +import signal + +port = 20009 + +class ZMQHandler(): + def __init__(self): + self.loop = asyncio.get_event_loop() + self.zmqContext = zmq.asyncio.Context() + + self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) + self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + + # Subscribe to transaction notifications + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx") + + # Subscribe to InstantSend/ChainLock notifications + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtxlock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashchainlock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawchainlock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtxlock") + + print('Subscriber connected to port {}'.format(port)) + + @asyncio.coroutine + def handle(self) : + msg = yield from self.zmqSubSocket.recv_multipart() + topic = msg[0] + body = msg[1] + sequence = "Unknown" + + print('Received {} containing:\n{}\n'.format( + topic.decode("utf-8"), + binascii.hexlify(body).decode("utf-8"))) + + # schedule ourselves to receive the next message + asyncio.ensure_future(self.handle()) + + def start(self): + self.loop.add_signal_handler(signal.SIGINT, self.stop) + self.loop.create_task(self.handle()) + self.loop.run_forever() + + def stop(self): + self.loop.stop() + self.zmqContext.destroy() + +daemon = ZMQHandler() +daemon.start() +``` + +:::: + +## Example Response + +The following response demonstrates the notification provided by Dash Core when it receives a transaction and then receives the associated InstantSend lock. The four notifications represent: + + 1. The TXID of the transaction is received (`HASHTX`) - at this point the transaction is not locked + 2. The TXID of a locked transaction is received (`HASHTXLOCK`). Since this is the same value as the `HASHTX` already received, we know that the transaction has now received an InstantSend lock. + 3. The raw transaction (`RAWTXLOCK`) (this could be decoded using the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction) for example) + 4. A combination of the raw transaction and the InstantSend [lock signature](../reference/p2p-network-instantsend-messages.md#isdlock) (`RAWTXLOCKSIG`) + +``` +Received HASHTX containing: + b2e128661e3679c3d00cd081e32fdc9a12f44e486e083e6eab998bdfd6f64a9b + +Received HASHTXLOCK containing: + b2e128661e3679c3d00cd081e32fdc9a12f44e486e083e6eab998bdfd6f64a9b + +Received RAWTXLOCK containing: + 02000000025a4d18da609107e9ea3dc6 ... 5a32ea917a30147d6c9788ac6ea90400 + +Received RAWTXLOCKSIG containing: + 02000000025a4d18da609107e9ea3dc6 ... 9e889cee7ba48981ca002e6962a20236 +``` diff --git a/docs/core/examples/testing-applications.md b/docs/core/examples/testing-applications.md new file mode 100644 index 000000000..89d3c2a3c --- /dev/null +++ b/docs/core/examples/testing-applications.md @@ -0,0 +1,126 @@ +```{eval-rst} +.. _examples-testing-applications: +.. meta:: + :title: Testing Applications + :description: Dash Core provides several network options designed to let developers test their applications with reduced risks and limitations. +``` + +# Testing Applications + +Dash Core provides several network options designed to let developers test their applications with reduced risks and limitations. + +## Testnet + +When run with no arguments, all Dash Core programs default to Dash's main network ([mainnet](../resources/glossary.md#mainnet)). However, for development, it's safer and cheaper to use Dash's test network ([testnet](../resources/glossary.md#testnet)) where the [duffs](../resources/glossary.md#duffs) spent have no real-world value. Testnet also relaxes some restrictions (such as standard transaction checks) so you can test functions which might currently be disabled by default on [mainnet](../resources/glossary.md#mainnet). + +To use testnet, use the argument `-testnet` with `dash-cli`, `dashd` or `dash-qt` or add `testnet=1` to your `dash.conf` file as [described earlier](../examples/configuration-file.md). To get free duffs for testing, check the faucets listed below. Some are community supported and due to potentially frequent Testnet changes, one or more of them may be unavailable at a given time: + +* [Testnet Faucet - Dash Core Group](https://testnet-faucet.dash.org/) +* [Testnet Faucet - Crowdnode.io](http://faucet.test.dash.crowdnode.io/) + +Testnet is a public resource provided for free by Dash Core Group and members of the community, so please don't abuse it. + +## Regtest mode + +For situations where interaction with random [peers](../resources/glossary.md#peer) and [blocks](../resources/glossary.md#block) is unnecessary or unwanted, Dash Core's [regression test mode](../resources/glossary.md#regression-test-mode) (regtest mode) lets you instantly create a brand-new private [block chain](../resources/glossary.md#block-chain) with the same basic rules as testnet---but one major difference: you choose when to create new blocks, so you have complete control over the environment. + +Many developers consider regtest mode the preferred way to develop new applications. The following example will let you create a regtest environment after you first [configure dashd](../examples/configuration-file.md). + +``` bash +> dashd -regtest -daemon +Dash Core server starting +``` + +Start `dashd` in regtest mode to create a private block chain. + +``` text +## Dash Core +dash-cli -regtest generate 101 +``` + +Generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. Because this is a new block chain using Dash's default rules, the first blocks pay a [block reward](../resources/glossary.md#block-reward) of 500 dash. Unlike [mainnet](../resources/glossary.md#mainnet), in regtest mode only the first 150 blocks pay a reward of 500 dash. However, a block must have 100 [confirmations](../resources/glossary.md#confirmations) before that reward can be spent, so we generate 101 blocks to get access to the [coinbase transaction](../resources/glossary.md#coinbase-transaction) from block #1. + +``` bash +dash-cli -regtest getbalance +500.00000000 +``` + +Verify that we now have 500 dash available to spend. + +You can now use Dash Core RPCs prefixed with `dash-cli -regtest`. + +Regtest wallets and block chain state (chainstate) are saved in the `regtest` subdirectory of the Dash Core configuration directory. You can safely delete the `regtest` subdirectory and restart Dash Core to start a new regtest. (See the [Developer Examples Introduction](../examples/introduction.md) for default configuration directory locations on various operating systems. **Always back up mainnet wallets before performing dangerous operations such as deleting**.) + +The complete set of regtest-specific arguments can be found on the [`dashd` Arguments and Commands page](../dashcore/wallet-arguments-and-commands-dashd.md#regtest-options). + +## Devnet mode + +### Overview + +Developer networks (devnets) have some aspects of testnet and some aspects of regtest. Unlike testnet, multiple independent devnets can be created and coexist without interference. Devnets can consist of nodes running on the same computer, on a small private network, or distributed across the internet. + +Each devnet is identified by a name which is hardened into a "devnet genesis" block that is automatically positioned at height 1. Validation rules ensure that a [node](../resources/glossary.md#node) from `devnet=test1` will not accept blocks from `devnet=test2`. This is done by checking the expected devnet [genesis block](../resources/glossary.md#genesis-block). Also, the devnet name is put into the sub-version field of the [`version` message](../reference/p2p-network-control-messages.md#version). If a node connects to the wrong [network](../resources/glossary.md#network), it will immediately be disconnected. + +The genesis block of the devnet is the same as the one from regtest. This starts the devnet with a very low [difficulty](../resources/glossary.md#difficulty), allowing quick generation of a sufficient balance to create a [masternode](../resources/glossary.md#masternode). + +### Configuration + +To use devnet, use the argument `-devnet=` with `dash-cli`, `dashd`or `dash-qt` or add `devnet=` to your `dash.conf` file as [described earlier](../examples/configuration-file.md). + +Devnets must be assigned both `-port` and `-rpcport` unless they are not listening (`-listen=0`). It is possible to run a devnet on a private (RFC1918) network by using the `-allowprivatenet=1` argument. + +Example devnet start command: + +``` bash +> dashd -devnet=mydevnet -rpcport=18998 -port=18999 -daemon +Dash Core server starting +``` + +#### Devnet-specific options + +Devnets can use 3 devnet-specific options to enable quickly mining large amounts of Dash. This enables quick establishment of test masternodes, etc. The following `dash.conf` excerpt shows these configuration options in use: + +``` +# First 1000 blocks mined with the lowest difficulty (like regtest) +# and first 500 blocks mined with a block subsidity multiplied by 10 +# This allows immediate MN registration (DIP3 activates on block 2) +minimumdifficultyblocks=1000 +highsubsidyblocks=500 +highsubsidyfactor=10 +``` + +The complete set of devnet-specific arguments can be found on the [`dashd` Arguments and Commands page](../dashcore/wallet-arguments-and-commands-dashd.md#devnet-options). + +### Management + +Devnet wallets and block chain state (chainstate) are saved in the `devnet-` subdirectory of the Dash Core configuration directory. You can safely delete the `devnet-` subdirectory and restart Dash Core to start a new devnet. (See the [Developer Examples Introduction](../examples/introduction.md) for default configuration directory locations on various operating systems. **Always back up mainnet wallets before performing dangerous operations such as deleting.**) + +An old devnet can be easily dropped and a new one started just by destroying all nodes and recreating them with a new devnet name. This works best in combination with an automated deployment using something like Ansible and Terraform. The [Dash Network Deploy](https://github.com/dashevo/dash-network-deploy) tool provides a way to do this. + +## Network type comparison + +Each network type has some unique characteristics to support development and testing. The tables below summarize some of the significant differences between the 4 network types. + +### Network characteristics + +| | Mainnet | [Testnet](#testnet) | [Regtest](#regtest-mode) | [Devnet](#devnet-mode) | +|-|-|-|-|-| +| Public network | Yes | Yes | No | Optional | +| Private network | No | No | Yes | Optional | +| Number of networks | 1 | 1 | Unlimited | Unlimited / Unique (named) | + +:::{note} +To enable or disable sporks on a regtest or devnet, set `sporkaddr` and `sporkkey` in the `dash.conf` config file. Any valid Dash address / private key can be used. You can get an address using the [`getnewaddress` RPC](../api/remote-procedure-calls-wallet.md#getnewaddress) and retrieve its private key using the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey). +::: + +### Mining characteristics + +| Network Type | Difficulty adjustment algorithm | +|-|-| +| [Testnet](#testnet) | Mainnet algorithm, but [allows minimum difficulty blocks](https://github.com/dashpay/dash/blob/v0.17.0.3/src/pow.cpp#L142-L146) if no blocks are created for 5 minutes | +| [Regtest](#regtest-mode) | Mines blocks at the [minimum difficulty level](https://github.com/dashpay/dash/blob/v0.17.0.3/src/chainparams.cpp#L925) | +| [Devnet](#devnet-mode) | Mainnet algorithm after [4001 blocks](https://github.com/dashpay/dash/blob/v0.17.0.3/src/chainparams.cpp#L749) unless overridden by [devnet-specific options](#devnet-specific-options) | + +:::{note} +See [chainparams.cpp](https://github.com/dashpay/dash/blob/master/src/chainparams.cpp) for details on other differences +::: diff --git a/docs/core/examples/transaction-tutorial-complex-raw-transaction.md b/docs/core/examples/transaction-tutorial-complex-raw-transaction.md new file mode 100644 index 000000000..656678186 --- /dev/null +++ b/docs/core/examples/transaction-tutorial-complex-raw-transaction.md @@ -0,0 +1,230 @@ +```{eval-rst} +.. meta:: + :title: Complex Raw Transaction + :description: The example here demonstrates the creation of a transaction with two inputs and two outputs, where each input is signed separately. +``` + +# Complex Raw Transaction + +In this example, we'll create a [transaction](../resources/glossary.md#transaction) with two [inputs](../resources/glossary.md#input) and two [outputs](../resources/glossary.md#output). We'll sign each of the inputs separately, as might happen if the two inputs belonged to different people who agreed to create a transaction together (such as a CoinJoin transaction). + +## 1. List unspent outputs + +```shell +> dash-cli -regtest listunspent +``` + +``` json +[ + { + "txid": "fa0f4105b0a2b2706d65581c5e6411d3970253c7f231944fa2f978b4a3d9010d", + "vout": 0, + "address": "yfV9Wirf5RkYHgNDttjpBz8Wdi8BavLHcP", + "account": "", + "scriptPubKey": "76a914d240140859744755d73e5967081c3bedceffc5db88ac", + "amount": 499.99990000, + "confirmations": 1, + "ps_rounds": -2, + "spendable": true, + "solvable": true + }, + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f700d130", + "vout": 0, + "address": "yRdk89fwSW1mUBxQo5fCmEfTva7b4wh2H5", + "account": "", + "scriptPubKey": "76a9143a4e8960f26c1fa82d937046959b656e4dd7966688ac", + "amount": 10.00000000, + "confirmations": 2, + "ps_rounds": -2, + "spendable": true, + "solvable": true + }, + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f700d130", + "vout": 1, + "address": "yavnyFMebbfX4F2VC25P18FW6LS66h2wqJ", + "scriptPubKey": "76a914a0411dbed3eab4341d5c41496d61b4fa1b22037e88ac", + "amount": 490.00000000, + "confirmations": 2, + "ps_rounds": -2, + "spendable": true, + "solvable": true + }, + { + "txid": "ea6d596da55a137846f8b08bfd414b4667ce456f9e3b3182e6f05810e8613d84", + "vout": 0, + "address": "yWtgzKSckhedxtJ8NXhShWGjfBivkvBGgG", + "scriptPubKey": "21023fff9c9dc9088c0aeba90d75413705091111311d761054de23\ + acdd217450869aac", + "amount": 500.00000000, + "confirmations": 101, + "ps_rounds": -2, + "spendable": true, + "solvable": true + } +] +``` + +## 2. Select UTXOs + +For our two inputs, we select two UTXOs by placing the txid and output index numbers (vouts) in shell variables. We also save the addresses corresponding to the public keys (hashed or unhashed) used in those transactions. We need the addresses so we can get the corresponding private keys from our wallet. + +``` bash +> UTXO1_TXID=ea6d596da55a137846f8b08bfd414b4667ce456f9e3b3182e6f05810e8613d84 +> UTXO1_VOUT=0 +> UTXO1_ADDRESS=yWtgzKSckhedxtJ8NXhShWGjfBivkvBGgG + +> UTXO2_TXID=f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f700d130 +> UTXO2_VOUT=0 +> UTXO2_ADDRESS=yRdk89fwSW1mUBxQo5fCmEfTva7b4wh2H5 +``` + +## 3. Get private keys + +:::{attention} +Users should never manually manage private keys on mainnet. As dangerous as raw transactions are (see warnings above), making a mistake with a private key can be much worse---as in the case of a HD wallet [cross-generational key compromise](../guide/wallets-wallet-files.md#hardened-keys). +**These examples are to help you learn, not for you to emulate on mainnet.** +::: + +Use the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey) to get the [private keys](../resources/glossary.md#private-key) corresponding to the [public keys](../resources/glossary.md#public-key) used in the two UTXOs our inputs we will be spending. We need the private keys so we can sign each of the inputs separately. + +``` bash +> dash-cli -regtest dumpprivkey $UTXO1_ADDRESS +cNL522MEQUnQxsZJo4ryPH8sPd2uVZaFKjKnZivo9DyVjpAGU7qP + +> dash-cli -regtest dumpprivkey $UTXO2_ADDRESS +cPtZ9nagmjQ5bRKMuqoDz8xni6hRPfZ1zp3TSrqH3j3RyUThTYGN + +> UTXO1_PRIVATE_KEY=cNL522MEQUnQxsZJo4ryPH8sPd2uVZaFKjKnZivo9DyVjpAGU7qP + +> UTXO2_PRIVATE_KEY=cPtZ9nagmjQ5bRKMuqoDz8xni6hRPfZ1zp3TSrqH3j3RyUThTYGN +``` + +## 4. Get new addresses + +For our two outputs, get two new [addresses](../resources/glossary.md#address). + +``` bash +> dash-cli -regtest getnewaddress +yhshGrdbh3rWt9EPaSi7xSGRFMvFdzTZ8n +> dash-cli -regtest getnewaddress +yesLaP5XFTaLZiWAo2zK8mFfUCtV8rRhKw + +> NEW_ADDRESS1=yhshGrdbh3rWt9EPaSi7xSGRFMvFdzTZ8n +> NEW_ADDRESS2=yesLaP5XFTaLZiWAo2zK8mFfUCtV8rRhKw +``` + +## 5. Create raw transaction + +Create the [raw transaction](../resources/glossary.md#raw-transaction) using the [`createrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction) much the same as before, except now we have two inputs and two outputs. + +``` bash +## Outputs - inputs = transaction fee, so always double-check your math! +> dash-cli -regtest createrawtransaction ''' + [ + { + "txid": "'$UTXO1_TXID'", + "vout": '$UTXO1_VOUT' + }, + { + "txid": "'$UTXO2_TXID'", + "vout": '$UTXO2_VOUT' + } + ] + ''' ''' + { + "'$NEW_ADDRESS1'": 499.9999, + "'$NEW_ADDRESS2'": 10 + }''' +0100000002843d61e81058f0e682313b9e6f45ce67464b41fd8bb0f84678135a\ +a56d596dea0000000000ffffffff30d100f7762956100a2396403c60e13e7a13\ +520167acc6d38978ec33ada44cf80000000000ffffffff02f04c3ba40b000000\ +1976a914ec73fe6129b249617bb5f20c8760708055fb6fdb88ac00ca9a3b0000\ +00001976a914cb7a56b046479f8c247875d672d3e1aed18c33f488ac00000000 + +> RAW_TX=0100000002843d61e81058f0e682313b9e6f45ce67464b41fd8bb0f[...] +``` + +## 6. Sign raw transaction + +Signing the raw transaction with [`signrawtransactionwithkey`](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey) gets more complicated as we now have two arguments: + +1. The unsigned raw transaction. + +2. The private key we want to use to sign one of the inputs. + +### 6a. First input + +The result is a raw transaction with only one input signed; the fact that the transaction isn't fully signed is indicated by value of the `complete` JSON field. We save the incomplete, partly-signed raw transaction hex to a shell variable. + +``` bash +> dash-cli -regtest signrawtransaction $RAW_TX ''' + [ + "'$UTXO1_PRIVATE_KEY'" + ]''' +``` + +``` json +{ + "hex": "0100000002843d61e81058f0e682313b9e6f45ce67464b41fd8bb0\ + f84678135aa56d596dea00000000494830450221009f7f356c0cc2d3337b5f\ + 76dfc6de9f9be7c8c5ac2074cbeeba4815b90329602002207790f23361480e\ + 2a5a2d1fa6e293ccd5cd01279ad301176f091b84d6dd8e8f6501ffffffff30\ + d100f7762956100a2396403c60e13e7a13520167acc6d38978ec33ada44cf8\ + 0000000000ffffffff02f04c3ba40b0000001976a914ec73fe6129b249617b\ + b5f20c8760708055fb6fdb88ac00ca9a3b000000001976a914cb7a56b04647\ + 9f8c247875d672d3e1aed18c33f488ac00000000", + "complete": false, + "errors": [ + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a1\ + 0562976f700d130", + "vout": 0, + "scriptSig": "", + "sequence": 4294967295, + "error": "Unable to sign input, invalid stack size (possibly missing key)" + } + ] +} +``` + +``` bash + +> PARTLY_SIGNED_RAW_TX=0100000002843d61e81058f0e682313b9e6f45ce6[...] +``` + +### 6b. Second input + +To sign the second input, we repeat the process we used to sign the first input using the second private key. Now that both inputs are signed, the `complete` result is *true*. + +``` bash +> dash-cli -regtest signrawtransaction $PARTLY_SIGNED_RAW_TX ''' + [ + "'$UTXO2_PRIVATE_KEY'" + ]''' +``` + +``` json +{ + "hex": "0100000002843d61e81058f0e682313b9e6f45ce67464b41fd8bb0\ + f84678135aa56d596dea00000000494830450221009f7f356c0cc2d3337b5f\ + 76dfc6de9f9be7c8c5ac2074cbeeba4815b90329602002207790f23361480e\ + 2a5a2d1fa6e293ccd5cd01279ad301176f091b84d6dd8e8f6501ffffffff30\ + d100f7762956100a2396403c60e13e7a13520167acc6d38978ec33ada44cf8\ + 000000006a47304402207867e88e3fe2c926df29376d77eba81daf9f4a5573\ + 44d4f02e9c7dcee96a51e4022076274c2365dc069e7ef797c95c75ab6e01ca\ + 3757342f3e6f21a3d9d01086efb7012102ff9005f79aa4c22ac48fa93d9b7f\ + 40f321db1c13cd70cf08bdab3e23c8d19620ffffffff02f04c3ba40b000000\ + 1976a914ec73fe6129b249617bb5f20c8760708055fb6fdb88ac00ca9a3b00\ + 0000001976a914cb7a56b046479f8c247875d672d3e1aed18c33f488ac0000\ + 0000", + "complete": true +} +``` + +Clean up the shell variables used. Unlike previous subsections, we're not going to send this transaction to the connected node with `sendrawtransaction`. This will allow us to illustrate in the [Offline Signing subsection](../examples/transaction-tutorial-offline-signing.md) below how to spend a transaction which is not yet in the block chain or memory pool. + +``` bash +> unset PARTLY_SIGNED_RAW_TX RAW_TX NEW_ADDRESS1 [...] +``` diff --git a/docs/core/examples/transaction-tutorial-offline-signing.md b/docs/core/examples/transaction-tutorial-offline-signing.md new file mode 100644 index 000000000..18671d8bd --- /dev/null +++ b/docs/core/examples/transaction-tutorial-offline-signing.md @@ -0,0 +1,280 @@ +```{eval-rst} +.. meta:: + :title: Offline Signing + :description: The example in this section demonstrates offline signing of a transaction, including spending an unconfirmed output, without sending it to the local node. +``` + +# Offline Signing + +We will now spend the [transaction](../resources/glossary.md#transaction) created in the [Complex Raw Transaction subsection](../examples/transaction-tutorial-complex-raw-transaction.md) without sending it to the local [node](../resources/glossary.md#node) first. This is the same basic process used by [wallet](../resources/glossary.md#wallet) programs for offline signing---which generally means signing a transaction without access to the current UTXO set. + +Offline signing is safe. However, in this example we will also be spending an [output](../resources/glossary.md#output) which is not part of the [block chain](../resources/glossary.md#block-chain) because the transaction containing it has never been broadcast. That can be unsafe: + +:::{warning} +Transactions which spend outputs from unconfirmed transactions are vulnerable to transaction +malleability. Be sure to read about transaction malleability and adopt good practices before +spending unconfirmed transactions on mainnet. +::: + +Put the previously signed (but not sent) transaction into a shell variable. + +``` shell +OLD_SIGNED_RAW_TX=0100000002843d61e81058f0e682313b9e6f45ce67464b41fd8bb0\ +f84678135aa56d596dea00000000494830450221009f7f356c0cc2d3337b5f76dfc6de9f\ +9be7c8c5ac2074cbeeba4815b90329602002207790f23361480e2a5a2d1fa6e293ccd5cd\ +01279ad301176f091b84d6dd8e8f6501ffffffff30d100f7762956100a2396403c60e13e\ +7a13520167acc6d38978ec33ada44cf8000000006a47304402207867e88e3fe2c926df29\ +376d77eba81daf9f4a557344d4f02e9c7dcee96a51e4022076274c2365dc069e7ef797c9\ +5c75ab6e01ca3757342f3e6f21a3d9d01086efb7012102ff9005f79aa4c22ac48fa93d9b\ +7f40f321db1c13cd70cf08bdab3e23c8d19620ffffffff02f04c3ba40b0000001976a914\ +ec73fe6129b249617bb5f20c8760708055fb6fdb88ac00ca9a3b000000001976a914cb7a\ +56b046479f8c247875d672d3e1aed18c33f488ac00000000 +``` + +## 1. Decode signed transaction + +Decode the signed [raw transaction](../resources/glossary.md#raw-transaction) so we can get its [TXID](../resources/glossary.md#transaction-identifiers). Also, choose a specific one of its UTXOs to spend and save that UTXO's [output index](../resources/glossary.md#output-index) number (vout) and hex [pubkey script](../resources/glossary.md#pubkey-script) (scriptPubKey) into shell variables. + +``` shell +dash-cli -regtest decoderawtransaction $OLD_SIGNED_RAW_TX +``` + +``` json +{ + "txid": "5efd61cf24c9644d79646627c4d1e192e9b2a760a5c720db8f4a9f76cb781077", + "size": 339, + "version": 1, + "locktime": 0, + "vin": [ + { + "txid": "ea6d596da55a137846f8b08bfd414b4667ce456f9e3b3182e6f05810e86\ + 13d84", + "vout": 0, + "scriptSig": { + "asm": "30450221009f7f356c0cc2d3337b5f76dfc6de9f9be7c8c5ac2074cbee\ + ba4815b90329602002207790f23361480e2a5a2d1fa6e293ccd5cd0127\ + 9ad301176f091b84d6dd8e8f65[ALL]", + "hex": "4830450221009f7f356c0cc2d3337b5f76dfc6de9f9be7c8c5ac2074cb\ + eeba4815b90329602002207790f23361480e2a5a2d1fa6e293ccd5cd01\ + 279ad301176f091b84d6dd8e8f6501" + }, + "sequence": 4294967295 + }, + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f70\ + 0d130", + "vout": 0, + "scriptSig": { + "asm": "304402207867e88e3fe2c926df29376d77eba81daf9f4a557344d4f02e\ + 9c7dcee96a51e4022076274c2365dc069e7ef797c95c75ab6e01ca3757\ + 342f3e6f21a3d9d01086efb7[ALL] 02ff9005f79aa4c22ac48fa93d9b\ + 7f40f321db1c13cd70cf08bdab3e23c8d19620", + "hex": "47304402207867e88e3fe2c926df29376d77eba81daf9f4a557344d4f0\ + 2e9c7dcee96a51e4022076274c2365dc069e7ef797c95c75ab6e01ca37\ + 57342f3e6f21a3d9d01086efb7012102ff9005f79aa4c22ac48fa93d9b\ + 7f40f321db1c13cd70cf08bdab3e23c8d19620" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 499.99990000, + "valueSat": 49999990000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 ec73fe6129b249617bb5f20c8760708055fb6fdb\ + OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914ec73fe6129b249617bb5f20c8760708055fb6fdb88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yhshGrdbh3rWt9EPaSi7xSGRFMvFdzTZ8n" + ] + } + }, + { + "value": 10.00000000, + "valueSat": 1000000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cb7a56b046479f8c247875d672d3e1aed18c33f4\ + OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cb7a56b046479f8c247875d672d3e1aed18c33f488ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yesLaP5XFTaLZiWAo2zK8mFfUCtV8rRhKw" + ] + } + } + ] +} +``` + +``` bash + +> UTXO_TXID=5efd61cf24c9644d79646627c4d1e192e9b2a760a5c720db8f4a9f76cb781077 +> UTXO_VOUT=1 +> UTXO_OUTPUT_SCRIPT=76a914cb7a56b046479f8c247875d672d3e1aed18c33f488ac +``` + +## 2. Get new address + +Get a new [address](../resources/glossary.md#address) to spend the [duffs](../resources/glossary.md#duffs) to. + +``` bash +> dash-cli -regtest getnewaddress +yfijhy7gYY34J2U77xFKdMwfA8k5mVnSRa + +> NEW_ADDRESS=yfijhy7gYY34J2U77xFKdMwfA8k5mVnSRa +``` + +## 3. Create raw transaction + +Create the raw transaction the same way we've done in the previous subsections. + +``` bash +## Outputs - inputs = transaction fee, so always double-check your math! +> dash-cli -regtest createrawtransaction ''' + [ + { + "txid": "'$UTXO_TXID'", + "vout": '$UTXO_VOUT' + } + ] + ''' ''' + { + "'$NEW_ADDRESS'": 9.9999 + }''' +0100000001771078cb769f4a8fdb20c7a560a7b2e992e1d1c4276664794d64c9\ +24cf61fd5e0100000000ffffffff01f0a29a3b000000001976a914d4d2078580\ +a9eea0ca9368d1c99c097279b8081f88ac00000000 + +> RAW_TX=0100000001771078cb769f4a8fdb20c7a560a7b2e992e1d1c427666[...] +``` + +## 4. Sign raw transaction + +Attempt to sign the [raw transaction](../resources/glossary.md#raw-transaction) without any special arguments, the way we successfully signed the the raw transaction in the [Simple Raw Transaction subsection](../examples/transaction-tutorial-simple-raw-transaction.md). If you've read the [Transaction section](../guide/transactions.md) of the guide, you may know why the call fails and leaves the raw transaction hex unchanged. + +![Old Transaction Data Required To Be Signed](../../img/dev/en-signing-output-to-spend.svg) + +As illustrated above, the data that gets signed includes the [TXID](../resources/glossary.md#transaction-identifiers) and vout from the previous transaction. That information is included in the `createrawtransaction` raw transaction. But the data that gets signed also includes the [pubkey script](../resources/glossary.md#pubkey-script) from the previous transaction, even though it doesn't appear in either the unsigned or signed transaction. + +In the other raw transaction subsections above, the previous [output](../resources/glossary.md#output) was part of the UTXO set known to the wallet, so the wallet was able to use the TXID and [output index](../resources/glossary.md#output-index) number to find the previous [pubkey script](../resources/glossary.md#pubkey-script) and insert it automatically. + +### 4a. Without Pubkey Script + +:::{note} +This step demonstrates the error returned when an unknown output is referenced. +::: + +In this case, you're spending an [output](../resources/glossary.md#output) which is unknown to the wallet, so it can't automatically insert the previous pubkey script. + +``` bash +> dash-cli -regtest signrawtransactionwithwallet $RAW_TX +``` + +``` json +{ + "hex": "0100000001771078cb769f4a8fdb20c7a560a7b2e992e1d1c4276664794d64c9\ + 24cf61fd5e0100000000ffffffff01f0a29a3b000000001976a914d4d2078580\ + a9eea0ca9368d1c99c097279b8081f88ac00000000", + "complete": false, + "errors": [ + { + "txid": "5efd61cf24c9644d79646627c4d1e192e9b2a760a5c720db8f4a9f76cb7\ + 81077", + "vout": 1, + "scriptSig": "", + "sequence": 4294967295, + "error": "Input not found or already spent" + } + ] +} +``` + +### 4b. With Pubkey Script + +Successfully sign the transaction by providing the previous pubkey script and other required input data. + +This specific operation is typically what offline signing wallets do. The online wallet creates the raw transaction and gets the previous pubkey scripts for all the inputs. The user brings this information to the offline wallet. After displaying the transaction details to the user, the offline wallet signs the transaction as we did above. The user takes the signed transaction back to the online wallet, which broadcasts it. + +``` bash +> dash-cli -regtest signrawtransactionwithwallet $RAW_TX ''' + [ + { + "txid": "'$UTXO_TXID'", + "vout": '$UTXO_VOUT', + "scriptPubKey": "'$UTXO_OUTPUT_SCRIPT'" + } + ]''' +``` + +``` json +{ + "hex": "0100000001771078cb769f4a8fdb20c7a560a7b2e992e1d1c4276664794d64c9\ + 24cf61fd5e010000006a47304402204ee3aae064dccedb511a84fcade3f35f2d\ + 95119283e2e9f23659d91ce799cb6d02203a4cecbd7c154de8394b9505814f1e\ + c842e890980e7c4c20ed182f09a71d65f3012103b0b12fb25b6382b0680ce4b0\ + 379bc201c4cbb391d3c0e171181f24c9a5df1468ffffffff01f0a29a3b000000\ + 001976a914d4d2078580a9eea0ca9368d1c99c097279b8081f88ac00000000", + "complete": true +} +``` + +``` bash + +> SIGNED_RAW_TX=0100000001771078cb769f4a8fdb20c7a560a7b2e992e1d1[...] +``` + +## 5. Send raw transaction + +### 5a. Second transaction + +Attempt to broadcast the second transaction before we've broadcast the first transaction. The [node](../resources/glossary.md#node) rejects this attempt because the second transaction spends an [output](../resources/glossary.md#output) which is not a UTXO the node knows about. + +``` bash +> dash-cli -regtest sendrawtransaction $SIGNED_RAW_TX +``` + +``` bash +error code: -25 +error message: +Missing inputs + +error: {"code":-22,"message":"TX rejected"} +``` + +### 5b. First transaction + +Broadcast the first transaction, which succeeds, and then broadcast the second transaction---which also now succeeds because the node now sees the UTXO. + +``` bash +> dash-cli -regtest sendrawtransaction $OLD_SIGNED_RAW_TX +5efd61cf24c9644d79646627c4d1e192e9b2a760a5c720db8f4a9f76cb781077 +> dash-cli -regtest sendrawtransaction $SIGNED_RAW_TX +f89deefb927fbd03c5acab194de2ba8f98ab160b9c4b3f57bde63073c4b5f060 +``` + +## 6. Check mempool + +We have once again not generated an additional block, so the transactions above have not yet become part of the regtest block chain. However, they are part of the local node's memory pool. + +``` bash +> dash-cli -regtest getrawmempool +``` + +``` json +[ + "f89deefb927fbd03c5acab194de2ba8f98ab160b9c4b3f57bde63073c4b5f060", + "5efd61cf24c9644d79646627c4d1e192e9b2a760a5c720db8f4a9f76cb781077" +] +``` + +Remove old shell variables. + +``` bash +> unset OLD_SIGNED_RAW_TX SIGNED_RAW_TX RAW_TX [...] +``` diff --git a/docs/core/examples/transaction-tutorial-p2sh-multisig.md b/docs/core/examples/transaction-tutorial-p2sh-multisig.md new file mode 100644 index 000000000..3dbf78c28 --- /dev/null +++ b/docs/core/examples/transaction-tutorial-p2sh-multisig.md @@ -0,0 +1,357 @@ +```{eval-rst} +.. meta:: + :title: P2SH Multisig + :description: In this subsection, we will create a P2SH multisig address, spend duffs to it, and then spend those duffs from it to another address. +``` + +# P2SH Multisig + +In this subsection, we will create a [P2SH multisig](../resources/glossary.md#p2sh-multisig) address, spend [duffs](../resources/glossary.md#duffs) to it, and then spend those duffs from it to another [address](../resources/glossary.md#address). + +Creating a [multisig](../resources/glossary.md#multisig) address is easy. Multisig [outputs](../resources/glossary.md#output) have two parameters, the *minimum* number of signatures required (*m*) and the *number* of [public keys](../resources/glossary.md#public-key) to use to validate those signatures. This is called m-of-n, and in this case we'll be using 2-of-3. + +## 1. Get new addresses + +Generate three new P2PKH addresses. A [P2PKH address](../resources/glossary.md#p2pkh-address) cannot be used with the multisig redeem script created below. (Hashing each public key is unnecessary anyway---all the public keys are protected by a hash when the [redeem script](../resources/glossary.md#redeem-script) is hashed.) However, Dash Core uses addresses as a way to reference the underlying full (unhashed) public keys it knows about, so we get the three new addresses above in order to use their public keys. + +Recall from the Guide that the hashed public keys used in addresses obfuscate the full public key, so you cannot give an address to another person or device as part of creating a typical multisig output or P2SH multisig redeem script. You must give them a full public key. + +``` bash + > dash-cli -regtest getnewaddress + yYtWtpW7akCc2a5En8NsXeTGENyYbNgv9q + > dash-cli -regtest getnewaddress + yarm2x9eDFd9dKCycyPigwwj1vfJcYFxsH + > dash-cli -regtest getnewaddress + yLknHbtnjJRVWQr78aTfCPfNB42jfNkDWK + + > NEW_ADDRESS1=yYtWtpW7akCc2a5En8NsXeTGENyYbNgv9q + > NEW_ADDRESS2=yarm2x9eDFd9dKCycyPigwwj1vfJcYFxsH + > NEW_ADDRESS3=yLknHbtnjJRVWQr78aTfCPfNB42jfNkDWK +``` + +## 2. Get public key + +Use the [`getaddressinfo` RPC](../api/remote-procedure-calls-wallet.md#getaddressinfo) to display the full (unhashed) public key for the addresses. This is the information which will actually be included in the multisig redeem script. This is also the information you would give another person or device as part of creating a multisig output or P2SH multisig redeem script. + +We save the address returned to a shell variable. + +``` bash +> dash-cli -regtest getaddressinfo $NEW_ADDRESS3 +``` + +``` json +{ + "address": "yLknHbtnjJRVWQr78aTfCPfNB42jfNkDWK", + "scriptPubKey": "76a91404caa000366b99780f8e606ccc818883ca7f48f888ac", + "ismine": true, + "solvable": true, + "iswatchonly": false, + "isscript": false, + "pubkey": "038007ef6fd812d73da054271b68a42dae06672cff2a30b2814935537e5930ebf6", + "iscompressed": true, + "label": "", + "ischange": false, +} + +``` + +``` bash + +> NEW_ADDRESS3_PUBLIC_KEY=038007ef6fd812d73da054271b68a42dae0667[...] +``` + +## 3. Create multisig address + +Use the [`createmultisig` RPC](../api/remote-procedure-calls-util.md#createmultisig) with two arguments, the number (*n*) of signatures required and a list of public keys. The P2SH address is returned along with the redeem script which must be provided when we spend duffs sent to the P2SH address. + +:::{attention} +You must not lose the redeem script, especially if you don't have a record of which public keys you used to create the P2SH multisig address. You need the redeem script to spend any dash sent to the P2SH address. + +If you lose the redeem script, you can recreate it by running the same command above, with the public keys listed in the same order. **However, if you lose both the redeem script and even one of the public keys, you will never be able to spend duffs sent to that P2SH address.** +::: + +Neither the address nor the redeem script are stored in the wallet when you use `createmultisig`. To store them in the wallet, use the [`addmultisigaddress` RPC](../api/remote-procedure-calls-wallet.md#addmultisigaddress) instead. If you add an address to the wallet, you should also make a new backup. + +``` bash +> dash-cli -regtest createmultisig 2 ''' + [ + "'$NEW_ADDRESS1_PUBLIC_KEY'", + "'$NEW_ADDRESS2_PUBLIC_KEY'", + "'$NEW_ADDRESS3_PUBLIC_KEY'" + ]''' +``` + +``` json +{ + "address": "8meEZF54K7GxhHhdLCCeNwFQjHENv4CK86", + "redeemScript": "522103fa8866cccae3c975a72884443a351801a0ea9721cbe721558\ + 6ddd6fab5f39f262103b2259f42a241f4870e794521594f2af7aadf0\ + e4c580a43582e58630e4618634621038007ef6fd812d73da054271b6\ + 8a42dae06672cff2a30b2814935537e5930ebf653ae" +} +``` + +``` bash + +> P2SH_ADDRESS=8meEZF54K7GxhHhdLCCeNwFQjHENv4CK86 +> P2SH_REDEEM_SCRIPT=522103fa8866cccae3c975a72884443a351801a0ea9[...] +``` + +## 4. Fund multisig address + +Paying the P2SH multisig address with Dash Core is as simple as paying a more common P2PKH address. Here we use the same command (but different variable) we used in the [Simple Spending subsection](../examples/transaction-tutorial-simple-spending.md). As before, this command automatically selects an UTXO, creates a [change output](../resources/glossary.md#change-output) to a new one of our P2PKH addresses if necessary, and pays a [transaction fee](../resources/glossary.md#transaction-fee) if necessary. + +We save that [TXID](../resources/glossary.md#transaction-identifiers) to a shell variable as the TXID of the UTXO we plan to spend next. + +``` bash +> dash-cli -regtest sendtoaddress $P2SH_ADDRESS 10.00 +ddb2a2eb2402a9ae61d7db93a9a48c0747859d899e704b10f5b72145779f9c52 + +> UTXO_TXID=ddb2a2eb2402a9ae61d7db93a9a48c0747859d899e704b10f5b7[...] +``` + +## 5. Get decoded transaction + +We use the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) with the optional second argument (*true*) to get the decoded transaction we just created with `sendtoaddress`. We choose one of the [outputs](../resources/glossary.md#output) (the multisig address one) to be our UTXO and get its [output index](../resources/glossary.md#output-index) number (vout) and [pubkey script](../resources/glossary.md#pubkey-script) (scriptPubKey). + +``` bash +> dash-cli -regtest getrawtransaction $UTXO_TXID 1 +``` + +``` json +{ + "hex": "010000000130d100f7762956100a2396403c60e13e7a13520167acc6d38978ec\ + 33ada44cf8010000006b48304502210084effe3132550e6ba43a7f4cc54ad30d\ + 001c0dbc3ea66d638e5f3d6039a28c2b022044c8cd89cf455b8650fe259306eb\ + 2a30b0112969717e469a722bca0263e0975d01210324c2226564b19f0948306b\ + b7160a735c28001bbd046cd46059df9f8434f41254feffffff0200ca9a3b0000\ + 000017a9144f334f26e350c8903c92ff25b733670902cfad5a8700e0052d0b00\ + 00001976a91479165c2155b8fec5c702ec7f251d0982f27b402988ac67000000", + "txid": "ddb2a2eb2402a9ae61d7db93a9a48c0747859d899e704b10f5b72145779f9c52", + "size": 224, + "version": 1, + "locktime": 103, + "vin": [ + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f70\ + 0d130", + "vout": 1, + "scriptSig": { + "asm": "304502210084effe3132550e6ba43a7f4cc54ad30d001c0dbc3ea66d63\ + 8e5f3d6039a28c2b022044c8cd89cf455b8650fe259306eb2a30b01129\ + 69717e469a722bca0263e0975d[ALL] 0324c2226564b19f0948306bb7\ + 160a735c28001bbd046cd46059df9f8434f41254", + "hex": "48304502210084effe3132550e6ba43a7f4cc54ad30d001c0dbc3ea66d\ + 638e5f3d6039a28c2b022044c8cd89cf455b8650fe259306eb2a30b011\ + 2969717e469a722bca0263e0975d01210324c2226564b19f0948306bb7\ + 160a735c28001bbd046cd46059df9f8434f41254" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 10.00000000, + "valueSat": 1000000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_HASH160 4f334f26e350c8903c92ff25b733670902cfad5a OP_EQUAL", + "hex": "a9144f334f26e350c8903c92ff25b733670902cfad5a87", + "reqSigs": 1, + "type": "scripthash", + "addresses": [ + "8meEZF54K7GxhHhdLCCeNwFQjHENv4CK86" + ] + } + }, + { + "value": 480.00000000, + "valueSat": 48000000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 79165c2155b8fec5c702ec7f251d0982f27b4029\ + OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91479165c2155b8fec5c702ec7f251d0982f27b402988ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yXMhQ1L5q3PcnJgEhyAFztQPPRaEr8Mh8s" + ] + } + } + ] +} +``` + +``` bash + +> UTXO_VOUT=0 +> UTXO_OUTPUT_SCRIPT=a9144f334f26e350c8903c92ff25b733670902cfad5a87 +``` + +## 6. Get new address + +We generate a new P2PKH address to use in the output we're about to create. + +``` bash +> dash-cli -regtest getnewaddress +yZSxAakpoWGG3vcsvpk9qNtsYREhump4Cr + +> NEW_ADDRESS4=yZSxAakpoWGG3vcsvpk9qNtsYREhump4Cr +``` + +## 7. Create raw transaction + +We generate the [raw transaction](../resources/glossary.md#raw-transaction) the same way we did in the [Simple Raw Transaction subsection](../examples/transaction-tutorial-simple-raw-transaction.md). + +``` bash +## Outputs - inputs = transaction fee, so always double-check your math! +> dash-cli -regtest createrawtransaction ''' + [ + { + "txid": "'$UTXO_TXID'", + "vout": '$UTXO_VOUT' + } + ] + ''' ''' + { + "'$NEW_ADDRESS4'": 9.998 + }''' + +0100000001529c9f774521b7f5104b709e899d8547078ca4a993dbd761aea902\ +24eba2b2dd0000000000ffffffff01c0bc973b000000001976a914900504f96c\ +55d6ebe1c33581ba9430ca05b12a1488ac00000000 + +010000000175e1769813db8418fea17576694af1ff31cb2b512b7333e6eb42f0\ +30d0d778720000000000ffffffff01c0bc973b000000001976a914b6f64f5bf3\ +e38f25ead28817df7929c06fe847ee88ac00000000 + +> RAW_TX=0100000001529c9f774521b7f5104b709e899d8547078ca4a993dbd[...] +``` + +## 8. Get private key + +We get the [private keys](../resources/glossary.md#private-key) for two of the [public keys](../resources/glossary.md#public-key) we used to create the transaction, the same way we got private keys in the [Complex Raw Transaction subsection](../examples/transaction-tutorial-complex-raw-transaction.md). Recall that we created a 2-of-3 multisig pubkey script, so signatures from two private keys are needed. + +:::{attention} +Users should never manually manage private keys on mainnet. See the warning in the [complex raw transaction section](../examples/transaction-tutorial-complex-raw-transaction.md). +::: + +``` bash +> dash-cli -regtest dumpprivkey $NEW_ADDRESS1 +cThhxbQUtBDzHZbZrW6XAR4XkXfaQf4Abo7BQaTK2zVp7sVrHdmv +> dash-cli -regtest dumpprivkey $NEW_ADDRESS3 +cUbYymPeHhRszTn64Xg7dzYKez8YC83M39ZTPJDiBDu8dRD3EjzF + +> NEW_ADDRESS1_PRIVATE_KEY=cThhxbQUtBDzHZbZrW6XAR4XkXfaQf4Abo7BQ[...] +> NEW_ADDRESS3_PRIVATE_KEY=cUbYymPeHhRszTn64Xg7dzYKez8YC83M39ZTP[...] +``` + +## 9. Sign raw transaction + +### 9a. Private Key 1 + +We make the first [signature](../resources/glossary.md#signature). The input argument (JSON object) takes the additional [redeem script](../resources/glossary.md#redeem-script) parameter so that it can append the redeem script to the [signature script](../resources/glossary.md#signature-script) after the two signatures. + +``` bash +> dash-cli -regtest signrawtransactionwithkey $RAW_TX ''' + [ + "'$NEW_ADDRESS1_PRIVATE_KEY'" + ]''' ''' + [ + { + "txid": "'$UTXO_TXID'", + "vout": '$UTXO_VOUT', + "scriptPubKey": "'$UTXO_OUTPUT_SCRIPT'", + "redeemScript": "'$P2SH_REDEEM_SCRIPT'" + } + ] + ''' +``` + +``` json +{ + "hex": "0100000001529c9f774521b7f5104b709e899d8547078ca4a993dbd761aea902\ + 24eba2b2dd00000000b40047304402201cc50eac6d2db04dabd8ccd68b3116c0\ + a8d37e7e41335e0d0ab441a5aa08cdcd02204011d184dca2489758c05e01556f\ + f2ff9c48c39ff434fdfb1d9e0284fbde7701014c69522103fa8866cccae3c975\ + a72884443a351801a0ea9721cbe7215586ddd6fab5f39f262103b2259f42a241\ + f4870e794521594f2af7aadf0e4c580a43582e58630e4618634621038007ef6f\ + d812d73da054271b68a42dae06672cff2a30b2814935537e5930ebf653aeffff\ + ffff01c0bc973b000000001976a914900504f96c55d6ebe1c33581ba9430ca05\ + b12a1488ac00000000", + "complete": false, + "errors": [ + { + "txid": "ddb2a2eb2402a9ae61d7db93a9a48c0747859d899e704b10f5b72145779\ + f9c52", + "vout": 0, + "scriptSig": "0047304402201cc50eac6d2db04dabd8ccd68b3116c0a8d37e7e41\ + 335e0d0ab441a5aa08cdcd02204011d184dca2489758c05e01556f\ + f2ff9c48c39ff434fdfb1d9e0284fbde7701014c69522103fa8866\ + cccae3c975a72884443a351801a0ea9721cbe7215586ddd6fab5f3\ + 9f262103b2259f42a241f4870e794521594f2af7aadf0e4c580a43\ + 582e58630e4618634621038007ef6fd812d73da054271b68a42dae\ + 06672cff2a30b2814935537e5930ebf653ae", + "sequence": 4294967295, + "error": "Signature must be zero for failed CHECK(MULTI)SIG operation" + } + ] +} +``` + +``` bash + +> PARTLY_SIGNED_RAW_TX=010000000175e1769813db8418fea17576694af1f[...] +``` + +### 9b. Private Key 3 + +The [`signrawtransactionwithkey`](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey) call used here is nearly identical to the one used above. The only difference is the private key used. Now that the two required signatures have been provided, the transaction is marked as complete. + +``` bash +> dash-cli -regtest signrawtransactionwithkey $PARTLY_SIGNED_RAW_TX ''' + [ + "'$NEW_ADDRESS3_PRIVATE_KEY'" + ]''' ''' + [ + { + "txid": "'$UTXO_TXID'", + "vout": '$UTXO_VOUT', + "scriptPubKey": "'$UTXO_OUTPUT_SCRIPT'", + "redeemScript": "'$P2SH_REDEEM_SCRIPT'" + } + ] + ''' +``` + +``` json +{ + "hex": "0100000001529c9f774521b7f5104b709e899d8547078ca4a993dbd761aea902\ + 24eba2b2dd00000000fdfd000047304402201cc50eac6d2db04dabd8ccd68b31\ + 16c0a8d37e7e41335e0d0ab441a5aa08cdcd02204011d184dca2489758c05e01\ + 556ff2ff9c48c39ff434fdfb1d9e0284fbde770101483045022100e0e1f95f1a\ + b85814ee0920d5bd28c6831086e838af4bec344fd8654a0b58525f022075989f\ + d3a677e1522aa85d45c41720aec9e7c127acadb6c14338c3b1a768ab28014c69\ + 522103fa8866cccae3c975a72884443a351801a0ea9721cbe7215586ddd6fab5\ + f39f262103b2259f42a241f4870e794521594f2af7aadf0e4c580a43582e5863\ + 0e4618634621038007ef6fd812d73da054271b68a42dae06672cff2a30b28149\ + 35537e5930ebf653aeffffffff01c0bc973b000000001976a914900504f96c55\ + d6ebe1c33581ba9430ca05b12a1488ac00000000", + "complete": true +} +``` + +``` bash + +> SIGNED_RAW_TX=0100000001529c9f774521b7f5104b709e899d8547078ca4[...] +``` + +## 10. Send raw transaction + +We send the transaction spending the P2SH multisig output to the local [node](../resources/glossary.md#node), which accepts it. + +``` bash +> dash-cli -regtest sendrawtransaction $SIGNED_RAW_TX +483061b32894aacf6c4050291252a480c2a4c869eb85bd45082fb87d6b175ae8 +``` diff --git a/docs/core/examples/transaction-tutorial-simple-raw-transaction.md b/docs/core/examples/transaction-tutorial-simple-raw-transaction.md new file mode 100644 index 000000000..f5f41b335 --- /dev/null +++ b/docs/core/examples/transaction-tutorial-simple-raw-transaction.md @@ -0,0 +1,208 @@ +```{eval-rst} +.. meta:: + :title: Simple Raw Transaction + :description: This example demonstrates using raw transaction RPCs to manually construct and send a simple transaction with a single output. +``` + +# Simple Raw Transaction + +The [raw transaction RPCs](../api/remote-procedure-calls-raw-transactions.md) allow users to create custom [transactions](../resources/glossary.md#transaction) and delay broadcasting those transactions. However, mistakes made in [raw transactions](../resources/glossary.md#raw-transaction) may not be detected by Dash Core, and a number of raw transaction users have permanently lost large numbers of [duffs](../resources/glossary.md#duffs), so please be careful using raw transactions on [mainnet](../resources/glossary.md#mainnet). + +This subsection covers one of the simplest possible raw transactions. + +:::{note} +The following steps pick up where the [Simple Spending Tutorial](../examples/transaction-tutorial-simple-spending.md) left off. +::: + +## 1. List unspent outputs + +Re-rerun `listunspent`. We now have three UTXOs: the two transactions we created before plus the [coinbase transaction](../resources/glossary.md#coinbase-transaction) from block #2. We save the [TXID](../resources/glossary.md#transaction-identifiers) and [output index](../resources/glossary.md#output-index) number (vout) of that [coinbase](../resources/glossary.md#coinbase) UTXO to shell variables. + +```shell +dash-cli -regtest listunspent +``` + +``` json +[ + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f700d130", + "vout": 0, + "address": "yRdk89fwSW1mUBxQo5fCmEfTva7b4wh2H5", + "account": "", + "scriptPubKey": "76a9143a4e8960f26c1fa82d937046959b656e4dd7966688ac", + "amount": 10.00000000, + "confirmations": 1, + "ps_rounds": -2, + "spendable": true, + "solvable": true + }, + { + "txid": "f84ca4ad33ec7889d3c6ac670152137a3ee1603c4096230a10562976f700d130", + "vout": 1, + "address": "yavnyFMebbfX4F2VC25P18FW6LS66h2wqJ", + "scriptPubKey": "76a914a0411dbed3eab4341d5c41496d61b4fa1b22037e88ac", + "amount": 490.00000000, + "confirmations": 1, + "ps_rounds": -2, + "spendable": true, + "solvable": true + }, + { + "txid": "9036265a8f577421e556cd4f729752d73469953deea759de11efa9ba354936a8", + "vout": 0, + "address": "yWtgzKSckhedxtJ8NXhShWGjfBivkvBGgG", + "scriptPubKey": "21023fff9c9dc9088c0aeba90d75413705091111311d761054de23ac\ + dd217450869aac", + "amount": 500.00000000, + "confirmations": 101, + "ps_rounds": -2, + "spendable": true, + "solvable": true + } +] +``` + +``` bash + +> UTXO_TXID=9036265a8f577421e556cd4f729752d73469953deea759de11ef[...] +> UTXO_VOUT=0 +``` + +## 2. Get new address + +```shell +dash-cli -regtest getnewaddress +``` + +``` bash +yfV9Wirf5RkYHgNDttjpBz8Wdi8BavLHcP + +> NEW_ADDRESS=yfV9Wirf5RkYHgNDttjpBz8Wdi8BavLHcP +``` + +## 3. Create raw transaction + +Using two arguments to the [`createrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction), we create a new raw format transaction. The first argument (a JSON array) references the txid of the coinbase transaction from block #2 and the [index](../resources/glossary.md#index) number (0) of the [output](../resources/glossary.md#output) from that transaction we want to spend. The second argument (a JSON object) creates the output with the address ( [public key](../resources/glossary.md#public-key) hash) and number of DASH we want to transfer. We save the resulting raw format transaction to a shell variable. + +:::{attention} +`createrawtransaction` does not automatically create change outputs, so you can easily accidentally pay a large transaction fee. +::: + +In this example, our input had 500.0000 DASH and our output (`$NEW_ADDRESS`) is being paid 499.9999 DASH, so the transaction will include a fee of 0.0001 DASH. If we had paid `$NEW_ADDRESS` only 100 DASH with no other changes to this transaction, the [transaction fee](../resources/glossary.md#transaction-fee) would be a whopping 400 DASH. See the [Complex Raw Transaction subsection](../examples/transaction-tutorial-complex-raw-transaction.md) below for how to create a transaction with multiple outputs so you can send the change back to yourself. + +```shell +## Outputs - inputs = transaction fee, so always double-check your math! +dash-cli -regtest createrawtransaction ''' \ + [ \ + { \ + "txid": "'$UTXO_TXID'", \ + "vout": '$UTXO_VOUT' \ + } \ + ] \ + ''' ''' \ + { \ + "'$NEW_ADDRESS'": 499.9999 \ + }''' +``` + +``` bash +0100000001a8364935baa9ef11de59a7ee3d956934d75297724fcd56e5217457\ +8f5a2636900000000000ffffffff01f04c3ba40b0000001976a914d240140859\ +744755d73e5967081c3bedceffc5db88ac00000000 + +> RAW_TX=0100000001a8364935baa9ef11de59a7ee3d956934d75297724fcd5[...] +``` + +## 4. Decode raw transaction + +Use the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction) to see exactly what the transaction we just created does. + +```shell +dash-cli -regtest decoderawtransaction $RAW_TX +``` + +``` json +{ + "txid": "7cbd2245ee5d824c00fc08b3bf2f694ad9a215d38d897fcf2df64a43c59bb97b", + "size": 85, + "version": 1, + "locktime": 0, + "vin": [ + { + "txid": "9036265a8f577421e556cd4f729752d73469953deea759de11efa9ba354936a8", + "vout": 0, + "scriptSig": { + "asm": "", + "hex": "" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 499.99990000, + "valueSat": 49999990000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 d240140859744755d73e5967081c3bedceffc5db\ + OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914d240140859744755d73e5967081c3bedceffc5db88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yfV9Wirf5RkYHgNDttjpBz8Wdi8BavLHcP" + ] + } + } + ] +} +``` + +## 5. Sign transaction + +Use the [`signrawtransactionwithwallet` RPC](../api/remote-procedure-calls-wallet.md#signrawtransactionwithwallet) to sign the transaction created by `createrawtransaction` and save the returned "hex" raw format signed transaction to a shell variable. + +```shell +dash-cli -regtest signrawtransactionwithwallet $RAW_TX +``` + +``` json +{ + "hex": "0100000001a8364935baa9ef11de59a7ee3d956934d75297724fcd\ + 56e52174578f5a2636900000000049483045022100b4e5e9224afa\ + de8686bb22a957d1ec1587a66ee84943761b2d9061d5f751cd7602\ + 203c88d4064641a413ce3d0824264d6d87908960487afe9a3a133e\ + 7d67a22fd05101ffffffff01f04c3ba40b0000001976a914d24014\ + 0859744755d73e5967081c3bedceffc5db88ac00000000", + "complete": true +} +``` + +``` bash + +> SIGNED_RAW_TX=0100000001a8364935baa9ef11de59a7ee3d956934d75297[...] +``` + +Even though the transaction is now complete, the Dash Core [node](../resources/glossary.md#node) we're connected to doesn't know anything about the transaction, nor does any other part of the [network](../resources/glossary.md#network). We've created a spend, but we haven't actually spent anything because we could simply unset the `$SIGNED_RAW_TX` variable to eliminate the transaction. + +## 6. Send raw transaction + +Send the signed transaction to the connected node using the [`sendrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction). After accepting the transaction, the node would usually then broadcast it to other [peers](../resources/glossary.md#peer), but we're not currently connected to other peers because we started in [regression test mode](../resources/glossary.md#regression-test-mode). + +```shell +dash-cli -regtest sendrawtransaction $SIGNED_RAW_TX +``` + +``` bash +fa0f4105b0a2b2706d65581c5e6411d3970253c7f231944fa2f978b4a3d9010d +``` + +## 7. Mine a block + +Generate a block to confirm the transaction and then clear our shell variables. + +```shell +dash-cli -regtest generate 1 + +unset UTXO_TXID UTXO_VOUT NEW_ADDRESS RAW_TX SIGNED_RAW_TX +``` diff --git a/docs/core/examples/transaction-tutorial-simple-spending.md b/docs/core/examples/transaction-tutorial-simple-spending.md new file mode 100644 index 000000000..c35beae30 --- /dev/null +++ b/docs/core/examples/transaction-tutorial-simple-spending.md @@ -0,0 +1,165 @@ +```{eval-rst} +.. meta:: + :title: Simple Spending + :description: Dash Core provides several RPCs which handle all the details of spending, including creating a change output and paying an appropriate transaction fee. +``` + +# Simple Spending + +Dash Core provides several RPCs which handle all the details of spending, including creating a [change output](../resources/glossary.md#change-output) and paying an appropriate [transaction fee](../resources/glossary.md#transaction-fee). Even advanced users should use these RPCs whenever possible to decrease the chance that [duffs](../resources/glossary.md#duffs) will be lost by mistake. + +## 1. Get new address + +Get a new Dash [address](../resources/glossary.md#address) and save it in the shell variable `$NEW_ADDRESS`. + +``` bash +> dash-cli -regtest getnewaddress +yLp6ZJueuigiF4s9E1Pv8tEunDPEsjyQfd + +> NEW_ADDRESS=yLp6ZJueuigiF4s9E1Pv8tEunDPEsjyQfd +``` + +## 2. Send to address + +Send 10 dash to the address using the [`sendtoaddress` RPC](../api/remote-procedure-calls-wallet.md#sendtoaddress). The returned hex string is the transaction identifier ([TXID](../resources/glossary.md#transaction-identifiers)). + +The [`sendtoaddress` RPC](../api/remote-procedure-calls-wallet.md#sendtoaddress) automatically selects an [unspent transaction output](../resources/glossary.md#unspent-transaction-output) (UTXO) from which to spend the duffs. In this case, it withdrew the duffs from our only available UTXO, the [coinbase transaction](../resources/glossary.md#coinbase-transaction) for [block](../resources/glossary.md#block) #1 which matured with the creation of block #101. + +``` bash +> dash-cli -regtest sendtoaddress $NEW_ADDRESS 10.00 +c7e5ae1240fdd83bb94c94a93816ed2ab7bcb56ec3ff8a9725c5c1e0482684ea +``` + +## 3. List unspent outputs + +### 3a. Confirmed outputs only + +Use the [`listunspent` RPC](../api/remote-procedure-calls-wallet.md#listunspent) to display the UTXOs belonging to this [wallet](../resources/glossary.md#wallet). The list is empty because it defaults to only showing confirmed UTXOs and we just spent our only confirmed UTXO. + +``` bash +> dash-cli -regtest listunspent +[ +] +``` + +### 3b. All outputs + +Re-running the [`listunspent` RPC](../api/remote-procedure-calls-wallet.md#listunspent) with the argument "0" to also display each [unconfirmed transaction](../resources/glossary.md#unconfirmed-transaction) shows that we have two UTXOs, both with the same [TXID](../resources/glossary.md#transaction-identifiers). The first UTXO shown is a change output that `sendtoaddress` created using a new address from the key pool. The second UTXO shown is the spend to the address we provided. If we had spent those duffs to someone else, that second transaction would not be displayed in our list of UTXOs. + +``` bash +> dash-cli -regtest listunspent 0 +``` + +``` json +[ + { + "txid":"c7e5ae1240fdd83bb94c94a93816ed2ab7bcb56ec3ff8a9725c5c1e0482684ea", + "vout":0, + "address":"yLp6ZJueuigiF4s9E1Pv8tEunDPEsjyQfd", + "account":"", + "scriptPubKey":"76a914056b1fe57914236149feb21dcbc6b86f4bdd9f4988ac", + "amount":10.00000000, + "confirmations":0, + "ps_rounds":-2, + "spendable":true, + "solvable":true + }, + { + "txid":"c7e5ae1240fdd83bb94c94a93816ed2ab7bcb56ec3ff8a9725c5c1e0482684ea", + "vout":1, + "address":"yeP6Tw2uW4nWAFWRytw8TyshErTq59dUkN", + "scriptPubKey":"76a914c622e98a6ccf34d02620612f58f20a50061cf4b188ac", + "amount":490.00000000, + "confirmations":0, + "ps_rounds":-2, + "spendable":true, + "solvable":true + } +] +``` + +## 4. Mine block + +Create a new block to confirm the transaction above (takes less than a second) and clear the shell variable. + +``` bash +> dash-cli -regtest generate 1 + +> unset NEW_ADDRESS +``` + +## Simple Spending Script + +Shell script to run the previous example ([view as a GitHub Gist](https://gist.github.com/dash-docs/f40bddfc0844ec0d66d196720dc936f8#file-regtest_transaction_simple_spending_example-sh)): + +``` shell +#!/bin/bash + +# Set RPCUSER and RPCPWD to the username and password configure in dash.conf +RPCUSER="user" +RPCPWD="pass" +REGTEST_CMD="dash-cli -regtest -rpcuser=$RPCUSER -rpcpassword=$RPCPWD" + +# SIMPLE SPENDING EXAMPLE +# ----------------------- + +BLOCKTOGEN=101 +printf "\nGenerating %s block(s)...\n" $BLOCKTOGEN +COMMAND="$REGTEST_CMD generate $BLOCKTOGEN" +echo $COMMAND +GENERATED=$($COMMAND) +echo "Generated $BLOCKTOGEN block(s)" + +printf "\nChecking balance...\n" +COMMAND="$REGTEST_CMD getbalance" +echo $COMMAND +BALANCE=$($COMMAND) +echo "Balance is: " $BALANCE + +printf "\nGetting new address...\n" +COMMAND="$REGTEST_CMD getnewaddress" +echo $COMMAND +NEW_ADDRESS=$($COMMAND) +echo "New address is: " $NEW_ADDRESS + +printf "\nSending to address...\n" +COMMAND="$REGTEST_CMD sendtoaddress $NEW_ADDRESS 10.00" +echo $COMMAND +TXID=$($COMMAND) +echo "Transaction ID (TXID) is: " $TXID + +printf "\nList unspent...\n" +COMMAND="$REGTEST_CMD listunspent" +echo $COMMAND +UNSPENT=$($COMMAND) +echo "Unspent (excluding unconfirmed): " $UNSPENT + +printf "\nList unspent (unconfirmed)...\n" +COMMAND="$REGTEST_CMD listunspent 0" +echo $COMMAND +UNSPENT=$($COMMAND) +echo "Unspent (including unconfirmed): " $UNSPENT + + +BLOCKTOGEN=1 +printf "\nGenerating %s block(s) to confirm...\n" $BLOCKTOGEN +COMMAND="$REGTEST_CMD generate $BLOCKTOGEN" +echo $COMMAND +GENERATED=$($COMMAND) +echo "Generated $BLOCKTOGEN block(s)" + +printf "\nList unspent...\n" +COMMAND="$REGTEST_CMD listunspent" +echo $COMMAND +UNSPENT=$($COMMAND) +echo "Unspent (excluding unconfirmed): " $UNSPENT + +unset REGTEST_CMD +unset BLOCKTOGEN +unset COMMAND +unset GENERATED +unset BALANCE +unset NEW_ADDRESS +unset TXID +unset UNSPENT +``` diff --git a/docs/core/examples/transaction-tutorial.md b/docs/core/examples/transaction-tutorial.md new file mode 100644 index 000000000..7cdb45e7d --- /dev/null +++ b/docs/core/examples/transaction-tutorial.md @@ -0,0 +1,24 @@ +```{eval-rst} +.. meta:: + :title: Transaction Tutorial + :description: This section explains using Dash Core's RPC interface to create transactions with different attributes, a common task for Dash applications. +``` + +# Transaction Tutorial + +Creating transactions is something most Dash applications do. This section describes how to use Dash Core's RPC interface to create transactions with various attributes. + +Your applications may use something besides Dash Core to create transactions, but in any system, you will need to provide the same kinds of data to create transactions with the same attributes as those described below. + +In order to use this tutorial, you will need to setup [Dash Core](https://www.dash.org/wallets/#wallets) and create a [regression test mode](../resources/glossary.md#regression-test-mode) environment with 500 DASH in your test wallet. + +```{toctree} +:maxdepth: 3 +:titlesonly: + +transaction-tutorial-simple-spending +transaction-tutorial-simple-raw-transaction +transaction-tutorial-complex-raw-transaction +transaction-tutorial-offline-signing +transaction-tutorial-p2sh-multisig +``` diff --git a/docs/core/guide/block-chain-block-chain-overview.md b/docs/core/guide/block-chain-block-chain-overview.md new file mode 100644 index 000000000..210ac5d12 --- /dev/null +++ b/docs/core/guide/block-chain-block-chain-overview.md @@ -0,0 +1,25 @@ +```{eval-rst} +.. meta:: + :title: Blockchain Overview + :description: Transactions in Dash are collected into blocks, linked by cryptographic hashes to form a secure blockchain. Any attempt to use an output twice constitutes double spending and is rejected. +``` + +# Blockchain Overview + +![Block Chain Overview](../../img/dev/en-blockchain-overview.svg) + +The illustration above shows a simplified version of a [block chain](../resources/glossary.md#block-chain). A [block](../resources/glossary.md#block) of one or more new transactions is collected into the [transaction](../resources/glossary.md#transaction) data part of a block. Copies of each transaction are hashed, and the hashes are then paired, hashed, paired again, and hashed again until a single hash remains, the [merkle root](../resources/glossary.md#merkle-root) of a [merkle tree](../resources/glossary.md#merkle-tree). + +The merkle root is stored in the [block header](../resources/glossary.md#block-header). Each block also stores the hash of the previous block's header, chaining the blocks together. This ensures a transaction cannot be modified without modifying the block that records it and all following blocks. + +Transactions are also chained together. Dash [wallet](../resources/glossary.md#wallet) software gives the impression that [duffs](../resources/glossary.md#duffs) are sent from and to wallets, but Dash value really moves from transaction to transaction. Each transaction spends the duffs previously received in one or more earlier transactions, so the input of one transaction is the output of a previous transaction. + +![Transaction Propagation](../../img/dev/en-transaction-propagation.svg) + +A single transaction can create multiple [outputs](../resources/glossary.md#output), as would be the case when sending to multiple [addresses](../resources/glossary.md#address), but each output of a particular transaction can only be used as an [input](../resources/glossary.md#input) once in the blockchain. Any subsequent reference is a forbidden double spend---an attempt to spend the same duffs twice. + +Outputs are tied to [transaction identifiers](../resources/glossary.md#transaction-identifiers) ( TXIDs), which are the hashes of signed transactions. + +Because each output of a particular transaction can only be spent once, the outputs of a transaction included in the blockchain can be categorized as either an [unspent transaction output](../resources/glossary.md#unspent-transaction-output) or a spent transaction output. For a payment to be valid, it must only use UTXOs as inputs. + +Ignoring coinbase transactions (described later), if the value of a transaction's outputs exceed its inputs, the transaction will be rejected---but if the inputs exceed the value of the outputs, any difference in value may be claimed as a [transaction fee](../resources/glossary.md#transaction-fee) to be split between the [miner](../resources/glossary.md#miner) who creates the block containing that transaction and the masternode receiving a reward payout in that block. For example, in the illustration above, each transaction spends 10,000 duffs fewer than it receives from its combined inputs, effectively paying a 10,000 duff transaction fee. diff --git a/docs/core/guide/block-chain-block-height-and-forking.md b/docs/core/guide/block-chain-block-height-and-forking.md new file mode 100644 index 000000000..5f261ec29 --- /dev/null +++ b/docs/core/guide/block-chain-block-height-and-forking.md @@ -0,0 +1,21 @@ +```{eval-rst} +.. meta:: + :title: Block Height and Forking + :description: In Dash, forks occur when multiple blocks of the same height are produced simultaneously, causing nodes to follow the longest chain. +``` + +# Block Height and Forking + +Any Dash [miner](../resources/glossary.md#miner) who successfully hashes a [block header](../resources/glossary.md#block-header) to a value below the [target threshold](../resources/glossary.md#target) can add the entire [block](../resources/glossary.md#block) to the [block chain](../resources/glossary.md#block-chain) (assuming the block is otherwise valid). These blocks are commonly addressed by their [block height](../resources/glossary.md#block-height)---the number of blocks between them and the first Dash block (block 0, most commonly known as the [genesis block](../resources/glossary.md#genesis-block)). + +![Common And Uncommon Block Chain Forks](../../img/dev/en-blockchain-fork.svg) + +Multiple blocks can all have the same block height, as is common when two or more miners each produce a block at roughly the same time. This creates an apparent [fork](../resources/glossary.md#fork) in the block chain, as shown in the illustration above. + +When miners produce simultaneous blocks at the end of the block chain, each [node](../resources/glossary.md#node) individually chooses which block to accept. In the absence of other considerations, discussed below, nodes usually use the first block they see. + +Eventually a miner produces another block which attaches to only one of the competing simultaneously-mined blocks. This makes that side of the fork stronger than the other side. Assuming a fork only contains valid blocks, normal [peers](../resources/glossary.md#peer) always follow the most difficult chain to recreate and throw away any [stale block](../resources/glossary.md#stale-block) belonging to shorter forks. (Stale blocks are also sometimes called orphans or orphan blocks, but those terms are also used for true orphan blocks without a known parent block.) + +Long-term forks are possible if different miners work at cross-purposes, such as some miners diligently working to extend the block chain at the same time other miners are attempting a [51 percent attack](../resources/glossary.md#51-percent-attack) to revise transaction history. + +Since multiple blocks can have the same height during a block chain fork, block height should not be used as a globally unique identifier. Instead, blocks are usually referenced by the hash of their header (often with the byte order reversed, and in hexadecimal). diff --git a/docs/core/guide/block-chain-consensus-rule-changes.md b/docs/core/guide/block-chain-consensus-rule-changes.md new file mode 100644 index 000000000..9cd65d587 --- /dev/null +++ b/docs/core/guide/block-chain-consensus-rule-changes.md @@ -0,0 +1,43 @@ +```{eval-rst} +.. meta:: + :title: Consensus Rule Changes + :description: To preserve consensus, all Dash nodes validate blocks using the same conensus rules, which can occasionally be changed to add new features or prevent misuse. +``` + +# Consensus Rule Changes + +To maintain [consensus](../resources/glossary.md#consensus), all full [nodes](../resources/glossary.md#node) validate [blocks](../resources/glossary.md#block) using the same [consensus rules](../resources/glossary.md#consensus-rules). However, sometimes the consensus rules are changed to introduce new features or prevent network abuse. When the new rules are implemented, there will likely be a period of time when non-upgraded nodes follow the old rules and upgraded nodes follow the new rules, creating two possible ways consensus can break: + +1. A block following the new consensus rules is accepted by upgraded nodes but rejected by non-upgraded nodes. For example, a new transaction feature is used within a block: upgraded nodes understand the feature and accept it, but non-upgraded nodes reject it because it violates the old rules. + +2. A block violating the new consensus rules is rejected by upgraded nodes but accepted by non-upgraded nodes. For example, an abusive transaction feature is used within a block: upgraded nodes reject it because it violates the new rules, but non-upgraded nodes accept it because it follows the old rules. + +In the first case, rejection by non-upgraded nodes, mining software which gets [block chain](../resources/glossary.md#block-chain) data from those non-upgraded nodes refuses to build on the same chain as mining software getting data from upgraded nodes. This creates permanently divergent chains---one for non-upgraded nodes and one for upgraded nodes---called a [hard fork](../resources/glossary.md#hard-fork). + +![Hard Fork](../../img/dev/en-hard-fork.svg) + +In the second case, rejection by upgraded nodes, it's possible to keep the block chain from permanently diverging if upgraded nodes control a majority of the hash rate. That's because, in this case, non-upgraded nodes will accept as valid all the same blocks as upgraded nodes, so the upgraded nodes can build a stronger chain that the non-upgraded nodes will accept as the best valid block chain. This is called a [soft fork](../resources/glossary.md#soft-fork). + +![Soft Fork](../../img/dev/en-soft-fork.svg) + +Although a fork is an actual divergence in block chains, changes to the consensus rules are often described by their potential to create either a hard or soft fork. For example, "increasing the block size requires a hard fork." In this example, an actual block chain fork is not required---but it is a possible outcome. + +Consensus rule changes may be activated in various ways. During Bitcoin's first two years, Satoshi Nakamoto performed several soft forks by just releasing the backwards-compatible change in a client that began immediately enforcing the new rule. Multiple soft forks such as [BIP30](https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki) have been activated via a flag day where the new rule began to be enforced at a preset time or block height. Such a fork activated via a flag day is known as a [User Activated Soft Fork](../resources/glossary.md#user-activated-soft-fork) (UASF) as it is dependent on having sufficient users (nodes) to enforce the new rules after the flag day. + +Later soft forks waited for a majority of hash rate (typically 75% or 95%) to signal their readiness for enforcing the new consensus rules. Once the signaling threshold has been passed, all nodes will begin enforcing the new rules. Such a fork is known as a [Miner Activated Soft Fork](../resources/glossary.md#miner-activated-soft-fork) (MASF) as it is dependent on miners for activation. + +**Resources:** [BIP16](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki), [BIP30](https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki), and [BIP34](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki) were implemented as changes which might have lead to soft forks. [BIP50](https://github.com/bitcoin/bips/blob/master/bip-0050.mediawiki) describes both an accidental hard fork, resolved by temporary downgrading the capabilities of upgraded nodes, and an intentional hard fork when the temporary downgrade was removed. A document from Gavin Andresen outlines [how future rule changes may be implemented](https://gist.github.com/gavinandresen/2355445). + +## Detecting Forks + +Non-upgraded nodes may use and distribute incorrect information during both types of forks, creating several situations which could lead to financial loss. In particular, non-upgraded nodes may relay and accept transactions that are considered invalid by upgraded nodes and so will never become part of the universally-recognized best block chain. Non-upgraded nodes may also refuse to relay blocks or transactions which have already been added to the best block chain, or soon will be, and so provide incomplete information. + +Dash Core includes code that detects a hard fork by looking at block chain [proof of work](../resources/glossary.md#proof-of-work). If a non-upgraded node receives block chain headers demonstrating at least six blocks more proof of work than the best chain it considers valid, the node reports a warning in the [`getnetworkinfo` RPC](../api/remote-procedure-calls-network.md#getnetworkinfo) results and runs the `-alertnotify` command if set. This warns the operator that the non-upgraded node can't switch to what is likely the best block chain. + +Full nodes can also check block and [transaction version number](../resources/glossary.md#transaction-version-number). If the block or transaction version numbers seen in several recent blocks are higher than the version numbers the node uses, it can assume it doesn't use the current consensus rules. Dash Core reports this situation through the [`getnetworkinfo` RPC](../api/remote-procedure-calls-network.md#getnetworkinfo) and `-alertnotify` command if set. + +In either case, block and transaction data should not be relied upon if it comes from a node that apparently isn't using the current consensus rules. + +SPV clients which connect to full nodes can detect a likely hard fork by connecting to several full nodes and ensuring that they're all on the same chain with the same [block height](../resources/glossary.md#block-height), plus or minus several blocks to account for transmission delays and stale blocks. If there's a divergence, the client can disconnect from nodes with weaker chains. + +SPV clients should also monitor for block and transaction version number increases to ensure they process received transactions and create new transactions using the current consensus rules. diff --git a/docs/core/guide/block-chain-proof-of-work.md b/docs/core/guide/block-chain-proof-of-work.md new file mode 100644 index 000000000..d38f1ab22 --- /dev/null +++ b/docs/core/guide/block-chain-proof-of-work.md @@ -0,0 +1,29 @@ +```{eval-rst} +.. meta:: + :title: Proof of Work + :description: Dash's proof of work relies on the unpredictability of cryptographic hashes, which generate a seemingly random number from any data, and any alteration in the data yields a new unpredictable number. +``` + +# Proof of Work + +The [block chain](../resources/glossary.md#block-chain) is collaboratively maintained by anonymous [peers](../resources/glossary.md#peer) on the [network](../resources/glossary.md#network), so Dash requires that each [block](../resources/glossary.md#block) prove a significant amount of work was invested in its creation to ensure that untrustworthy peers who want to modify past blocks have to work harder than honest peers who only want to add new blocks to the block chain. + +Chaining blocks together makes it impossible to modify [transactions](../resources/glossary.md#transaction) included in any block without modifying all following blocks. As a result, the cost to modify a particular block increases with every new block added to the block chain, magnifying the effect of the proof of work. + +The [proof of work](../resources/glossary.md#proof-of-work) used in Dash takes advantage of the apparently random nature of cryptographic hashes. A good cryptographic hash algorithm converts arbitrary data into a seemingly-random number. If the data is modified in any way and the hash re-run, a new seemingly-random number is produced, so there is no way to modify the data to make the hash number predictable. + +To prove you did some extra work to create a block, you must create a hash of the [block header](../resources/glossary.md#block-header) which does not exceed a certain value. For example, if the maximum possible hash value is 2256 − 1, you can prove that you tried up to two combinations by producing a hash value less than 2255. + +In the example given above, you will produce a successful hash on average every other try. You can even estimate the probability that a given hash attempt will generate a number below the [target threshold](../resources/glossary.md#target). Dash assumes a linear probability that the lower it makes the target threshold, the more hash attempts (on average) will need to be tried. + +New blocks will only be added to the block chain if their hash is at least as challenging as a [difficulty](../resources/glossary.md#difficulty) value expected by the [consensus](../resources/glossary.md#consensus) protocol. Every block, the network uses the difficulty of the last 24 blocks and number of seconds elapsed between generation of the first and last of those last 24 blocks. The ideal value is 3600 (one hour). + +* If it took less than one hour to generate the 24 blocks, the expected difficulty value is increased so that the next 24 blocks should take exactly one hour to generate if hashes are checked at the same rate. + +* If it took more than one hour to generate the blocks, the expected difficulty value is decreased for the same reason. + +This method of calculating difficulty (Dark Gravity Wave) was authored by Dash creator Evan Duffield to fix exploits possible with the previously used Kimoto Gravity Well difficulty readjustment algorithm. For additional detail, reference this [Official Documentation Dark Gravity Wave page](https://docs.dash.org/en/stable/introduction/features.html#dark-gravity-wave). + +Because each block header must hash to a value below the target threshold, and because each block is linked to the block that preceded it, it requires (on average) as much hashing power to propagate a modified block as the entire Dash network expended between the time the original block was created and the present time. Only if you acquired a majority of the network's hashing power could you reliably execute such a [51 percent attack](../resources/glossary.md#51-percent-attack) against transaction history (although, it should be noted, that even less than 50% of the hashing power still has a good chance of performing such attacks). + +The block header provides several easy-to-modify fields, such as a dedicated nonce field, so obtaining new hashes doesn't require waiting for new transactions. Also, only the 80-byte block header is hashed for proof-of-work, so including a large volume of transaction data in a block does not slow down hashing with extra I/O, and adding additional transaction data only requires the recalculation of the ancestor hashes in the [merkle tree](../resources/glossary.md#merkle-tree). diff --git a/docs/core/guide/block-chain-transaction-data.md b/docs/core/guide/block-chain-transaction-data.md new file mode 100644 index 000000000..4c26b9a81 --- /dev/null +++ b/docs/core/guide/block-chain-transaction-data.md @@ -0,0 +1,37 @@ +```{eval-rst} +.. meta:: + :title: Transaction Data + :description: Every block must include one or more transactions. The first one of these transactions must be a coinbase transaction which should collect and spend the block reward. +``` + +# Transaction Data + +Every [block](../resources/glossary.md#block) must include one or more [transactions](../resources/glossary.md#transaction). The first one of these transactions must be a [coinbase transaction](../resources/glossary.md#coinbase-transaction), also called a generation transaction, which should collect and spend the [block reward](../resources/glossary.md#block-reward) (comprised of a block subsidy and any transaction fees paid by transactions included in this block). + +The UTXO of a coinbase transaction has the special condition that it cannot be spent (used as an input) for at least 100 blocks. This temporarily prevents [miners](../resources/glossary.md#miner) and masternodes from spending the transaction fees and block reward from a block that may later be determined to be stale (and therefore the coinbase transaction destroyed) after a block chain [fork](../resources/glossary.md#fork). + +Blocks are not required to include any non-coinbase transactions, but miners almost always do include additional transactions in order to collect their transaction fees. + +All transactions, including the coinbase transaction, are encoded into blocks in binary [raw transaction](../resources/glossary.md#raw-transaction) format. + +The rawtransaction format is hashed to create the transaction identifier ([TXID](../resources/glossary.md#transaction-identifiers)). From these txids, the [merkle tree](../resources/glossary.md#merkle-tree) is constructed by pairing each txid with one other txid and then hashing them together. If there are an odd number of txids, the txid without a partner is hashed with a copy of itself. + +The resulting hashes themselves are each paired with one other hash and hashed together. Any hash without a partner is hashed with itself. The process repeats until only one hash remains, the [merkle root](../resources/glossary.md#merkle-root). + +For example, if transactions were merely joined (not hashed), a five-transaction merkle tree would look like the following text diagram: + +``` + ABCDEEEE .......Merkle root + / \ + ABCD EEEE + / \ / + AB CD EE .......E is paired with itself +/ \ / \ / +A B C D E .........Transactions +``` + +As discussed in the [Simplified Payment Verification](../resources/glossary.md#simplified-payment-verification) (SPV) subsection, the merkle tree allows clients to verify for themselves that a transaction was included in a block by obtaining the merkle root from a [block header](../resources/glossary.md#block-header) and a list of the intermediate hashes from a full [peer](../resources/glossary.md#peer). The full peer does not need to be trusted: it is expensive to fake block headers and the intermediate hashes cannot be faked or the verification will fail. + +For example, to verify transaction D was added to the block, an SPV client only needs a copy of the C, AB, and EEEE hashes in addition to the merkle root; the client doesn't need to know anything about any of the other transactions. If the five transactions in this block were all at the maximum size, downloading the entire block would require over 500,000 bytes---but downloading three hashes plus the block header requires only 140 bytes. + +Note: If identical txids are found within the same block, there is a possibility that the merkle tree may collide with a block with some or all duplicates removed due to how unbalanced merkle trees are implemented (duplicating the lone hash). Since it is impractical to have separate transactions with identical txids, this does not impose a burden on honest software, but must be checked if the invalid status of a block is to be cached; otherwise, a valid block with the duplicates eliminated could have the same merkle root and block hash, but be rejected by the cached invalid outcome, resulting in security bugs such as [CVE-2012-2459](https://en.bitcoin.it/wiki/CVEs#CVE-2012-2459). diff --git a/docs/core/guide/block-chain.md b/docs/core/guide/block-chain.md new file mode 100644 index 000000000..daf96ed7d --- /dev/null +++ b/docs/core/guide/block-chain.md @@ -0,0 +1,21 @@ +```{eval-rst} +.. meta:: + :title: Blockchain + :description: Dash's blockchain acts as a timestamped public ledger, safeguarding against double spending and transaction record alteration. +``` + +# Blockchain + +The blockchain provides Dash's public ledger, an ordered and timestamped record of transactions. This system is used to protect against double spending and modification of previous transaction records. + +Each full node in the Dash network independently stores a blockchain containing only blocks validated by that node. When several nodes all have the same blocks in their blockchain, they are considered to be in [consensus](../resources/glossary.md#consensus). The validation rules these nodes follow to maintain consensus are called [consensus rules](../resources/glossary.md#consensus-rules). This section describes many of the consensus rules used by Dash Core. + +```{toctree} +:maxdepth: 3 + +block-chain-block-chain-overview +block-chain-proof-of-work +block-chain-block-height-and-forking +block-chain-transaction-data +block-chain-consensus-rule-changes +``` diff --git a/docs/core/guide/contracts-escrow-and-arbitration.md b/docs/core/guide/contracts-escrow-and-arbitration.md new file mode 100644 index 000000000..4f1f80918 --- /dev/null +++ b/docs/core/guide/contracts-escrow-and-arbitration.md @@ -0,0 +1,41 @@ +```{eval-rst} +.. meta:: + :title: Escrow and Arbitration + :description: A transaction in which a spender and receiver place funds in an m-of-n multisig output so that neither can spend the funds until they’re both satisfied with some external outcome. +``` + +# Escrow and Arbitration + +Charlie-the-customer wants to buy a product from Bob-the-businessman, but neither of them trusts the other person, so they use a contract to help ensure Charlie gets his merchandise and Bob gets his payment. + +A simple contract could say that Charlie will spend [duffs](../resources/glossary.md#duffs) to an [output](../resources/glossary.md#output) which can only be spent if Charlie and Bob both sign the [input](../resources/glossary.md#input) spending it. That means Bob won't get paid unless Charlie gets his merchandise, but Charlie can't get the merchandise and keep his payment. + +This simple contract isn't much help if there's a dispute, so Bob and Charlie enlist the help of Alice-the-arbitrator to create an [escrow contract](../resources/glossary.md#escrow-contract). Charlie spends his duffs to an output which can only be spent if two of the three people sign the input. Now Charlie can pay Bob if everything is ok, Bob can refund Charlie's money if there's a problem, or Alice can arbitrate and decide who should get the duffs if there's a dispute. + +To create a multiple-signature ([multisig](../resources/glossary.md#multisig)) output, they each give the others a [public key](../resources/glossary.md#public-key). Then Bob creates the following [P2SH multisig](../resources/glossary.md#p2sh-multisig) [redeem script](../resources/glossary.md#redeem-script): + +``` +OP_2 [A's pubkey] [B's pubkey] [C's pubkey] OP_3 OP_CHECKMULTISIG +``` + +(Opcodes to push the public keys onto the stack are not shown.) + +`OP_2` and `OP_3` push the actual numbers 2 and 3 onto the stack. `OP_2` specifies that 2 signatures are required to sign; `OP_3` specifies that 3 public keys (unhashed) are being provided. This is a 2-of-3 multisig pubkey script, more generically called a m-of-n pubkey script (where *m* is the *minimum* matching signatures required and *n* in the *number* of public keys provided). + +Bob gives the redeem script to Charlie, who checks to make sure his public key and Alice's public key are included. Then he hashes the redeem script to create a [P2SH](../resources/glossary.md#pay-to-script-hash) redeem script and pays the duffs to it. Bob sees the payment get added to the [block chain](../resources/glossary.md#block-chain) and ships the merchandise. + +Unfortunately, the merchandise gets slightly damaged in transit. Charlie wants a full refund, but Bob thinks a 10% refund is sufficient. They turn to Alice to resolve the issue. Alice asks for photo evidence from Charlie along with a copy of the redeem script Bob created and Charlie checked. + +After looking at the evidence, Alice thinks a 40% refund is sufficient, so she creates and signs a transaction with two outputs, one that spends 60% of the duffs to Bob's public key and one that spends the remaining 40% to Charlie's public key. + +In the [signature script](../resources/glossary.md#signature-script) Alice puts her signature and a copy of the unhashed serialized redeem script that Bob created. She gives a copy of the incomplete transaction to both Bob and Charlie. Either one of them can complete it by adding his signature to create the following signature script: + +``` +OP_0 [A's signature] [B's or C's signature] [serialized redeem script] +``` + +(Opcodes to push the signatures and redeem script onto the stack are not shown. `OP_0` is a workaround for an off-by-one error in the original implementation which must be preserved for compatibility. Note that the signature script must provide signatures in the same order as the corresponding public keys appear in the redeem script. See the description in [`OP_CHECKMULTISIG`](../reference/transactions-opcodes.md) for details.) + +When the transaction is broadcast to the [network](../resources/glossary.md#network), each [peer](../resources/glossary.md#peer) checks the signature script against the P2SH output Charlie previously paid, ensuring that the redeem script matches the redeem script hash previously provided. Then the redeem script is evaluated, with the two signatures being used as input data. Assuming the redeem script validates, the two transaction outputs show up in Bob's and Charlie's wallets as spendable balances. + +However, if Alice created and signed a transaction neither of them would agree to, such as spending all the duffs to herself, Bob and Charlie can find a new arbitrator and sign a transaction spending the duffs to another 2-of-3 multisig redeem script hash, this one including a public key from that second arbitrator. This means that Bob and Charlie never need to worry about their arbitrator stealing their money. diff --git a/docs/core/guide/contracts-micropayment-channel.md b/docs/core/guide/contracts-micropayment-channel.md new file mode 100644 index 000000000..a4b4c08b0 --- /dev/null +++ b/docs/core/guide/contracts-micropayment-channel.md @@ -0,0 +1,27 @@ +```{eval-rst} +.. meta:: + :title: Micropayment Channel + :description: A micropayment channel allows two parties to exchange cryptocurrency off-chain, bypassing blockchain interactions. +``` + +# Micropayment Channel + +Alice also works part-time moderating forum posts for Bob. Every time someone posts to Bob's busy forum, Alice skims the post to make sure it isn't offensive or spam. Alas, Bob often forgets to pay her, so Alice demands to be paid immediately after each post she approves or rejects. Bob says he can't do that because hundreds of small payments will cost him thousands of [duffs](../resources/glossary.md#duffs) in transaction fees, so Alice suggests they use a micropayment channel. + +Bob asks Alice for her [public key](../resources/glossary.md#public-key) and then creates two [transactions](../resources/glossary.md#transaction). The first transaction pays 100 millidash to a P2SH output whose 2-of-2 multisig [redeem script](../resources/glossary.md#redeem-script) requires [signatures](../resources/glossary.md#signature) from both Alice and Bob. This is the bond transaction. Broadcasting this transaction would let Alice hold the millidash hostage, so Bob keeps this transaction private for now and creates a second transaction. + +The second transaction spends all of the first transaction's millidash (minus a transaction fee) back to Bob after a 24 hour delay enforced by locktime. This is the refund transaction. Bob can't sign the refund transaction by himself, so he gives it to Alice to sign, as shown in the illustration below. + +![Micropayment Channel Example](../../img/dev/en-micropayment-channel.svg) + +Alice checks that the refund transaction's locktime is 24 hours in the future, signs it, and gives a copy of it back to Bob. She then asks Bob for the bond transaction and checks that the refund transaction spends the output of the bond transaction. She can now broadcast the bond transaction to the network to ensure Bob has to wait for the time lock to expire before further spending his millidash. Bob hasn't actually spent anything so far, except possibly a small [transaction fee](../resources/glossary.md#transaction-fee), and he'll be able to broadcast the refund transaction in 24 hours for a full refund. + +Now, when Alice does some work worth 1 millidash, she asks Bob to create and sign a new version of the refund transaction. Version two of the transaction spends 1 millidash to Alice and the other 99 back to Bob; it does not have a locktime, so Alice can sign it and spend it whenever she wants. (But she doesn't do that immediately.) + +Alice and Bob repeat these work-and-pay steps until Alice finishes for the day, or until the time lock is about to expire. Alice signs the final version of the refund transaction and broadcasts it, paying herself and refunding any remaining balance to Bob. The next day, when Alice starts work, they create a new micropayment channel. + +If Alice fails to broadcast a version of the refund transaction before its time lock expires, Bob can broadcast the first version and receive a full refund. This is one reason micropayment channels are best suited to small payments---if Alice's Internet service goes out for a few hours near the time lock expiry, she could be cheated out of her payment. + +Transaction malleability, discussed in the [Transactions section](../guide/transactions-transaction-malleability.md), is another reason to limit the value of micropayment channels. If someone uses transaction malleability to break the link between the two transactions, Alice could hold Bob's 100 millidash hostage even if she hadn't done any work. + +For larger payments, Dash transaction fees are very low as a percentage of the total transaction value, so it makes more sense to protect payments with immediately-broadcast separate transactions. diff --git a/docs/core/guide/contracts.md b/docs/core/guide/contracts.md new file mode 100644 index 000000000..7e16cebe3 --- /dev/null +++ b/docs/core/guide/contracts.md @@ -0,0 +1,20 @@ +```{eval-rst} +.. meta:: + :title: Dash Contracts + :description: Dash contracts are self-enforcing transactions within the decentralized Dash system, reducing reliance on external entities and minimizing financial risk. +``` + +# Contracts + +Contracts are [transactions](../resources/glossary.md#transaction) which use the decentralized Dash system to enforce financial agreements. Dash contracts can often be crafted to minimize dependency on outside agents, such as the court system, which significantly decreases the risk of dealing with unknown entities in financial transactions. + +The following subsections will describe a variety of Dash contracts already in use. Because contracts deal with real people, not just transactions, they are framed below in story format. + +Besides the contract types described below, many other contract types have been proposed. Several of them are collected on the [Contracts page](https://en.bitcoin.it/wiki/Contracts) of the Bitcoin Wiki. + +```{toctree} +:maxdepth: 3 + +contracts-escrow-and-arbitration +contracts-micropayment-channel +``` diff --git a/docs/core/guide/dash-features-chainlocks.md b/docs/core/guide/dash-features-chainlocks.md new file mode 100644 index 000000000..1b5f63fc6 --- /dev/null +++ b/docs/core/guide/dash-features-chainlocks.md @@ -0,0 +1,18 @@ +```{eval-rst} +.. _guide-features-chainlocks: +.. meta:: + :title: ChainLocks + :description: Dash's ChainLock feature uses long-living masternode quorums to expedite transaction security and prevent 51% mining attacks. +``` + +# ChainLocks + +Dash's [ChainLock](../resources/glossary.md#chainlock) feature leverages [LLMQ](../resources/glossary.md#long-living-masternode-quorum) Signing Requests/Sessions to reduce uncertainty when receiving funds and remove the possibility of 51% mining attacks. + +For each block, an LLMQ of a few hundred [masternodes](../resources/glossary.md#masternode) (300-400) is selected and each participating member signs the first [block](../resources/glossary.md#block) that it sees extending the active chain at the current [block height](../resources/glossary.md#block-height). If enough members (at least 240) see the same block as the first block, they will be able to create a [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig) and propagate it to all [nodes](../resources/glossary.md#node) in the [network](../resources/glossary.md#network). + +If a valid [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig) is received by a node, it must reject all blocks (and any descendants) at the same height that do not match the block specified in the [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig). This makes the decision on the active chain quick, easy and unambiguous. It also makes reorganizations below this block impossible. + +With LLMQ-based [InstantSend](../resources/glossary.md#instantsend), a ChainLock is only attempted once all [transactions](../resources/glossary.md#transaction) in the block are locked via InstantSend. If a block contains unlocked transactions, retroactive InstantSend locks are established prior to a ChainLock. + +ChainLocks have been active on the Dash network since block 1088640 in June of 2019. Please read [DIP8 ChainLocks](https://github.com/dashpay/dips/blob/master/dip-0008.md) for additional details. diff --git a/docs/core/guide/dash-features-coinjoin.md b/docs/core/guide/dash-features-coinjoin.md new file mode 100644 index 000000000..093666f20 --- /dev/null +++ b/docs/core/guide/dash-features-coinjoin.md @@ -0,0 +1,131 @@ +```{eval-rst} +.. meta:: + :title: CoinJoin + :description: CoinJoin is Dash Core’s mixing feature which gives you consumer grade financial privacy by shuffling your Dash with other users. +``` + +# CoinJoin + +Dash Core's mixing feature provides a way to improve privacy by performing non-custodial CoinJoin. For additional details, reference this [Official Documentation page](https://docs.dash.org/en/stable/introduction/features.html#privatesend). + +The following video provides an overview with a good introduction to the details: + + + +## Wallet Preparation + +The [wallet](../resources/glossary.md#wallet) completes two operations in this phase: + +1. Split value into inputs matching the CoinJoin [denominations](../resources/glossary.md#denominations) by sending [transactions](../resources/glossary.md#transaction) to itself + +2. Split value into [inputs](../resources/glossary.md#input) to use for collateral by sending transactions to itself + +**Note**: Both these operations incur the standard [transaction fee](../resources/glossary.md#transaction-fee) like any other transaction + +**Creating Denominations** + +The CoinJoin denominations include a bit mapping to easily differentiate them. The [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) and [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) use this bit shifted integer instead of sending the actual denomination. The table below lists the bit, its associated integer value used in P2P messages, and the actual Dash value. + +| **Bit** | **Denom. (Integer)** | **Denomination (DASH)** | +| --- | --- | --- | +| 0 | 1 | 10.0001 | +| 1 | 2 | 01.00001 | +| 2 | 4 | 00.100001 | +| 3 | 8 | 00.0100001 | +| 4 | 16 | 00.00100001 | + +Protocol version 70213 added a 5th denomination (0.001 DASH). + +[Example Testnet denomination creation transaction](https://testnet-insight.dashevo.org/insight/tx/f0174fc87d68a18617c2990df4d9455c0459c601d2d6473934357a66f9b8b70a) + +**Creating Collaterals** + +Collaterals are used to pay CoinJoin fees, but are kept separate from the denominations to maximize privacy. Since protocol version 70213, the minimum collateral fee is 1/10 of the smallest denomination for all sessions regardless of denomination. In Dash Core, collaterals are created with enough value to pay 4 collateral fees (4 x 0.001 DASH). ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L459)) + +In protocol version 70208, collateral inputs can be anything from 2x the minimum collateral amount to the maximum collateral amount (currently defined as 4x the minimum collateral). In protocol versions > 70208, Dash Core can use any [input](../resources/glossary.md#input) from 1x the minimum collateral amount to the maximum collateral amount. + +[Example Testnet collateral creation transaction](https://testnet-insight.dashevo.org/insight/tx/8f9b15973983876f7ce4eb2c32b09690dfb0432d2caf6c6df516196a8d17689f) + +[Example Testnet collateral payment transaction](https://testnet-insight.dashevo.org/insight/tx/de51e6f7c5ef75aad0dbb0a808ef4873d7ef6d67b25f3a658d5a241db4f3eeeb) + +## CoinJoin Processing + +This phase involves exchanging a sequence of messages with a [masternode](../resources/glossary.md#masternode) so it can construct a denominate transaction with inputs from the clients in its pool. + +*Data Flow* + +| | **Clients** | **Direction** | **Masternode** | **Description** | +| --- | --- | :---: | --- | --- | +| 0 | | | | Client determines whether to join an existing pool or create a new one | +| 1 | [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) | → | | Client asks to join pool or have the masternode create a new one +| 2 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (Typical - State: `POOL_STATE_QUEUE`, Message: `MSG_NOERR`) +| 3 | | ← | [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) | Masternode notifies clients when it is ready to receive inputs +| 4 | [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) | → | | Upon receiving a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the Ready bit set, clients each provide a list of their inputs (unsigned), collateral, and a list of outputs where funds should be sent +| 5 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (typical - State: `POOL_STATE_ACCEPTING_ENTRIES`, Message: `MSG_ENTRIES_ADDED`) +| 6 | | ← | [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) | Masternode sends the final transaction containing all clients inputs (unsigned) and all client outputs to each client for verification +| 7 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (Typical - State: `POOL_STATE_SIGNING`, Message: `MSG_NOERR`) +| 8 | [`dss` message](../reference/p2p-network-privatesend-messages.md#dss) | → | | After verifying the final transaction, clients each sign their own inputs with the `SIGHASH_ALL \| SIGHASH_ANYONECANPAY` signature type and send them back +| 9 | | ← | [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc) | Masternode verifies the signed inputs, creates a [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) to broadcast the transaction, and notifies clients that the denominate transaction is complete (Typical - Message: `MSG_SUCCESS`) +| 10 | | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) | Masternode broadcasts a `dstx` inventory message +| 11 | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (dstx) | → | | (Optional) + +**Additional notes** + +_**Step 0 - Pool Selection**_ + +* Existing pool information is derived from the Queue messages seen by the client +* Dash Core attempts to join an existing pool and only requests creation of a new one if that fails, although this is not a requirement that alternative implementations would be required to follow + +_**Step 1 - Pool Request**_ + +* The [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) contains a collateral transaction + * This transaction uses a collateral [input](../resources/glossary.md#input) created in the [Wallet Preparation](#wallet-preparation) phase + * The collateral is a signed [transaction](../resources/glossary.md#transaction) that pays the collateral back to a client [address](../resources/glossary.md#address) minus a fee of 0.001 DASH + +_**Step 3 - Queue**_ + +* A masternode broadcasts [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) when it starts a new queue. These message are relayed by all [peers](../resources/glossary.md#peer). +* As of protocol version 70214, sessions have a variable number of participants defined by the range `nPoolMinParticipants` ([3](https://github.com/dashpay/dash/blob/v0.15.0.0/src/chainparams.cpp#L360)) to `nPoolMaxParticipants` ([5](https://github.com/dashpay/dash/blob/v0.15.0.0/src/chainparams.cpp#L361)). Prior protocol version sessions always contained exactly 3 participants. Spork 22 introduced in Dash Core 0.16.0 expanded the maximum number of participants to 20 and also reduced the minimum number of participants to 2 for testnet/devnet/regtest networks. The spork was removed in Dash Core 0.17.0 which made the change permanent. +* The masternode sends a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the ready bit set once it has received valid [`dsa` messages](../reference/p2p-network-privatesend-messages.md#dsa) from either: + 1. The maximum number of clients (20) + 2. Greater than the minimum number of clients (3) and the timeout has been reached ([30 seconds](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.h#L23)) + +:::{attention} +Clients must respond to the Queue ready within 30 seconds or risk forfeiting the collateral they provided in the [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) (Step 1) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.h#L23)) +::: + +_**Step 4 - Inputs**_ + +* The collateral transaction can be the same in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) as the one in the [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) (Step 1) as long as it has not been spent +* Each client can provide up to 9 (`COINJOIN_ENTRY_MAX_SIZE`) inputs (and an equal number of outputs) to be used ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L29)) +* This is the only message in the process that contains enough information to link a wallet's CoinJoin inputs with its outputs + * This message is sent directly between a client and the masternode processing the session (not relayed across the Dash network) so no other clients see it + +_**Step 6 - Final Transaction (unsigned)**_ + +* Once the masternode has received valid [`dsi` messages](../reference/p2p-network-privatesend-messages.md#dsi) from all clients, it creates the final transaction and sends a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) + * Inputs/outputs are ordered deterministically as defined by [BIP-69](https://github.com/dashevo/bips/blob/master/bip-0069.mediawiki#Abstract) to avoid leaking any data ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend-server.cpp#L271-L272)) + * Clients must sign their inputs to the Final Transaction within 15 seconds or risk forfeiting the collateral they provided in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) (Step 4) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L24)) + +_**Step 10 - Final Transaction broadcast**_ + +* Prior to protocol version 70213, masternodes could only send a single un-mined [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) at a time. As of protocol version 70213, up to 5 (`MASTERNODE_MAX_MIXING_TXES`) un-mined [`dstx` messages](../reference/p2p-network-privatesend-messages.md#dstx) per masternode are allowed. ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/masternode/masternode-meta.h#L16)) + +_**General**_ + + With the exception of the [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) and the [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) (which need to be public and do not expose any private information), all CoinJoin P2P messages are sent directly between the masternode processing the transaction and the relevant client(s). + +## Fees + +**Processing Fees** + +* If processing completes successfully, Dash Core charges the collateral randomly in 1/10 denominate transactions to pay miners ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.17.0.0/src/coinjoin/coinjoin-server.cpp#L427-L444)) +* Clients that abuse the system by failing to respond to [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) or [`dsf` messages](../reference/p2p-network-privatesend-messages.md#dsf) within the timeout periods may forfeit their collateral. Dash Core charges the abuse fee in 1/3 cases ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.17.0.0/src/coinjoin/coinjoin-server.cpp#L357-L374)) + +**Sending Fees** + +To maintain privacy when using CoinJoin funds, transactions must fully spend all inputs to a single output (with the remainder becoming the fee - i.e. no [change output](../resources/glossary.md#change-output)). This can result in large fees depending on the value being sent. + +For example, an extreme case is sending the minimum non-dust value (546 duffs). This results in an extremely large transaction fee because the minimum denomination (0.00100001 DASH or 100,001 duffs) must be fully spent with no change. This results in a fee of 0.00999464 DASH and a sent value of only 0.00000546 DASH as shown by the calculation below. + +100001 duffs (smallest CoinJoin denomination) - 546 duffs (value to send) = 99455 duffs (fee) diff --git a/docs/core/guide/dash-features-governance.md b/docs/core/guide/dash-features-governance.md new file mode 100644 index 000000000..2517105ec --- /dev/null +++ b/docs/core/guide/dash-features-governance.md @@ -0,0 +1,90 @@ +```{eval-rst} +.. meta:: + :title: Governance + :description: Dash Core synchronizes the governance system via the masternode network as the last stage of the Masternode sync process. +``` + +# Governance + +## Synchronization + +Dash Core synchronizes the governance system via the [masternode](../resources/glossary.md#masternode) [network](../resources/glossary.md#network) as the last stage of the Masternode sync process (following the sync of sporks, the Masternode list, and Masternode payments). + +The [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) initiates a sync of the governance system. Masternodes ignore this request if they are not fully synced. + +There are two distinct stages of governance sync: + +1. Initial request (object sync) - requests the governance objects only via a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) sent with a hash of all zeros. + +2. Follow up request(s) (vote sync) - request governance object votes for a specific object via a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) containing the hash of the object. One message is required for each object. Dash Core periodically (~ every 6 seconds) sends messages to connected nodes until all the governance objects have been synchronized. + +:::{note} +Dash Core limits how frequently the first type of sync (object sync) can be requested. Frequent requests will result in the node being banned. +::: + +Masternodes respond to the [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) with several items: + +For Object Sync: + +* First, the Masternode sends a [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) (Sync Status Count) for `govobj` objects. This message indicates how many [inventory](../resources/glossary.md#inventory) items will be sent. + +* Second, the Masternode sends an [`inv` message](../reference/p2p-network-data-messages.md#inv) for the `govobj` and `govobjvote` objects. + +For Vote Sync: + +* First, the Masternode sends a [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) (Sync Status Count) for `govobjvote` objects. This message indicates how many inventory items will be sent. + +* Second, the Masternode sends an [`inv` message](../reference/p2p-network-data-messages.md#inv) for the `govobjvote` object(s). + +Once the syncing [node](../resources/glossary.md#node) receives the counts and inventories, it may request any `govobj` and `govobjvote` objects from the masternode via a [`getdata` message](../reference/p2p-network-data-messages.md#getdata). + +### Governance Sync Data Flow + +| **Syncing Node Message** | **Direction** | **Masternode Response** | **Description** | +| --- | --- | --- | --- | +| **Initial request** | | | **Requests all governance objects (without votes)** | +| [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) | → | | Syncing node initiates governance sync (hash set to all zeros) +| | ← | [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) (govobj) | Number of governance objects (0 or more) +| | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) (govobj) | Governance object inventories +| [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (govobj) | → | | (Optional) Syncing node requests govobj +| | ← | [`govobj` message](../reference/p2p-network-governance-messages.md#govobj) | (If requested) Governance object +| | | | | +| **Follow up requests** | | | **Requests governance object (with votes)** | +| [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) | → | | Syncing node requests governance sync for a specific governance object +| | ← | [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) (govobjvote)| Number of governance object votes (0 or more) +| | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) (govobjvote)| Governance object vote inventories +| [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (govobjvote) | → | | (Optional) Syncing node requests govobjvote +| | ← | [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote) | (If requested) Governance object vote + +## Sentinel + +:::{attention} +Sentinel was deprecated in Dash Core v20.0 when its functionality was integrated into Dash Core. +::: + +[Sentinel](https://github.com/dashpay/sentinel/) is a Python application that connects to a masternode's local dashd instance to run as an autonomous agent for persisting, processing, and automating Dash 12.1+ governance objects and tasks. Sentinel abstracts some governance details away from Dash Core for easier extensibility of the governance system in the future. This will allow the integration between Evolution and Dash Core to proceed more smoothly and enable new governance object additions with minimal impact to Dash Core. + +Sentinel runs periodically and performs three main tasks as described below: +governance sync, governance object pruning, and superblock management. The governance object data is stored in a SQLite database. + +### Sentinel Sync + +Sentinel issues a [`gobject list` RPC](../api/remote-procedure-calls-dash.md#gobject-list) command and updates its database with the results returned from dashd. When objects are removed from the network, they are purged from the Sentinel database. + +### Sentinel Prune + +Sentinel 1.1.0 introduced proposal pruning which automatically votes to delete expired proposals following approximately half of a [superblock](../resources/glossary.md#superblock) cycle. This delay period ensures that proposals are not deleted prematurely. Prior to this, proposals remained in memory unless a sufficient number of masternodes manually voted to delete them. + +### Sentinel Superblock + +Sentinel manages superblock creation, voting, and submission to dashd for network propagation. + +Beginning ~3 days (1662 blocks) prior to a superblock, Sentinel selects one masternode per block to rank proposals. This ranking is used to determine what a candidate superblock (or "superblock trigger") should contain. Based on the results, it creates and broadcasts a new superblock trigger if a matching one was not found. + +All masternodes vote for existing superblock triggers. Each masternode casts only 1 superblock trigger "Yes" vote per superblock cycle. It will vote "No" for any other triggers it receives. + +:::{attention} +Proposal votes submitted _after_ superblock trigger creation begins will **not** be counted by some masternodes (those that have already voted on a superblock trigger). +::: + +At the superblock height, the trigger with the most "Yes" votes is paid out by that block's miner. diff --git a/docs/core/guide/dash-features-historical-reference.md b/docs/core/guide/dash-features-historical-reference.md new file mode 100644 index 000000000..d7c9f472a --- /dev/null +++ b/docs/core/guide/dash-features-historical-reference.md @@ -0,0 +1,67 @@ +# Historical Reference + +:::{attention} +The following information is deprecated and for historical reference only. It describes features that have been redesigned and no longer operate as described below. +::: + +## InstantSend (original) + +:::{tip} +Check the [Dash features guide](../guide/dash-features-instantsend.md) for details of the current InstantSend design. +::: + +Dash Core's InstantSend feature provides a way to lock transaction inputs and enable secure, instantaneous transactions. Since Dash Core 0.13.0, any qualifying transaction is automatically upgraded to InstantSend by the network without a need for the sending wallet to explicitly request it. For these simple transactions (those containing 4 or fewer inputs), the previous requirement for a special InstantSend transaction fee was also removed. The criteria for determining eligibility can be found in the lists of limitations below. + +The following video provides an overview with a good introduction to the details including the InstantSend vulnerability that was fixed in Dash Core 0.12.2. Some specific points in the video are listed here for quick reference: + +* 2:00 - InstantSend restrictions +* 5:00 - Masternode quorum creation +* 6:00 - Input locking +* 7:45 - Quorum score calculation / Requirement for block confirmations +* 9:00 - Description of Dash Core pre-0.12.2 InstantSend vulnerability +* 13:00 - Description of vulnerability fix / Post Dash Core 0.12.2 operation + + + +*InstantSend Data Flow* + +| **InstantSend Client** | **Direction** | **Peers** | **Description** | +| --- | :---: | --- | --- | +| [`inv` message](../reference/p2p-network-data-messages.md#inv) (ix) | → | | Client sends inventory for transaction lock request +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (ix) | Peer responds with request for transaction lock request +| `ix` message | → | | Client sends InstantSend transaction lock request +| | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) (txlvote) | Masternodes in the [quorum](../guide/dash-features-masternode-quorums.md#quorum-configuration) respond with votes +| [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (txlvote) | → | | Client requests vote +| | ← | `txlvote` message | Peer responds with vote + +Once an InstantSend lock has been requested, the `instantsend` field of various RPCs (e.g. the [`getmempoolentry` RPC](../api/remote-procedure-calls-blockchain.md#getmempoolentry)) is set to `true`. Then, if a sufficient number of votes approve the transaction lock, the InstantSend transaction is approved the `instantlock` field of the RPC is set to `true`. + +If an InstantSend transaction is a valid transaction but does not receive a transaction lock, it reverts to being a standard transaction. + +There are a number of limitations on InstantSend transactions: + +* The lock request will timeout 15 seconds after the first vote is seen (`INSTANTSEND_LOCK_TIMEOUT_SECONDS`) +* The lock request will fail if it has not been locked after 60 seconds (`INSTANTSEND_FAILED_TIMEOUT_SECONDS`) +* A “per-input” fee of 0.0001 DASH per input is required for non-simple transactions (inputs >=5) since they place a higher load on the masternodes. This fee was most recently decreased by [DIP-0001](https://github.com/dashpay/dips/blob/master/dip-0001.md). +* To be used in an InstantSend transaction, an input must have at least the number confirmations (block depth) indicated by the table below + +| **Network** | **Confirmations Required** | +| --- | --- | +| Mainnet | 6 Blocks | +| Testnet | 2 Blocks | +| Regtest | 2 Blocks | +| Devnet | 2 Blocks | + +There are some further limitations on Automatic InstantSend transactions: + +* DIP3 must be active +* Spork 16 must be enabled +* Mempool usage must be lower than 10% (`AUTO_IX_MEMPOOL_THRESHOLD`). As of Dash Core 0.13.0, this corresponds to a mempool size of 30 MB (`DEFAULT_MAX_MEMPOOL_SIZE` = 300 MB). + +**Historical Note** + +Prior to Dash Core 0.13.0, `instantsend` and `instantlock` values were not available via RPC. At that time, the InstantSend system worked as described below. + +Once a sufficient number of votes approved the transaction lock, the InstantSend transaction was approved and showed 5 confirmations (`DEFAULT_INSTANTSEND_DEPTH`). + +NOTE: The 5 "pseudo-confirmations" were shown to convey confidence that the transaction was secure from double-spending and DID NOT indicate the transaction had already been confirmed to a block depth of 5 in the blockchain. diff --git a/docs/core/guide/dash-features-instantsend.md b/docs/core/guide/dash-features-instantsend.md new file mode 100644 index 000000000..bd85b9972 --- /dev/null +++ b/docs/core/guide/dash-features-instantsend.md @@ -0,0 +1,62 @@ +```{eval-rst} +.. _guide-features-instantsend: +.. meta:: + :title: InstantSend + :description: Dash Core’s InstantSend feature provides a way to lock transaction inputs and enable secure, instantaneous transactions. +``` + +# InstantSend + +## Overview + +Dash Core's [InstantSend](../resources/glossary.md#instantsend) feature provides a way to lock transaction [inputs](../resources/glossary.md#input) and enable secure, instantaneous [transactions](../resources/glossary.md#transaction). The [network](../resources/glossary.md#network) automatically attempts to upgrade any qualifying transaction to InstantSend without a need for the sending [wallet](../resources/glossary.md#wallet) to explicitly request it. + +* To qualify for InstantSend, each transaction input must meet at least one of the following criteria: + * Be locked by InstantSend + * Be in a block that has a [ChainLock](../resources/glossary.md#chainlock) + * Have at least the number [confirmations](../resources/glossary.md#confirmations) (block depth) indicated by the table below + +| **Network** | **Confirmations Required** | +| --- | --- | +| Mainnet | 6 Blocks (normal transactions)
**100 Blocks (mining/masternode rewards)** | +| Testnet / Regtest / Devnet | 2 Blocks | + +The introduction of the [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum) feature in Dash Core 0.14 provided a foundation to scale InstantSend. The transaction input locking process (and resulting network traffic) now occurs only within the quorum. This minimized network congestion since only the [`isdlock` message](../reference/p2p-network-instantsend-messages.md#isdlock) produced by the locking process is relayed to the entire Dash network. The lock message contains all the information necessary to verify a successful transaction lock. + +## Deterministic InstantSend + +Protocol version 70220 implemented deterministic InstantSend (see [DIP22](https://github.com/dashpay/dips/blob/master/dip-0022.md)) which added the `isdlock` message as a replacement for the `islock` message. The `islock` message was deprecated and fully removed in protocol version 70231. + +## Management via Spork + +:::{note} +Dash Core 21.0.0 [hardened all spork values on mainnet](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md#mainnet-spork-hardening). The following information only relates to test networks where spork values can still be updated dynamically. +::: + +Spork 2 (`SPORK_2_INSTANTSEND_ENABLED`) is used to manage InstantSend on test networks. [Spork](../resources/glossary.md#spork) 2 enables or disables the entire InstantSend feature. As of Dash Core 0.17.0, it also can be used to limit locking to transactions found in blocks. + +In the event of a sustained overload of InstantSend, the spork can be set to a value of `1`. This mode enables a clean transition to fully disabling InstantSend without interfering with ChainLocks. In this mode masternodes will stop creating locks for new transactions when they enter the mempool and will only lock them once mined into a block. Once all existing locked transactions are mined into blocks, InstantSend can then be disabled by setting the spork value to `0` without disrupting ChainLocks. + +## Mining Considerations + +Note: A transaction will **not** be included in the block template (from the [`getblocktemplate` RPC](../api/remote-procedure-calls-mining.md#getblocktemplate)) unless it: + + 1. Has been locked, or + 2. Has been in the mempool for >=10 minutes (`WAIT_FOR_ISLOCK_TIMEOUT`) + +A [miner](../resources/glossary.md#miner) may still include any transaction, but [blocks](../resources/glossary.md#block) containing only locked transactions (or ones older than the timeout) should achieve a ChainLock faster. This is desirable to miners since it prevents any blockchain reorganizations that might orphan their block. + +## InstantSend Data Flow + +| **InstantSend Client** | **Direction** | **Peers** | **Description** | +| --- | :---: | --- | --- | +| [`tx` message](../reference/p2p-network-data-messages.md#tx) | → | | Client sends InstantSend transaction +| **LLMQ Signing Sessions** | | | Quorums internally process locking | +| | | | Quorum(s) responsible for the transaction's inputs lock the inputs via LLMQ signing sessions +| | | | Once all inputs are locked, the quorum responsible for the overall transaction creates the transaction lock (`isdlock`) via an LLMQ signing session +| **LLMQ Results** | | | Quorum results broadcast to the network | +| | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) (isdlock) | Quorum responds with lock inventory +| [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (isdlock) | → | | Client requests lock message +| | ← | [`isdlock` message](../reference/p2p-network-instantsend-messages.md#isdlock) | Quorum responds with lock message + +Once a transaction lock is approved, the `instantlock` field of various RPCs is set to `true` (e.g. the [`getmempoolentry` RPC](../api/remote-procedure-calls-blockchain.md#getmempoolentry)). diff --git a/docs/core/guide/dash-features-masternode-payment.md b/docs/core/guide/dash-features-masternode-payment.md new file mode 100644 index 000000000..d270d8b86 --- /dev/null +++ b/docs/core/guide/dash-features-masternode-payment.md @@ -0,0 +1,17 @@ +```{eval-rst} +.. meta:: + :title: Masternode Payment + :description: Masternode reward payments in Dash are determined by on-chain masternode lists in each block. +``` + +# Masternode Payment + +Since [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md) (introduced in Dash Core 0.13.0), [masternode](../resources/glossary.md#masternode) reward payments are based on the deterministic masternode list information found on-chain in each [block](../resources/glossary.md#block). This results in a transparent, deterministic process that operates using the [algorithm described in DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md#masternode-rewards). + +On-chain masternode lists reduce the complexity of reward payments, make payments much more predictable, and also allow masternode payments to be enforced for all blocks (enforcement for superblocks was not possible in the previous system). + +## Evolution Masternodes + +Since Evolution masternodes (evonodes) have four times more collateral than regular masternodes, evonodes are paid in four consecutive blocks each time they are selected for payment. This is to maintain the same incentive structure that regular masternodes have. + +Once Dash Platform is released, 37.5% of the masternode block subsidy will be moved into the Platform credit pool and used to pay evonodes. Both regular masternodes and evonodes will then receive a single reward payment on the Core chain per payment cycle. Evonodes will receive the remainder of their block rewards from Platform. Additionally, evonodes will receive 100% of the fees generated from Dash Platform since they are the only nodes that host it. diff --git a/docs/core/guide/dash-features-masternode-quorums.md b/docs/core/guide/dash-features-masternode-quorums.md new file mode 100644 index 000000000..f5a510f6d --- /dev/null +++ b/docs/core/guide/dash-features-masternode-quorums.md @@ -0,0 +1,124 @@ +```{eval-rst} +.. meta:: + :title: Masternode Quorums + :description: Dash’s masternode quorums enable masternode-provided features to work in a decentralized, deterministic way. +``` + +# Masternode Quorums + +Dash's [masternode](../resources/glossary.md#masternode) quorums are used to facilitate the operation of masternode provided features in a decentralized, deterministic way. The original quorums (used largely for [InstantSend](../resources/glossary.md#instantsend) and masternode payments) were ephemeral and used for a single purpose (e.g. voting on one specific InstantSend transaction). + +Dash Core 0.14 (protocol version 70214) introduced the [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum) (LLMQ) system described in detail by [DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md). These LLMQs are deterministic subsets of the global deterministic masternode list that are formed via a distributed key generation (DKG) protocol and remain active for a long periods of time (e.g. hours to days). + +The main task of LLMQs is to perform threshold signing of consensus-related messages (e.g. [ChainLocks](../resources/glossary.md#chainlock)). + +## LLMQ Creation (DKG) + +The following table details the data flow of P2P messages exchanged during the distributed key generation (DKG) protocol used to establish an LLMQ. + +:::{note} +With the exception of the final step (`qfcommit` message broadcast), the message exchanges happen only between masternodes participating in the DKG process via the [Intra-Quorum communication process](https://github.com/dashpay/dips/blob/master/dip-0006.md#intra-quorum-communication) described in the DIP. +::: + +*Quorum DKG Data Flow* + +:::{attention} +Minimum Masternode Protocol Version Since Dash Core 0.16.0, masternodes perform a [version +check](https://github.com/dashpay/dash/pull/3390) on their quorum peers during DKG. Masternodes that +do not meet the `MIN_MASTERNODE_PROTO_VERSION` will begin receiving increases in +[PoSe](../guide/dash-features-proof-of-service.md) score once ~70% of the masternodes on the network +have upgraded to that version. +::: + +| **Masternode** | **Direction** | **Peers** | **Description** | +| --- | :---: | --- | --- | +| **[Initialization Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#1-initialization-phase)**| | | **Deterministically evaluate if quorum participation necessary** | +| | | | Each quorum participant establishes connections to a set of quorum participants [as described in DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#building-the-set-of-deterministic-connections) | +| **[Contribution Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#2-contribution-phase)** | | | **Send quorum contributions (intra-quorum communication)** | +|`inv` message (qcontrib) | → | | Masternode sends inventory for its quorum contribution *to other masternodes in the quorum* +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (qcontrib) | Peer(s) respond with request for quorum contribution +| [`qcontrib` message](../reference/p2p-network-quorum-messages.md#qcontrib) | → | | Masternode sends the requested quorum contribution +| **[Complaining Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#3-complaining-phase)** | | | **Send complaints for any peers with invalid or missing contributions (intra-quorum communication)** | +|`inv` message (qcomplaint) | → | | Masternode sends inventory for any complaints *to other masternodes in the quorum* +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (qcomplaint) | Peer(s) respond with request for quorum complaints +| [`qcomplaint` message](../reference/p2p-network-quorum-messages.md#qcomplaint) | → | | Masternode sends the requested complaints +| **[Justification Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#4-justification-phase)** | | | **Send justification responses for any complaints against own contributions (intra-quorum communication)** | +|`inv` message (qjustify) | → | | Masternode sends inventory for any justifications *to other masternodes in the quorum* +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (qjustify) | Peer(s) respond with request for quorum justifications +| [`qjustify` message](../reference/p2p-network-quorum-messages.md#qjustify) | → | | Masternode sends the requested justifications +| **[Commitment Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#5-commitment-phase)** | | | **Send premature commitment containing the quorum public key (intra-quorum communication)** | +|`inv` message (qpcommit) | → | | Masternode sends inventory for its premature commitment *to other masternodes in the quorum* +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (qpcommit) | Peer(s) respond with request for quorum premature commitment +| [`qpcommit` message](../reference/p2p-network-quorum-messages.md#qpcommit) | → | | Masternode sends the requested premature commitment +| **[Finalization Phase](https://github.com/dashpay/dips/blob/master/dip-0006.md#6-finalization-phase)** | | | **Send final commitment containing the quorum public key** | +|`inv` message (qfcommit) | → | | Masternode sends inventory for its premature commitment **to all peers** +| | ← | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (qfcommit) | Peer(s) respond with request for quorum final commitment +| [`qfcommit` message](../reference/p2p-network-quorum-messages.md#qfcommit) | → | | Masternode sends the requested final commitment + +## LLMQ Signing Session + +The following table details the data flow of P2P messages exchanged during an LLMQ signing session. These sessions take advantage of BLS threshold signatures to enable quorums to sign arbitrary messages. For example, Dash Core 0.14 uses this capability to create the quorum signature found in the [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig) that enables [ChainLocks](../resources/glossary.md#chainlock). + +Please read [DIP7 LLMQ Signing Requests / Sessions](https://github.com/dashpay/dips/blob/master/dip-0007.md) for additional details. + +*LLMQ Signing Session Data Flow* + +| **Masternode** | **Direction** | **Peers** | **Description** | +| --- | :---: | --- | --- | +| **[Siging Request Phase](https://github.com/dashpay/dips/blob/master/dip-0007.md#signing-request)** | | | Request quorum signing of a message (e.g. InstantSend transaction input) (intra-quorum communication) | +| [`qsigsesann` message](../reference/p2p-network-quorum-messages.md#qsigsesann) | → | | Masternode sends a signing session announcement *to other masternodes in the quorum* +| **[Share Propagation Phase](https://github.com/dashpay/dips/blob/master/dip-0007.md#propagating-signature-shares)** | | | Members exchange signature shares within the quorum (intra-quorum communication) | +| [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv) | → | | Masternode sends one or more quorum signature share inventories *to other masternodes in the quorum*
*May occur multiple times in this phase* +| | ← | [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs) (qcontrib) | Peer(s) respond with request for signature shares
*May occur multiple times in this phase* +| [`qbsigs` message](../reference/p2p-network-quorum-messages.md#qbsigs) | → | | Masternode sends the requested batched signature share(s)
*May occur multiple times in this phase* +| **[Threshold Signature Recovery Phase](https://github.com/dashpay/dips/blob/master/dip-0007.md#recovered-threshold-signatures)** | | | A recovered signature is created by a quorum member once valid signature shares from at least the threshold number of members have been received | +| [`qsigrec` message](../reference/p2p-network-quorum-messages.md#qsigrec) | → | | Masternode sends the quorum recovered signature **to all peers** (except those that have asked to be excluded via a [`qsendrecsigs` message](../reference/p2p-network-quorum-messages.md#qsendrecsigs)) + +Note the following timeouts defined by Dash Core related to signing sessions: + +| Parameter | Timeout, sec | Description | +| --- | --- | --- | +| `SESSION_NEW_SHARES_TIMEOUT` | 60 | Time to wait for new shares | +| `SIG_SHARE_REQUEST_TIMEOUT` | 5 | Time to wait for a requested share before requesting from a different node | +| `SESSION_TOTAL_TIMEOUT` | 300 | Time to wait for session to complete | + +## Quorum Configuration + +Mainnet and Testnet only use quorums of pre-defined sizes that are hard coded into Dash Core. RegTest and Devnet environments each have a quorum that supports custom size and threshold parameters that are controlled via command line or configuration file parameters (`llmqtestparams`/`llmqdevnetparams`). + +A list of all the quorums and their default sizes can be found in the [Current LLMQ Types table](https://github.com/dashpay/dips/blob/master/dip-0006/llmq-types.md) found in DIP-6. + +The specific quorum type used for a feature can vary based on the network. The following table shows which quorums are used for each feature on the various networks: + +| | Mainnet | Testnet | Devnet * | RegTest * | +|-|-|-|-|-| +| ChainLocks ([DIP-8](https://github.com/dashpay/dips/blob/master/dip-0008.md)) | LLMQ_400_60 | LLMQ_50_60 | LLMQ_50_60 | LLMQ_TEST | +| Deterministic InstantSend | LLMQ_60_75 | LLMQ_60_75 | LLMQ_60_75 | LLMQ_TEST_DIP0024 | +| InstantSend (pre DIP-24) | LLMQ_50_60 | LLMQ_50_60 | LLMQ_50_60 | LLMQ_TEST_INSTANTSEND | +| Platform | LLMQ_100_67 | LLMQ_25_67 | LLMQ_100_67 | LLMQ_TEST_PLATFORM | +| Enhanced Hard Fork ([DIP-23](https://github.com/dashpay/dips/blob/master/dip-0023.md))| LLMQ_400_85 | LLMQ_50_60 | LLMQ_50_60 | LLMQ_TEST | + +\* Note that the quorum types used on RegTest and Devnets have customizable parameters as described above + +### Quorum formation + +The quorum formation process operates regardless of quorum usage. So the [DKG process](#llmq-creation-dkg) will be attempted for *all quorum types enabled on a network* regardless of whether or not that quorum type is going to be used. + +The following table showing which quorums are enabled for each network type is derived from information taken from Dash Core's [chainparams.cpp](https://github.com/dashpay/dash/blob/master/src/chainparams.cpp) file: + +| Quorum type | Mainnet | Testnet | Devnet | RegTest | +|-|:-:|:-:|:-:|:-:| +| LLMQ_50_60 | x | x | x | - | +| LLMQ_60_75 | x | x | x | - | +| LLMQ_400_60 | x | x | x | - | +| LLMQ_400_85 | x | x | x | - | +| LLMQ_100_67 | x | x | x | - | +| LLMQ_25_67 | - | x | - | - | +| LLMQ_DEVNET | - | - | x | - | +| LLMQ_DEVNET_DIP0024 | - | - | x | - | +| LLMQ_DEVNET_PLATFORM | - | - | x | - | +| LLMQ_TEST | - | - | - | x | +| LLMQ_TEST_INSTANTSEND | - | - | - | x | +| LLMQ_TEST_V17 | - | - | - | x | +| LLMQ_TEST_DIP0024 | - | - | - | x | +| LLMQ_TEST_PLATFORM | - | - | - | x | diff --git a/docs/core/guide/dash-features-masternode-sync.md b/docs/core/guide/dash-features-masternode-sync.md new file mode 100644 index 000000000..457deab5e --- /dev/null +++ b/docs/core/guide/dash-features-masternode-sync.md @@ -0,0 +1,72 @@ +```{eval-rst} +.. meta:: + :title: Masternode Sync + :description: Dash Core performs full masternode synchronization as required. This section details the four conditions that initiate a start/restart of the sync process. +``` + +# Masternode Sync + +Dash Core performs full [masternode](../resources/glossary.md#masternode) synchronization as required. There are four conditions that initiate a start/restart the sync process: + +* Initial startup of Dash Core +* More than 60 minutes have passed since the last activation +* A failure occurred during the last sync attempt (after a 1 minute cooldown before sync restarts) +* Issuing a [`mnsync reset` RPC](../api/remote-procedure-calls-dash.md#mnsync) command + +## Initial Masternode Sync + +The deterministic masternode lists introduced by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md) eliminated several steps of the sync process related to the masternode list and masternode payments. Since that information is now available on-chain, P2P messages related to those steps were deprecated. + +This diagram shows the order in which P2P messages are sent to perform masternode synchronization initially after startup. + +![Masternode Sync (Initial)](../../img/dev/en-masternode-sync-initial-dip3.svg) + +The following table details the data flow of P2P messages exchanged during initial masternode synchronization after the activation of [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md) and [Spork](../resources/glossary.md#spork) 15. + +| **Syncing Node Message** | **Direction** | **Masternode Response** | **Description** | +| --- | :---: | --- | --- | +| **1. Sporks** | | | | +| [`getsporks` message](../reference/p2p-network-control-messages.md#getsporks) | → | | Syncing node requests sporks +| | ← | [`spork` message](../reference/p2p-network-control-messages.md#spork)(s) | +| **2. Mempool** | | | | +| [`mempool` message](../reference/p2p-network-data-messages.md#mempool) | → | | Syncing node requests mempool entries +| | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv)(s) | `inv` message(s) containing TXIDs of mempool transactions | +| **3. Governance** | | | See [Governance sync](../guide/dash-features-governance.md#synchronization) | + +*Masternode Sync Status* + +There are several status values used to track masternode synchronization. They are used in both [`ssc` messages](../reference/p2p-network-masternode-messages.md#ssc) and the [`mnsync` RPC](../api/remote-procedure-calls-dash.md#mnsync). + +| **Value** | **Status** | **Description** | +| --- | --- | --- | +| *-1* | _`MASTERNODE_SYNC_FAILED`_ | **Removed in Dash Core 0.16.0**
Synchronization failed | +| *0* | _`MASTERNODE_SYNC_INITIAL`_ | **Deprecated (merged with `MASTERNODE_SYNC_WAITING` in Dash Core 0.16.0)**
Synchronization just started, was reset recently, or is still in IBD | +| 1 | `MASTERNODE_SYNC_BLOCKCHAIN` (previously `MASTERNODE_SYNC_WAITING`) | **Renamed in Dash Core 0.16.0**
Synchronization pending - waiting after initial to check for more headers/blocks. | +| 4 | `MASTERNODE_SYNC_GOVERNANCE` | Synchronizing governance objects | +| 999 | `MASTERNODE_SYNC_FINISHED` | Synchronization finished | + +## Ongoing Masternode Sync + +Once a masternode completes an initial full sync, continuing synchronization is maintained by the exchange of P2P messages with other [nodes](../resources/glossary.md#node). This diagram shows an overview of the messages exchanged to keep governance objects synchronized between masternodes. + +![Masternode Sync (Ongoing)](../../img/dev/en-masternode-sync-ongoing.svg) + +**Governance** + +After the initial governance synchronization, governance information is kept current by the [`govobj` messages](../reference/p2p-network-governance-messages.md#govobj) and [`govobjvote` messages](../reference/p2p-network-governance-messages.md#govobjvote) relayed on the [network](../resources/glossary.md#network). Unsynchronized [peers](../resources/glossary.md#peer) may send [`govsync` messages](../reference/p2p-network-governance-messages.md#govsync) to request governance sync. + +## Masternode Sync Schedule + +The following tables detail the timing of various functions used to keep the masternodes in sync with each other. This information is derived from the scheduler section of `AppInitMain` in `src/init.cpp`. + +| **Period (seconds)** | **Action** | **Description** | +| --- | --- | --- | +| 6 | MN Sync | Synchronizes sporks and governance objects (masternode-sync.cpp) | + +The following actions only run when the masternode sync is past `MASTERNODE_SYNC_WAITING` status. + +| **Period (seconds)** | **Action** | **Description** | +| --- | --- | --- | +| 60 | Process MN Connections | Disconnects some masternodes (`masternodeman.cpp`) | +| 60 | InstantSend Check/Remove | Remove expired/orphaned/invalid InstantSend candidates and votes (`instantx.cpp`) | +| 300 | Maintenance | Check/remove/reprocess governance objects (`governance.cpp`) | diff --git a/docs/core/guide/dash-features-proof-of-service.md b/docs/core/guide/dash-features-proof-of-service.md new file mode 100644 index 000000000..dacbe07f9 --- /dev/null +++ b/docs/core/guide/dash-features-proof-of-service.md @@ -0,0 +1,58 @@ +# Proof of Service + +```{eval-rst} +.. meta:: + :title: Dash Proof of Service + :description: The Proof of Service (PoSe) scoring system motivates masternodes to deliver network services, penalizing non-participation by increasing PoSe scores and eventually disqualifying them from payment eligibility. +``` + +The Proof of Service (PoSe) scoring system helps incentivize [masternodes](../resources/glossary.md#masternode) to provide [network](../resources/glossary.md#network) services. Masternodes that neglect to participate receive an increased PoSe score which eventually results in them being excluded from masternode payment eligibility. + +## Distributed Key Generation Participation Requirements + +The following table lists the aspects of the DKG process a masternode must comply with to avoid receiving a PoSe score increase: + +| Protocol Version | Proof of Service
Requirement | +| :-: | - | +| 70213+ | Exchange required messages (quorum contributions and quorum justifications) with other quorum members during the [LLMQ DKG process](../guide/dash-features-masternode-quorums.md#llmq-creation-dkg) (Dash Core 0.13.0+) | +| 70218+ | Have an open P2P port ([Dash Core 0.16.0+](https://github.com/dashpay/dash/pull/3390)). _Enforcement of this requirement is dependent on Spork 23 being enabled_ | +| 70218+ | Have a protocol version => [`MIN_MASTERNODE_PROTO_VERSION`](https://github.com/dashpay/dash/blob/v19.x/src/version.h#L23). During updates where this version is increased, masternodes will begin receiving PoSe score increases once > 80% of masternodes have upgrade ([Dash Core 0.16.0+](https://github.com/dashpay/dash/pull/3390)). _Enforcement of this requirement is dependent on Spork 23 being enabled_ | + +## Proof of Service Score Weighting + +The current PoSe scoring system is based only on participation in the [LLMQ](../resources/glossary.md#long-living-masternode-quorum) DKG process. This scoring system will expand over time to incorporate additional service requirements in support of the future Dash functionality. + +| Service | Percent of Score | Requirement | +| ----------- | :----: | ------------------- | +| LLMQ DKG | 100% | Participate in the DKG process used to establish LLMQs. Requires exchanging messages with other quorum members | + +## **PoSe Score Calculation** + +As shown in the following table, the PoSe Score always decreases by 1 per [block](../resources/glossary.md#block) as long as a masternode has not been banned. Once banned, the masternode can only be restored by sending a Provider Update Service ([ProUpServTx](../reference/transactions-special-transactions.md#proupservtx)) special transaction. + +| PoSe Parameter | Value | Example Value | +| --- | --- | --- | +| Maximum PoSe Score | Number of registered masternodes | 5000 | +| PoSe Score Increases | Maximum PoSe Score * 2/3 | 3333 | +| PoSe Score Decreases | 1 (per block) | Always `1` | + +The current PoSe scoring algorithm increases the PoSe score by 66% of the maximum score for each failed DKG session. Depending on timing, this allows for no more than 2 failures for a masternode within a payment cycle (i.e a number of blocks equal to the number of registered masternodes). + +For example, using the values from above with 5000 masternodes: + +* In the first 5000 block cycle, two DKG failures occur without the PoSe score exceeding the maximum. This happens since a sufficient number of blocks are mined prior to the second failure to drop the PoSe score below the threshold (`< 5000 - 3333`) that would result in banning. + +* In the second 5000 block cycle, the second DKG failure occurs too close to the first and results in the PoSe score exceeding the maximum limit. This results in the masternode receiving a PoSe Ban. + +| Payment Cycle | Block Number | Event | Score Change | PoSe Score | MN Status | +| :---: | :--- | --- | :---: | :---: | :---: | +| 1 | 1 | DKG Failure (1) | +3333 | 3333 | Valid | +| 1 | 1734 | 1733 Blocks Mined | -1733 | 1600 | Valid | +| 1 | 1734 | DKG Failure (2) | +3333 | 4933 | Valid | +| 1 | 5000 | 3266 Blocks Mined | -3266 | 1667 | Valid | +| | | End of Payment Cycle 1| | | | +| 2 | 5500 | 500 Blocks Mined | -500 | 1167 | Valid | +| 2 | 5500 | DKG Failure (3) | +3333 | 4500 | Valid | +| 2 | 7000 | 1500 Blocks Mined | -1500 | 3000 | Valid | +| 2 | 7000 | DKG Failure (4) | +3333 | 6333 | PoSe Banned | +| 2 | 10000 | End of Payment Cycle 2 | - | 6333 | PoSe Banned | diff --git a/docs/core/guide/dash-features.md b/docs/core/guide/dash-features.md new file mode 100644 index 000000000..849bf214d --- /dev/null +++ b/docs/core/guide/dash-features.md @@ -0,0 +1,57 @@ +```{eval-rst} +.. meta:: + :title: Dash Features + :description: Dash offers instant transaction confirmation, double spend protection, privacy, a self-governed model via incentivized full nodes (masternodes), and more. +``` + +# Dash Features + +## Overview + +Dash aims to be the most user-friendly and scalable payments-focused cryptocurrency in the world. The Dash [network](../resources/glossary.md#network) features instant transaction confirmation, double spend protection, anonymity similar to that of physical cash, a self-governing, self-funding model driven by incentivized full [nodes](../resources/glossary.md#node) (masternodes) and a clear [roadmap](https://www.dash.org/roadmap/) for future development. + +## Dash Nodes + +While Dash is based on Bitcoin and compatible with many key components of the Bitcoin ecosystem, its two-tier network structure offers significant improvements in transaction speed, anonymity and governance. This section of the documentation describes these key features that set Dash apart in the blockchain economy. + +### Masternodes + +The most important differentiating feature of the Dash payments network is the concept of a masternode. On a traditional p2p network, nodes participate equally in the sharing of data and network resources. + +However, the Dash network has a second layer of network participants that provide enhanced functionality in exchange for compensation. This second layer of masternodes enables the industry-leading features described in this section - most notably: [InstantSend](../guide/dash-features-instantsend.md), [ChainLocks](../guide/dash-features-chainlocks.md), [CoinJoin](../guide/dash-features-coinjoin.md), and [Governance](../guide/dash-features-governance.md). + +#### Evolution Masternodes + +:::{note} +New in Dash Core v19.0 +::: + +Evolution Masternodes (evonodes) are a new type of masternode created to host [Dash Platform](inv:platform:std#intro-dash-platform) – a Web3 technology stack for building decentralized applications on the Dash network. The collateral required to own an evonode is 4000 DASH, as opposed to 1000 DASH for regular masternodes. + +Evonodes serve Platform along with Core, while regular masternodes only serve Core. The recommended specs for evonodes are higher than those for regular masternodes. Evonodes will receive 100% of the fees generated from Platform and 37.5% of the masternode portion of Core block rewards. Regular MNs will receive the remaining 62.5% of the masternode portion of Core block rewards and 0% of Platform fees. + +### Full nodes + +Full nodes in Dash are equivalent to full nodes in Bitcoin. They download and validate the entire blockchain against the consensus rules. Unlike masternodes, full nodes do not provide additional services and thus are not compensated. + +### Disable Governance Mode + +Prior to Dash Core v0.16.0, Lite Mode disabled all Dash-specific functionality. Dash Core v0.16.0 introduced Disable Governance Mode to replace Lite Mode. This mode enables access to most Dash features (e.g., InstantSend, ChainLocks, and CoinJoin) while also supporting block pruning. + +As with the previous Lite Mode, masternodes **_cannot_** be run in disable governance mode since they are paid to provide governance services that the mode disables. + +Disable governance mode is enable by setting `disablegovernance=1` in the `dash.conf` file or by running Dash Core with the command line parameter `-disablegovernance=1`. + +```{toctree} +:maxdepth: 3 + +dash-features-instantsend +dash-features-chainlocks +dash-features-governance +dash-features-coinjoin +dash-features-masternode-quorums +dash-features-proof-of-service +dash-features-masternode-payment +dash-features-masternode-sync +dash-features-historical-reference +``` diff --git a/docs/core/guide/introduction.md b/docs/core/guide/introduction.md new file mode 100644 index 000000000..f6c6b3de7 --- /dev/null +++ b/docs/core/guide/introduction.md @@ -0,0 +1,14 @@ +```{eval-rst} +.. _guide-index: +.. meta:: + :title: Dash Developer Guide Introduction + :description: The Developer Guide aims to provide the information you need to understand Dash and start building Dash-based applications. +``` + +# Introduction + +The Developer Guide aims to provide the information you need to understand Dash and start building Dash-based applications, but it is not a specification. To make the best use of this documentation, you may want to install the current version of Dash Core, either from [source](https://github.com/dashpay/dash/) or from a [pre-compiled executable](https://www.dash.org/wallets/#wallets). + +Questions about Dash development are best asked in one of the [Dash development communities](https://www.dash.org/community/). Errors or suggestions related to documentation can be submitted via the "Edit this page" button on the top, right of each page. + +In the following documentation, some strings have been shortened or wrapped: "[...]" indicates extra data was removed, and lines ending in a single backslash "\\" are continued below. If you hover over a glossary term, a brief definition of the term will be displayed in a tooltip. diff --git a/docs/core/guide/mining-block-prototypes.md b/docs/core/guide/mining-block-prototypes.md new file mode 100644 index 000000000..869588c7f --- /dev/null +++ b/docs/core/guide/mining-block-prototypes.md @@ -0,0 +1,47 @@ +```{eval-rst} +.. meta:: + :title: Dash Mining Block Prototypes + :description: Both solo and pool mining require mining software to gather information to build block headers, which is transmitted and utilized in a sequential manner. +``` + +# Block Prototypes + +In both solo and pool mining, the mining software needs to get the information necessary to construct block headers. This subsection describes, in a linear way, how that information is transmitted and used. However, in actual implementations, parallel threads and queuing are used to keep ASIC hashers working at maximum capacity, + +## getwork RPC + +The simplest and earliest method was the now-deprecated Dash Core `getwork` RPC, which constructed a [header](../resources/glossary.md#header) for the miner directly. Since a header only contains a single 4-byte nonce good for about 4 gigahashes, many modern miners need to make dozens or hundreds of `getwork` requests a second. + +## getblocktemplate RPC + +An improved method is the Dash Core [`getblocktemplate` RPC](../api/remote-procedure-calls-mining.md#getblocktemplate). This provides the mining software with much more information: + +1. The information necessary to construct a [coinbase transaction](../resources/glossary.md#coinbase-transaction) paying the pool or the solo miner's `dashd` wallet. + +2. A complete dump of the [transactions](../resources/glossary.md#transaction) `dashd` or the mining pool suggests including in the block, allowing the mining software to inspect the transactions, optionally add additional transactions, and optionally remove non-required transactions. + +3. Other information necessary to construct a [block header](../resources/glossary.md#block-header) for the next [block](../resources/glossary.md#block): the block version, previous block hash, and bits (target). + +4. The mining pool's current [target threshold](../resources/glossary.md#target) for accepting shares. (For solo miners, this is the network target.) + +Using the transactions received, the mining software adds a nonce to the coinbase extra nonce field and then converts all the transactions into a [merkle tree](../resources/glossary.md#merkle-tree) to derive a [merkle root](../resources/glossary.md#merkle-root) it can use in a block header. Whenever the extra nonce field needs to be changed, the mining software rebuilds the necessary parts of the merkle tree and updates the time and merkle root fields in the block header. + +Like all `dashd` RPCs, `getblocktemplate` is sent over HTTP. To ensure they get the most recent work, most miners use [HTTP longpoll](https://en.wikipedia.org/wiki/Push_technology#Long_polling) to leave a `getblocktemplate` request open at all times. This allows the mining pool to push a new `getblocktemplate` to the miner as soon as any [miner](../resources/glossary.md#miner) on the peer-to-peer [network](../resources/glossary.md#network) publishes a new block or the pool wants to send more transactions to the mining software. + +## Stratum + +A widely used alternative to `getblocktemplate` is the [Stratum mining protocol](http://mining.bitcoin.cz/stratum-mining). Stratum focuses on giving miners the minimal information they need to construct block headers on their own: + +1. The information necessary to construct a coinbase transaction paying the pool. + +2. The parts of the merkle tree which need to be re-hashed to create a new merkle root when the coinbase transaction is updated with a new extra nonce. The other parts of the merkle tree, if any, are not sent, effectively limiting the amount of data which needs to be sent to (at most) about a kilobyte at current transaction volume. + +3. All of the other non-merkle root information necessary to construct a block header for the next block. + +4. The mining pool's current target threshold for accepting shares. + +Using the coinbase transaction received, the mining software adds a nonce to the coinbase extra nonce field, hashes the coinbase transaction, and adds the hash to the received parts of the merkle tree. The tree is hashed as necessary to create a merkle root, which is added to the block header information received. Whenever the extra nonce field needs to be changed, the mining software updates and re-hashes the coinbase transaction, rebuilds the merkle root, and updates the header merkle root field. + +Unlike `getblocktemplate`, miners using Stratum cannot inspect or add transactions to the block they're currently mining. Also unlike `getblocktemplate`, the Stratum protocol uses a two-way TCP socket directly, so miners don't need to use HTTP longpoll to ensure they receive immediate updates from mining pools when a new block is broadcast to the peer-to-peer network. + +**Resources:** The GPLv3 [BFGMiner](https://github.com/luke-jr/bfgminer) mining software and AGPLv3 [Eloipool](https://github.com/luke-jr/eloipool) mining pool software are widely-used among Bitcoin miners and pools. The [libblkmaker](https://github.com/bitcoin/libblkmaker) C library and [python-blkmaker](https://gitorious.org/bitcoin/python-blkmaker) library, both MIT licensed, can interpret GetBlockTemplate for your programs. diff --git a/docs/core/guide/mining-pool-mining.md b/docs/core/guide/mining-pool-mining.md new file mode 100644 index 000000000..fa17ad79a --- /dev/null +++ b/docs/core/guide/mining-pool-mining.md @@ -0,0 +1,19 @@ +```{eval-rst} +.. meta:: + :title: Dash Pool Mining + :description: A mining pool is a collective effort by miners to combine processing power, distribute rewards evenly based on work contributed, and increase chances of finding a block. +``` + +# Pool Mining + +Pool miners follow a similar workflow, illustrated below, which allows mining pool operators to pay miners based on their share of the work done. The mining pool gets new [transactions](../resources/glossary.md#transaction) from the network using `dashd`. Using one of the methods discussed later, each miner's mining software connects to the pool and requests the information it needs to construct block headers. + +![Pooled Bitcoin Mining](../../img/dev/en-pooled-mining-overview.svg) + +In pooled mining, the mining pool sets the [target threshold](../resources/glossary.md#target) a few orders of magnitude higher (less difficult) than the network difficulty. This causes the mining hardware to return many block headers which don't hash to a value eligible for inclusion on the [block chain](../resources/glossary.md#block-chain) but which do hash below the pool's target, proving (on average) that the miner checked a percentage of the possible hash values. + +The [miner](../resources/glossary.md#miner) then sends to the pool a copy of the information the pool needs to validate that the header will hash below the target and that the block of transactions referred to by the header [merkle root](../resources/glossary.md#merkle-root) field is valid for the pool's purposes. (This usually means that the [coinbase transaction](../resources/glossary.md#coinbase-transaction) must pay the pool.) + +The information the miner sends to the pool is called a share because it proves the miner did a share of the work. By chance, some shares the pool receives will also be below the network target---the mining pool sends these to the network to be added to the block chain. + +The miner portion of the [block reward](../resources/glossary.md#block-reward) and [transaction fees](../resources/glossary.md#transaction-fee) that come from mining that block are paid to the mining pool. The mining pool pays out a portion of these proceeds to individual miners based on how many shares they generated. For example, if the mining pool's target threshold is 100 times lower than the network target threshold, 100 shares will need to be generated on average to create a successful block, so the mining pool can pay 1/100th of its payout for each share received. Different mining pools use different reward distribution systems based on this basic share system. diff --git a/docs/core/guide/mining-solo-mining.md b/docs/core/guide/mining-solo-mining.md new file mode 100644 index 000000000..f8b7a23a1 --- /dev/null +++ b/docs/core/guide/mining-solo-mining.md @@ -0,0 +1,17 @@ +```{eval-rst} +.. meta:: + :title: Dash Solo Mining + :description: Solo mining is an individual effort to generate blocks, allowing the miner to claim all rewards, resulting in larger but less frequent payments. +``` + +# Solo Mining + +As illustrated below, solo miners typically use `dashd` to get new [transactions](../resources/glossary.md#transaction) from the [network](../resources/glossary.md#network). Their mining software periodically polls `dashd` for new transactions using the [`getblocktemplate` RPC](../api/remote-procedure-calls-mining.md#getblocktemplate), which provides the list of new transactions plus the [public key](../resources/glossary.md#public-key) to which the [coinbase transaction](../resources/glossary.md#coinbase-transaction) should be sent. + +![Solo Bitcoin Mining](../../img/dev/en-solo-mining-overview.svg) + +The mining software constructs a block using the template (described below) and creates a [block header](../resources/glossary.md#block-header). It then sends the 80-byte block header to its mining hardware (an ASIC) along with a [target threshold](../resources/glossary.md#target) (difficulty setting). The mining hardware iterates through every possible value for the block header nonce and generates the corresponding hash. + +If none of the hashes are below the threshold, the mining hardware gets an updated block header with a new [merkle root](../resources/glossary.md#merkle-root) from the mining software; this new block header is created by adding extra nonce data to the coinbase field of the coinbase transaction. + +On the other hand, if a hash is found below the target threshold, the mining hardware returns the block header with the successful nonce to the mining software. The mining software combines the header with the block and sends the completed block to `dashd` to be broadcast to the network for addition to the block chain. diff --git a/docs/core/guide/mining.md b/docs/core/guide/mining.md new file mode 100644 index 000000000..fe921e936 --- /dev/null +++ b/docs/core/guide/mining.md @@ -0,0 +1,21 @@ +```{eval-rst} +.. meta:: + :title: Dash Mining + :description: Mining adds new blocks to the block chain, making transaction history hard to modify. Mining takes on two forms – Solo Mining and Pool Mining. +``` + +# Mining + +Mining adds new [blocks](../resources/glossary.md#block) to the [block chain](../resources/glossary.md#block-chain), making transaction history hard to modify. Mining today takes on two forms: + +* Solo mining, where the [miner](../resources/glossary.md#miner) attempts to generate new blocks on his own, with the proceeds from the mining portion of the [block reward](../resources/glossary.md#block-reward) and [transaction fees](../resources/glossary.md#transaction-fee) going entirely to himself, allowing him to receive large payments with a higher variance (longer time between payments) + +* Pooled mining, where the miner pools resources with other miners to find blocks more often, with the proceeds being shared among the pool miners in rough correlation to the amount of hashing power they each contributed, allowing the miner to receive small payments with a lower variance (shorter time between payments). + +```{toctree} +:maxdepth: 3 + +mining-solo-mining +mining-pool-mining +mining-block-prototypes +``` diff --git a/docs/core/guide/operating-modes-full-node.md b/docs/core/guide/operating-modes-full-node.md new file mode 100644 index 000000000..b664f72bd --- /dev/null +++ b/docs/core/guide/operating-modes-full-node.md @@ -0,0 +1,13 @@ +```{eval-rst} +.. meta:: + :title: Dash Full Node + :description: A 'full node' is a computer in Dash's peer-to-peer network which hosts and synchronises a copy of the entire Dash blockchain. +``` + +# Full Node + +The first and most secure model is the one followed by Dash Core, also known as a “thick” or “full chain” client. This security model assures the validity of the [block chain](../resources/glossary.md#block-chain) by downloading and validating [blocks](../resources/glossary.md#block) from the [genesis block](../resources/glossary.md#genesis-block) all the way to the most recently discovered block. This is known as using the *height* of a particular block to verify the client’s view of the network. + +For a client to be fooled, an adversary would need to give a complete alternative block chain history that is of greater difficulty than the current “true” chain, which is computationally expensive (if not impossible) due to the fact that the chain with the most cumulative [proof of work](../resources/glossary.md#proof-of-work) is by definition the "true" chain. Due to the computational difficulty required to generate a new block at the tip of the chain, the ability to fool a full node becomes very expensive after 6 [confirmations](../resources/glossary.md#confirmations). This form of verification is highly resistant to Sybil attacks---only a single honest [network](../resources/glossary.md#network) [peer](../resources/glossary.md#peer) is required in order to receive and verify the complete state of the "true" block chain. + +![Block Height Compared To Block Depth](../../img/dev/en-block-height-vs-depth.svg) diff --git a/docs/core/guide/operating-modes-future-proposals.md b/docs/core/guide/operating-modes-future-proposals.md new file mode 100644 index 000000000..7a7fc8c19 --- /dev/null +++ b/docs/core/guide/operating-modes-future-proposals.md @@ -0,0 +1,13 @@ +```{eval-rst} +.. meta:: + :title: Dash Future Proposals + :description: Future plans like UTXO commitments aim to balance security and storage needs for clients, impacting decisions about operational modes based on various constraints and Dash value. +``` + +# Future Proposals + +There are future proposals such as Unspent Transaction Output (UTXO) commitments in the block chain to find a more satisfactory middle-ground for clients between needing a complete copy of the block chain, or trusting that a majority of your connected peers are not lying. UTXO commitments would enable a very secure client using a finite amount of storage using a data structure that is authenticated in the block chain. These type of proposals are, however, in very early stages, and will require soft forks in the network. + +Until these types of operating modes are implemented, modes should be chosen based on the likely threat model, computing and bandwidth constraints, and liability in Dash value. + +**Resources:** [Original Thread on UTXO Commitments](https://bitcointalk.org/index.php?topic=88208.0) diff --git a/docs/core/guide/operating-modes-simplified-payment-verification-spv.md b/docs/core/guide/operating-modes-simplified-payment-verification-spv.md new file mode 100644 index 000000000..1ce11484a --- /dev/null +++ b/docs/core/guide/operating-modes-simplified-payment-verification-spv.md @@ -0,0 +1,47 @@ +```{eval-rst} +.. meta:: + :title: Dash Simplified Payment Verification (SPV) + :description: Simplified Payment Verification (SPV) is a method used by lightweight clients to verify transactions without downloading the entire blockchain. +``` + +# Simplified Payment Verification (SPV) + +An alternative approach detailed in the [original Bitcoin paper](https://bitcoin.org/en/bitcoin-paper) is a client that only downloads the [headers](../resources/glossary.md#header) of [blocks](../resources/glossary.md#block) during the initial syncing process and then requests [transactions](../resources/glossary.md#transaction) from full [nodes](../resources/glossary.md#node) as needed. This scales linearly with the height of the [block chain](../resources/glossary.md#block-chain) at only 80 bytes per block header, or up to 16.8MB per year, regardless of total block size. + +As described in the white paper, the [merkle root](../resources/glossary.md#merkle-root) in the block header along with a merkle branch can prove to the SPV client that the transaction in question is embedded in a block in the block chain. This does not guarantee validity of the transactions that are embedded. Instead it demonstrates the amount of work required to perform a double-spend attack. + +The block's depth in the block chain corresponds to the cumulative [difficulty](../resources/glossary.md#difficulty) that has been performed to build on top of that particular block. The SPV client knows the merkle root and associated transaction information, and requests the respective merkle branch from a full node. Once the merkle branch has been retrieved, proving the existence of the transaction in the block, the SPV client can then look to block *depth* as a proxy for transaction validity and security. The cost of an attack on a user by a malicious node who inserts an invalid transaction grows with the cumulative difficulty built on top of that block, since the malicious node alone will be mining this forged chain. + +## Potential SPV Weaknesses + +If implemented naively, an SPV client has a few important weaknesses. + +First, while the SPV client can not be easily fooled into thinking a transaction is in a block when it is not, the reverse is not true. A full node can simply lie by omission, leading an SPV client to believe a transaction has not occurred. This can be considered a form of Denial of Service. One mitigation strategy is to connect to a number of full [nodes](../resources/glossary.md#node), and send the requests to each node. However this can be defeated by network partitioning or Sybil attacks, since identities are essentially free, and can be bandwidth intensive. Care must be taken to ensure the client is not cut off from honest nodes. + +Second, the SPV client only requests transactions from full nodes corresponding to keys it owns. If the SPV client downloads all blocks and then discards unneeded ones, this can be extremely bandwidth intensive. If they simply ask full nodes for blocks with specific transactions, this allows full nodes a complete view of the public [addresses](../resources/glossary.md#address) that correspond to the user. This is a large privacy leak, and allows for tactics such as denial of service for clients, users, or addresses that are disfavored by those running full nodes, as well as trivial linking of funds. A client could simply spam many fake transaction requests, but this creates a large strain on the SPV client, and can end up defeating the purpose of thin clients altogether. + +To mitigate the latter issue, Bloom filters have been implemented as a method of obfuscation and compression of block data requests. + +## Bloom Filters + +A [bloom filter](../resources/glossary.md#bloom-filter) is a space-efficient probabilistic data structure that is used to test membership of an element. The data structure achieves great data compression at the expense of a prescribed false positive rate. + +A Bloom filter starts out as an array of n bits all set to 0. A set of k random hash functions are chosen, each of which output a single integer between the range of 1 and n. + +When adding an element to the Bloom filter, the element is hashed k times separately, and for each of the k outputs, the corresponding Bloom filter bit at that index is set to 1. + +Querying of the Bloom filter is done by using the same hash functions as before. If all k bits accessed in the bloom filter are set to 1, this demonstrates with high probability that the element lies in the set. Clearly, the k indices could have been set to 1 by the addition of a combination of other elements in the domain, but the parameters allow the user to choose the acceptable false positive rate. + +Removal of elements can only be done by scrapping the bloom filter and re-creating it from scratch. + +## Application Of Bloom Filters + +Rather than viewing the false positive rates as a liability, it is used to create a tunable parameter that represents the desired privacy level and bandwidth trade-off. A SPV client creates their Bloom filter and sends it to a full node using the [`filterload` message](../reference/p2p-network-control-messages.md#filterload), which sets the filter for which transactions are desired. The [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd) allows addition of desired data to the filter without needing to send a totally new Bloom filter, and the [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear) allows the connection to revert to standard block discovery mechanisms. If the filter has been loaded, then full nodes will send a modified form of blocks, called a [merkle block](../resources/glossary.md#merkle-block). The merkle block is simply the block header with the merkle branch associated with the set Bloom filter. + +An SPV client can not only add transactions as elements to the filter, but also [public keys](../resources/glossary.md#public-key), data from signature scripts and pubkey scripts, and more. This enables [P2SH](../resources/glossary.md#pay-to-script-hash) transaction finding. + +If a user is more privacy-conscious, he can set the Bloom filter to include more false positives, at the expense of extra bandwidth used for transaction discovery. If a user is on a tight bandwidth budget, he can set the false-positive rate to low, knowing that this will allow full nodes a clear view of what transactions are associated with his client. + +**Resources:** [DashJ](https://github.com/HashEngineering/dashj), a Java implementation of Dash based on BitcoinJ that uses the SPV security model and Bloom filters. Used in many Android wallets. + +Bloom filters were standardized for use via [BIP37](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki). Review the BIP for implementation details. diff --git a/docs/core/guide/operating-modes.md b/docs/core/guide/operating-modes.md new file mode 100644 index 000000000..5d244c4a0 --- /dev/null +++ b/docs/core/guide/operating-modes.md @@ -0,0 +1,11 @@ +# Operating Modes + +Currently there are two primary methods of validating the [block chain](../resources/glossary.md#block-chain) as a client: Full [nodes](../resources/glossary.md#node) and SPV clients. Other methods, such as server-trusting methods, are not discussed as they are not recommended. + +```{toctree} +:maxdepth: 3 + +operating-modes-full-node +operating-modes-simplified-payment-verification-spv +operating-modes-future-proposals +``` diff --git a/docs/core/guide/p2p-network-block-broadcasting.md b/docs/core/guide/p2p-network-block-broadcasting.md new file mode 100644 index 000000000..2396a2980 --- /dev/null +++ b/docs/core/guide/p2p-network-block-broadcasting.md @@ -0,0 +1,49 @@ +```{eval-rst} +.. meta:: + :title: Dash Block Broadcasting + :description: When a miner discovers a new block, it broadcasts the new block to its peers using either Unsolicited Block Push or Standard Block Relay. +``` + +# Block Broadcasting + +When a [miner](../resources/glossary.md#miner) discovers a new [block](../resources/glossary.md#block), it broadcasts the new block to its [peers](../resources/glossary.md#peer) using one of the following methods: + +* **[Unsolicited Block Push](../resources/glossary.md#unsolicited-block-push):** + The miner sends a [`block` message](../reference/p2p-network-data-messages.md#block) to each of its full node peers with the new block. The miner can reasonably bypass the standard relay method in this way because it knows none of its peers already have the just-discovered block. + +* **[Standard Block Relay](../resources/glossary.md#standard-block-relay):** + The miner, acting as a standard relay node, sends an [`inv` message](../reference/p2p-network-data-messages.md#inv) to each of its peers (both full node and SPV) with an inventory referring to the new block. The most common responses are: + + * Each [blocks-first](../resources/glossary.md#blocks-first-sync) (BF) peer that wants the block replies with a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) requesting the full block. + + * Each [headers-first](../resources/glossary.md#headers-first-sync) (HF) peer that wants the block replies with a [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) containing the header hash of the highest-height header on its best header chain, and likely also some headers further back on the best header chain to allow [fork](../resources/glossary.md#fork) detection. That message is immediately followed by a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) requesting the full block. By requesting headers first, a headers-first peer can refuse [orphan blocks](../resources/glossary.md#orphan-block) as described in the subsection below. + + * Each [Simplified Payment Verification](../resources/glossary.md#simplified-payment-verification) (SPV) client that wants the block replies with a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) typically requesting a [merkle block](../resources/glossary.md#merkle-block). + + The miner replies to each request accordingly by sending the block in a [`block` message](../reference/p2p-network-data-messages.md#block), one or more headers in a [`headers` message](../reference/p2p-network-data-messages.md#headers), or the merkle block and transactions relative to the SPV client's [bloom filter](../resources/glossary.md#bloom-filter) in a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) followed by zero or more [`tx` messages](../reference/p2p-network-data-messages.md#tx). + +By default, Dash Core broadcasts blocks using [standard block relay](../resources/glossary.md#standard-block-relay), but it will accept blocks sent using either of the methods described above. + +Full nodes validate the received block and then advertise it to their peers using the standard block relay method described above. The condensed table below highlights the operation of the messages described above (Relay, BF, HF, and SPV refer to the relay node, a [blocks-first](../resources/glossary.md#blocks-first-sync) node, a [headers-first](../resources/glossary.md#headers-first-sync) node, and an [SPV](../resources/glossary.md#simplified-payment-verification) client; *any* refers to a node using any block retrieval method.) + +| **Message** | [inv message](../reference/p2p-network-data-messages.md#inv) | [getdata message](../reference/p2p-network-data-messages.md#getdata) | [getheaders message](../reference/p2p-network-data-messages.md#getheaders) | [headers message](../reference/p2p-network-data-messages.md#headers) +| --- | --- | --- | --- | --- | +| **From→To** | Relay→_Any_ | BF→Relay | HF→Relay | Relay→HF +| **Payload** | The inventory of the new block | The inventory of the new block | One or more header hashes on the HF node's best header chain (BHC) | Up to 2,000 headers connecting HF node's BHC to relay node's BHC +| **Message** | [`block` message](../reference/p2p-network-data-messages.md#block) | [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) | [`tx` message](../reference/p2p-network-data-messages.md#tx) | +| **From→To** | Relay→BF/HF | Relay→SPV | Relay→SPV | +| **Payload** | The new block in [serialized format](../reference/block-chain-serialized-blocks.md) | The new block filtered into a merkle block | Serialized transactions from the new block that match the bloom filter | + +## Orphan Blocks + +Blocks-first nodes may download [orphan blocks](../resources/glossary.md#orphan-block)---blocks whose previous [block header](../resources/glossary.md#block-header) hash field refers to a block header this node hasn't seen yet. In other words, orphan blocks have no known parent (unlike [stale blocks](../resources/glossary.md#stale-block), which have known parents but which aren't part of the best [block chain](../resources/glossary.md#block-chain)). + +![Difference Between Orphan And Stale Blocks](../../img/dev/en-orphan-stale-definition.svg) + +When a [blocks-first](../resources/glossary.md#blocks-first-sync) node downloads an orphan block, it will not validate it. Instead, it will send a [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) to the node which sent the orphan block; the broadcasting node will respond with an [`inv` message](../reference/p2p-network-data-messages.md#inv) containing [inventories](../resources/glossary.md#inventory) of any blocks the downloading node is missing (up to 500); the downloading node will request those blocks with a [`getdata` message](../reference/p2p-network-data-messages.md#getdata); and the broadcasting node will send those blocks with a [`block` message](../reference/p2p-network-data-messages.md#block). The downloading node will validate those blocks, and once the parent of the former orphan block has been validated, it will validate the former orphan block. + +Headers-first nodes avoid some of this complexity by always requesting block headers with the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) before requesting a block with the [`getdata` message](../reference/p2p-network-data-messages.md#getdata). The broadcasting node will send a [`headers` message](../reference/p2p-network-data-messages.md#headers) containing all the block headers (up to 2,000) it thinks the downloading node needs to reach the tip of the best header chain; each of those headers will point to its parent, so when the downloading node receives the [`block` message](../reference/p2p-network-data-messages.md#block), the block shouldn't be an orphan block---all of its parents should be known (even if they haven't been validated yet). If, despite this, the block received in the [`block` message](../reference/p2p-network-data-messages.md#block) is an orphan block, a headers-first node will discard it immediately. + +:::{note} +Orphan discarding does mean that headers-first nodes will ignore orphan blocks sent by miners in an unsolicited block push. +::: diff --git a/docs/core/guide/p2p-network-connecting-to-peers.md b/docs/core/guide/p2p-network-connecting-to-peers.md new file mode 100644 index 000000000..83d111231 --- /dev/null +++ b/docs/core/guide/p2p-network-connecting-to-peers.md @@ -0,0 +1,13 @@ +```{eval-rst} +.. meta:: + :title: Connecting to Peers + :description: Connecting to a peer is done by sending a version message, which contains your version number, block, and current time to the remote node. +``` + +# Connecting to Peers + +Connecting to a [peer](../resources/glossary.md#peer) is done by sending a [`version` message](../reference/p2p-network-control-messages.md#version), which contains your version number, block, and current time to the remote node. The remote node responds with its own [`version` message](../reference/p2p-network-control-messages.md#version). Then both nodes send a [`verack` message](../reference/p2p-network-control-messages.md#verack) to the other node to indicate the connection has been established. + +Once connected, the client can send to the remote node `getaddr` and [`addr` messages](../reference/p2p-network-control-messages.md#addr) to gather additional peers. + +In order to maintain a connection with a peer, nodes by default will send a message to peers before 30 minutes of inactivity. If 90 minutes pass without a message being received by a peer, the client will assume that connection has closed. diff --git a/docs/core/guide/p2p-network-initial-block-download.md b/docs/core/guide/p2p-network-initial-block-download.md new file mode 100644 index 000000000..6b1cfd5a0 --- /dev/null +++ b/docs/core/guide/p2p-network-initial-block-download.md @@ -0,0 +1,115 @@ +```{eval-rst} +.. meta:: + :title: Initial Block Download + :description: Initial block download (IBD) is the process where a full node downloads and validates all Dash blocks from the genesis block to the latest one to confirm transactions and recent blocks. +``` + +# Initial Block Download + +Before a full [node](../resources/glossary.md#node) can validate unconfirmed transactions and recently-mined [blocks](../resources/glossary.md#block), it must download and validate all blocks from block 1 (the block after the hardcoded [genesis block](../resources/glossary.md#genesis-block)) to the current tip of the best [block chain](../resources/glossary.md#block-chain). This is the [initial block download](../resources/glossary.md#initial-block-download) (IBD) or initial sync. + +Although the word "initial" implies this method is only used once, it can also be used any time a large number of blocks need to be downloaded, such as when a previously-caught-up node has been offline for a long time. In this case, a node can use the IBD method to download all the blocks which were produced since the last time it was online. + +Dash Core uses the IBD method any time the last block on its local best block chain has a [block header](../resources/glossary.md#block-header) time more than 24 hours in the past. Dash Core will also perform IBD if its local best block chain is more than 144 blocks lower than its local best [header chain](../resources/glossary.md#header-chain) (that is, the local block chain is more than about 6 hours in the past). + +## Blocks-First + +Dash Core (up until version 0.12.0.x) uses a simple initial block download (IBD) method we'll call *blocks-first*. The goal is to download the blocks from the best block chain in sequence. + +![Overview Of Blocks-First Method](../../img/dev/en-blocks-first-flowchart.svg) + +The first time a node is started, it only has a single block in its local best block chain---the hardcoded genesis block (block 0). This node chooses a remote [peer](../resources/glossary.md#peer), called the sync node, and sends it the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) illustrated below. + +![First GetBlocks Message Sent During IBD](../../img/dev/en-ibd-getblocks.svg) + +In the header hashes field of the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks), this new node sends the header hash of the only block it has, the genesis block (`b67a...0000` in [internal byte order](../resources/glossary.md#internal-byte-order)). It also sets the stop hash field to all zeroes to request a maximum-size response. + +Upon receipt of the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks), the sync node takes the first (and only) header hash and searches its local best block chain for a block with that header hash. It finds that block 0 matches, so it replies with 500 block [inventories](../resources/glossary.md#inventory) (the maximum response to a [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks)) starting from block 1. It sends these inventories in the [`inv` message](../reference/p2p-network-data-messages.md#inv) illustrated below. + +![First Inv Message Sent During IBD](../../img/dev/en-ibd-inv.svg) + +Inventories are unique identifiers for information on the [network](../resources/glossary.md#network). Each inventory contains a type field and the unique identifier for an instance of the object. For blocks, the unique identifier is a hash of the block's header. + +The block inventories appear in the [`inv` message](../reference/p2p-network-data-messages.md#inv) in the same order they appear in the block chain, so this first [`inv` message](../reference/p2p-network-data-messages.md#inv) contains inventories for blocks 1 through 501. (For example, the hash of block 1 is `4343...0000` as seen in the illustration above.) + +The IBD node uses the received inventories to request 128 blocks from the sync node in the [`getdata` message](../reference/p2p-network-data-messages.md#getdata) illustrated below. + +![First GetData Message Sent During IBD](../../img/dev/en-ibd-getdata.svg) + +It's important to [blocks-first](../resources/glossary.md#blocks-first-sync) nodes that the blocks be requested and sent in order because each block header references the header hash of the preceding block. That means the IBD node can't fully validate a block until its parent block has been received. Blocks that can't be validated because their parents haven't been received are called [orphan blocks](../resources/glossary.md#orphan-block); a subsection below describes them in more detail. + +Upon receipt of the [`getdata` message](../reference/p2p-network-data-messages.md#getdata), the sync node replies with each of the blocks requested. Each block is put into [serialized block](../resources/glossary.md#serialized-block) format and sent in a separate [`block` message](../reference/p2p-network-data-messages.md#block). The first [`block` message](../reference/p2p-network-data-messages.md#block) sent (for block 1) is illustrated below. + +![First Block Message Sent During IBD](../../img/dev/en-ibd-block.svg) + +The IBD node downloads each block, validates it, and then requests the next block it hasn't requested yet, maintaining a queue of up to 128 blocks to download. When it has requested every block for which it has an inventory, it sends another [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) to the sync node requesting the inventories of up to 500 more blocks. This second [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) contains multiple header hashes as illustrated below: + +![Second GetBlocks Message Sent During IBD](../../img/dev/en-ibd-getblocks2.svg) + +Upon receipt of the second [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks), the sync node searches its local best block chain for a block that matches one of the header hashes in the message, trying each hash in the order they were received. If it finds a matching hash, it replies with 500 block inventories starting with the next block from that point. But if there is no matching hash (besides the stopping hash), it assumes the only block the two nodes have in common is block 0 and so it sends an `inv` starting with block 1 (the same [`inv` message](../reference/p2p-network-data-messages.md#inv) seen several illustrations above). + +This repeated search allows the sync node to send useful inventories even if the IBD node's local block chain forked from the sync node's local block chain. This [fork](../resources/glossary.md#fork) detection becomes increasingly useful the closer the IBD node gets to the tip of the block chain. + +When the IBD node receives the second [`inv` message](../reference/p2p-network-data-messages.md#inv), it will request those blocks using [`getdata` messages](../reference/p2p-network-data-messages.md#getdata). The sync node will respond with [`block` messages](../reference/p2p-network-data-messages.md#block). Then the IBD node will request more inventories with another [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks)---and the cycle will repeat until the IBD node is synced to the tip of the block chain. At that point, the node will accept blocks sent through the regular block broadcasting described in a later subsection. + +### Blocks-First Advantages & Disadvantages + +The primary advantage of [blocks-first](../resources/glossary.md#blocks-first-sync) [IBD](../resources/glossary.md#initial-block-download) is its simplicity. The primary disadvantage is that the IBD node relies on a single sync node for all of its downloading. This has several implications: + +* **Speed Limits:** All requests are made to the sync node, so if the sync node has limited upload bandwidth, the IBD node will have slow download speeds. Note: if the sync node goes offline, Dash Core will continue downloading from another node---but it will still only download from a single sync node at a time. + +* **Download Restarts:** The sync node can send a non-best (but otherwise valid) block chain to the IBD node. The IBD node won't be able to identify it as non-best until the initial block download nears completion, forcing the IBD node to restart its block chain download over again from a different node. Dash Core ships with several block chain checkpoints at various block heights selected by developers to help an IBD node detect that it is being fed an alternative block chain history---allowing the IBD node to restart its download earlier in the process. + +* **Disk Fill Attacks:** Closely related to the download restarts, if the sync node sends a non-best (but otherwise valid) block chain, the chain will be stored on disk, wasting space and possibly filling up the disk drive with useless data. + +* **High Memory Use:** Whether maliciously or by accident, the sync node can send blocks out of order, creating orphan blocks which can't be validated until their parents have been received and validated. Orphan blocks are stored in memory while they await validation, which may lead to high memory use. + +All of these problems are addressed in part or in full by the headers-first IBD method used since Dash Core 0.12.0.x. + +**Resources:** The table below summarizes the messages mentioned throughout this subsection. The links in the message field will take you to the reference page for that message. + +| **Message** | [getblocks message](../reference/p2p-network-data-messages.md#getblocks) | [inv message](../reference/p2p-network-data-messages.md#inv) | [getdata message](../reference/p2p-network-data-messages.md#getdata) | [block message](../reference/p2p-network-data-messages.md#block) +| --- | --- | --- | --- | --- | +| **From→To** | IBD→Sync | Sync→IBD | IBD→Sync | Sync→IBD +| **Payload** | One or more header hashes | Up to 500 block inventories (unique identifiers) | One or more block inventories | One serialized block + +## Headers-First + +Dash Core 0.12.0+ uses an [initial block download](../resources/glossary.md#initial-block-download) (IBD) method called *[headers-first](../resources/glossary.md#headers-first-sync)*. The goal is to download the [headers](../resources/glossary.md#header) for the best [header chain](../resources/glossary.md#header-chain), partially validate them as best as possible, and then download the corresponding [blocks](../resources/glossary.md#block) in parallel. This solves several problems with the older [blocks-first](../resources/glossary.md#blocks-first-sync) IBD method. + +![Overview Of Headers-First Method](../../img/dev/en-headers-first-flowchart.svg) + +The first time a node is started, it only has a single block in its local best [block chain](../resources/glossary.md#block-chain)---the hardcoded [genesis block](../resources/glossary.md#genesis-block) (block 0). The node chooses a remote [peer](../resources/glossary.md#peer), which we'll call the sync node, and sends it the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) illustrated below. + +![First getheaders message](../../img/dev/en-ibd-getheaders.svg) + +In the header hashes field of the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders), the new node sends the header hash of the only block it has, the genesis block (`b67a...0000` in internal byte order). It also sets the stop hash field to all zeroes to request a maximum-size response. + +Upon receipt of the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders), the sync node takes the first (and only) header hash and searches its local best block chain for a block with that header hash. It finds that block 0 matches, so it replies with 2,000 header (the maximum response) starting from block 1. It sends these header hashes in the [`headers` message](../reference/p2p-network-data-messages.md#headers) illustrated below. + +![First headers message](../../img/dev/en-ibd-headers.svg) + +The [IBD](../resources/glossary.md#initial-block-download) [node](../resources/glossary.md#node) can partially validate these block headers by ensuring that all fields follow [consensus rules](../resources/glossary.md#consensus-rules) and that the hash of the header is below the [target threshold](../resources/glossary.md#target) according to the nBits field. (Full validation still requires all transactions from the corresponding block.) + +After the IBD node has partially validated the block headers, it can do two things in parallel: + +1. **Download More Headers:** the IBD node can send another [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) to the sync node to request the next 2,000 headers on the best header chain. Those headers can be immediately validated and another batch requested repeatedly until a [`headers` message](../reference/p2p-network-data-messages.md#headers) is received from the sync node with fewer than 2,000 headers, indicating that it has no more headers to offer. A [headers](../resources/glossary.md#header) sync for 1 million blocks can be completed in 500 round trips, or about 80 MB of downloaded data. + + Once the IBD node receives a [`headers` message](../reference/p2p-network-data-messages.md#headers) with fewer than 2,000 headers from the sync node, it sends a [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) to each of its outbound peers to get their view of best header chain. By comparing the responses, it can easily determine if the headers it has downloaded belong to the best header chain reported by any of its outbound peers. This means a dishonest sync node will quickly be discovered even if checkpoints aren't used (as long as the IBD node connects to at least one honest peer; Dash Core will continue to provide checkpoints in case honest peers can't be found). + +2. **Download Blocks:** While the IBD node continues downloading headers, and after the headers finish downloading, the IBD node will request and download each [block](../resources/glossary.md#block). The IBD node can use the block header hashes it computed from the header chain to create [`getdata` messages](../reference/p2p-network-data-messages.md#getdata) that request the blocks it needs by their [inventory](../resources/glossary.md#inventory). It doesn't need to request these from the sync node---it can request them from any of its full node [peers](../resources/glossary.md#peer). (Although not all full nodes may store all blocks.) This allows it to fetch blocks in parallel and avoid having its download speed constrained to the upload speed of a single sync node. + + To spread the load between multiple peers, Dash Core will only request up to 16 blocks at a time from a single peer. Combined with its maximum of 8 outbound connections, this means Dash Core using headers-first will request a maximum of 128 blocks simultaneously during IBD (the same maximum number that blocks-first Dash Core requested from its sync node). + +![Simulated Headers-First Download Window](../../img/dev/en-headers-first-moving-window.svg) + +Dash Core's headers-first mode uses a 1,024-block moving download window to maximize download speed. The lowest-height block in the window is the next block to be validated; if the block hasn't arrived by the time Dash Core is ready to validate it, Dash Core will wait a minimum of two more seconds for the stalling node to send the block. If the block still hasn't arrived, Dash Core will disconnect from the stalling node and attempt to connect to another node. For example, in the illustration above, Node A will be disconnected if it doesn't send block 3 within at least two seconds. + +Once the IBD node is synced to the tip of the block chain, it will accept blocks sent through the regular block broadcasting described in a later subsection. + +**Resources:** The table below summarizes the messages mentioned throughout this subsection. The links in the message field will take you to the reference page for that message. + +| **Message** | [getheaders message](../reference/p2p-network-data-messages.md#getheaders) | [headers message](../reference/p2p-network-data-messages.md#headers) | [getdata message](../reference/p2p-network-data-messages.md#getdata) | [block message](../reference/p2p-network-data-messages.md#block) +| --- | --- | --- | --- | --- | +| **From→To** | IBD→Sync | Sync→IBD | IBD→*Many* | *Many*→IBD +| **Payload** | One or more header hashes | Up to 2,000 block headers | One or more block inventories derived from header hashes | One serialized block diff --git a/docs/core/guide/p2p-network-misbehaving-nodes.md b/docs/core/guide/p2p-network-misbehaving-nodes.md new file mode 100644 index 000000000..d5b45e7d2 --- /dev/null +++ b/docs/core/guide/p2p-network-misbehaving-nodes.md @@ -0,0 +1,77 @@ +```{eval-rst} +.. meta:: + :title: Misbehaving Nodes + :description: Dash Core discourages peer nodes from sending false information by not immediately disconnecting but by prioritizing them for eviction, with no time-out or removal options. +``` + +# Misbehaving Nodes + +:::{note} +Dash Core 18.1.0 introduced changes to how misbehaving peers are treated. +::: + +Take note that for both types of broadcasting, mechanisms are in place to punish misbehaving [peers](../resources/glossary.md#peer) who take up bandwidth and computing resources by sending false information. Since Dash Core 18.1.0, peers that misbehave (e.g. send us invalid blocks) are referred to as discouraged nodes in log output. They are not strictly banned: incoming connections are still allowed from them, but they're preferred for eviction. + +Furthermore, a few additional changes are introduced to how discouraged addresses are treated: + +* Discouraging an address does not time out automatically after 24 hours (or the `-bantime` setting). Depending on traffic from other peers, discouragement may time out at an indeterminate time. + +* Discouragement is not persisted over restarts. + +* There is no method to list discouraged addresses. They are not returned by the [`listbanned` RPC](../api/remote-procedure-calls-network.md#listbanned). + +* Discouragement cannot be removed with the [`setban remove` RPC](../api/remote-procedure-calls-network.md#setban) command. If you need to remove a discouragement, you can remove all discouragements by stopping and restarting your node. + + If a peer gets a banscore above the `-banscore=` threshold (100 by default), they will be disconnected and discouraged. + +| Type | Misbehavior | Ban Score | Description | +| ---- | ----------- | --------- | ----------- | +| Net | GetBlockTxn Index Error | **100** | Peer relayed a [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn) with out-of-bound indices +| Net | Bloom Filter Service | **100** | Bloom filter message received from peer that has bloom filter commands disabled by default (protocol version > 70201) (`filterload` message, [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd), or [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear)) +| Net | Block Rejected | 1 | Peer rejected the block it requested from us +| Net | Duplicate Version | 1 | Duplicate [`version` message](../reference/p2p-network-control-messages.md#version) received +| Net | Wrong Devnet | **100** | Peer responded with the wrong devnet version (`version` message) +| Net | Wrong Devnet | 1 | Peer connected using the wrong devnet version (`version` message) +| Net | No Version | 1 | Received a message prior to receiving a [`version` message](../reference/p2p-network-control-messages.md#version) +| Net | No Verack | 1 | After sending [`version` message](../reference/p2p-network-control-messages.md#version), received a message other than a [`verack` message](../reference/p2p-network-control-messages.md#verack) back first +| Net | Address List Size | 20 | More than 1000 addresses received (`addr` message) +| Net | Inventory List | 20 | More than `MAX_INV_SZ` (50000) inventories received (`inv` message) +| Net | Get Data Size | 20 | More than `MAX_INV_SZ` (50000) inventories requested (`getdata` message) +| Net | Orphan Transaction | **Varies** | Peer relayed an invalid orphan transaction. Ban score varies from 0-100 based on the specific reason (values set by `AcceptToMemoryPoolWorker()`) +| Net | Bad Transaction | **Varies** | Transaction rejected from the mempool +| Net | Invalid Header | **Varies** | Invalid block header received from peer (`cmpctblock` message) +| Net | Invalid CompactBlock | **100** | Invalid compact block /non-matching block transactions received from peer (`cmpctblock` message) +| Net | Header List Size | 20 | More than `MAX_HEADERS_RESULTS` (2000) headers received (`headers` message) +| Net | Header List Sequence | 20 | Non-continous headers sequence received (`headers` message) +| Net | Invalid Block | **Varies** | Invalid block header received from peer +| Net | Bloom Filter Size | **100** | Maximum script element size (520) exceeded (`filterload` message or [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd)) +| Net | MN List Diff | 1 | Failed to get masternode list diff (`getmnlistd` message) +| Net | Unrequested MN List Diff | **100** | Peer provided an unrequested masternode list diff (`mnlistdiff` message) +| InstantSend | Invalid Lock Message | **100** | Invalid TXID or inputs in lock message (`isdlock` message) +| InstantSend | Verify Error | 20 | Peer relayed a message that failed to verify +| LLMQ ChainLock | Invalid | 10 | Invalid ChainLock message (`clsig` message) +| LLMQ Commitment | Null QcTx | **100** | Peer relayed a block with a null commitment +| LLMQ Commitment | Invalid LLMQ Type | **100** | Peer relayed a block containing an invalid LLMQ Type +| LLMQ Commitment | Invalid Height | **100** | Peer relayed a block that is not the first block in the DKG interval +| LLMQ Commitment | Invalid Commitment | **100** | Peer relayed a block with an invalid quorum commitment +| LLMQ DKG | Empty Message | **100** | Peer relayed a message with no payload +| LLMQ DKG | Invalid LLMQ Type | **100** | Peer relayed a message for an incorrect LLMQ Type +| LLMQ DKG | Invalid Message | **100** | Peer relayed a message that could not be deserialized +| LLMQ DKG | Preverify Failed | **100** | Peer relayed a message that could not be pre-verified +| LLMQ DKG | Signature | **100** | Peer relayed a message with an invalid signature +| LLMQ DKG | Full Verify Failed | **100** | Peer relayed a message that failed full verification +| LLMQ Signing | Too Many Messages | **100** | Maximum message count exceed in [`qsigsesann` message](../reference/p2p-network-quorum-messages.md#qsigsesann), [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv), [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs), or [`qbsigs` message](../reference/p2p-network-quorum-messages.md#qbsigs) +| LLMQ Signing | Signature | **100** | Peer relayed a message with an invalid recovered signature or signature share +| Masternode Authentication | Duplicate Message | **100** | Only 1 message allowed (`mnauth` message) +| Masternode Authentication | Invalid Services | **100** | Peer not advertising `NODE_NETWORK` or `NODE_BLOOM` services (`mnauth` message) +| Masternode Authentication | Empty Hash | **100** | Peer relayed a message with a null ProRegTx hash (`mnauth` message) +| Masternode Authentication | Signature | **100** | Peer relayed a message with an invalid signature (`mnauth` message) +| Masternode Authentication | Invalid MN | 10 | Peer not in the valid masternode list (`mnauth` message) +| Masternode Authentication | Invalid Signature | 10 | Signature verification failed (`mnauth` message) +| Governance | Sync | 20 | Requesting a governance sync too frequently (`govsync` message with empty hash) +| Governance | Invalid Object | 20 | Peer relayed an invalid governance object (`govobj` message) +| Governance | Invalid Vote | 20 | Peer relayed an invalid/invalid old vote(`govobjvote` message) +| Governance | Unsupported Vote Signal | 20 | Vote signal outside the accepted range (see [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote)) +| CoinJoin | Signature | 10 | Peer relayed a message with an invalid signature (`dsq` message) +| Spork | Invalid Time | **100** | Peer relayed a spork with a timestamp too far in the future (`spork` message) +| Spork | Signature | **100** | Peer relayed a spork with an invalid signature (`spork` message) diff --git a/docs/core/guide/p2p-network-peer-discovery.md b/docs/core/guide/p2p-network-peer-discovery.md new file mode 100644 index 000000000..6fc9113a9 --- /dev/null +++ b/docs/core/guide/p2p-network-peer-discovery.md @@ -0,0 +1,43 @@ +```{eval-rst} +.. meta:: + :title: Peer Discovery + :description: Initial peer discovery in Dash Core involves querying hardcoded DNS seeds, exchanging peer to peer messages, and using a list of hardcoded masternode IP addresses to establish connections. +``` + +# Peer Discovery + +## DNS Seeds + +When started for the first time, programs don't know the IP addresses of any active full [nodes](../resources/glossary.md#node). In order to discover some IP addresses, they query one or more DNS names (called [DNS seeds](../resources/glossary.md#dns-seed)) hardcoded into Dash Core. The response to the lookup should include one or more DNS A records with the IP addresses of full nodes that may accept new incoming connections. For example, using the Unix `dig`command: + +``` +;; QUESTION SECTION: +;dnsseed.dash.org. IN A + +;; ANSWER SECTION: +dnsseed.dash.org. 3600 IN A 140.82.38.181 +dnsseed.dash.org. 3600 IN A 142.93.141.81 +dnsseed.dash.org. 3600 IN A 144.76.117.234 + +[...] +``` + +The [DNS seeds](../resources/glossary.md#dns-seed) are maintained by Dash community members: some of them provide dynamic DNS seed servers which automatically get IP addresses of active nodes by scanning the network; others provide static DNS seeds that are updated manually and are more likely to provide IP addresses for inactive nodes. In either case, nodes are added to the DNS seed if they run on the default Dash ports of 9999 for [mainnet](../resources/glossary.md#mainnet) or 19999 for [testnet](../resources/glossary.md#testnet). + +DNS seed results are not authenticated and a malicious seed operator or network man-in-the-middle attacker could return only IP addresses of nodes controlled by the attacker, isolating a program on the attacker's own network and allowing the attacker to feed it bogus transactions and blocks. For this reason, programs should not rely on DNS seeds exclusively. + +## P2P Peer List Broadcast + +Once a program has connected to the [network](../resources/glossary.md#network), its [peers](../resources/glossary.md#peer) can begin to send it `addr` (address) messages with the IP addresses and port numbers of other peers on the network, providing a fully decentralized method of peer discovery. Dash Core keeps a record of known peers in a persistent on-disk database which usually allows it to connect directly to those peers on subsequent startups without having to use DNS seeds. + +However, peers often leave the network or change IP addresses, so programs may need to make several different connection attempts at startup before a successful connection is made. This can add a significant delay to the amount of time it takes to connect to the network, forcing a user to wait before sending a transaction or checking the status of payment. + +Dash Core tries to strike a balance between minimizing delays and avoiding unnecessary DNS seed use: if Dash Core has entries in its peer database, it spends up to 11 seconds attempting to connect to at least one of them before falling back to seeds; if a connection is made within that time, it does not query any seeds. + +## Hardcoded Masternode IPs + +Dash Core also includes a hardcoded list of IP addresses and port numbers to several dozen nodes which were active around the time that particular version of the software was first released. Starting with Dash Core 0.12.3, [masternodes](../resources/glossary.md#masternode) are used for the seed list since they must remain online to receive their portion of the block reward (good availability) and must be compliant with [consensus rules](../resources/glossary.md#consensus-rules) (reliable). Dash Core will start attempting to connect to these nodes if none of the DNS seed servers have responded to a query within 60 seconds, providing an automatic fallback option. + +As a manual fallback option, Dash Core also provides several command-line connection options, including the ability to get a list of peers from a specific node by IP address, or to make a persistent connection to a specific node by IP address. See the `-help` text for details. + +**Resources:** [Dash Seeder](https://github.com/nightlydash/dash-seeder/tree/master), the program run by several of the seeds used by Dash Core. The Dash Core [DNS Seed Policy](https://github.com/dashpay/dash/blob/master/doc/dnsseed-policy.md). The hardcoded list of IP addresses used by Dash Core is generated using the [makeseeds script](https://github.com/dashpay/dash/tree/master/contrib/seeds). diff --git a/docs/core/guide/p2p-network-transaction-broadcasting.md b/docs/core/guide/p2p-network-transaction-broadcasting.md new file mode 100644 index 000000000..61e017ec9 --- /dev/null +++ b/docs/core/guide/p2p-network-transaction-broadcasting.md @@ -0,0 +1,23 @@ +```{eval-rst} +.. meta:: + :title: Transaction Broadcasting + :description: Transaction broadcasting is the process where a transaction is sent to peer nodes in the Dash network for validation and further propagation. +``` + +# Transaction Broadcasting + +In order to send a [transaction](../resources/glossary.md#transaction) to a [peer](../resources/glossary.md#peer), an [`inv` message](../reference/p2p-network-data-messages.md#inv) is sent. If a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) is received in reply, the transaction is sent using a [`tx` message](../reference/p2p-network-data-messages.md#tx). If it is a valid transaction, the peer receiving the transaction also forwards the transaction to its peers. + +:::{note} +Dash Core 18.1.0 backported changes from Bitcoin to support block-only relay connections (specific connections that do not relay transaction information). This change was made to improve network topology and reduce information leaked by transaction relay. See the [Bitcoin pull request](https://github.com/bitcoin/bitcoin/pull/15759) for additional details. +::: + +## Memory Pool + +Full peers may keep track of unconfirmed transactions which are eligible to be included in the next [block](../resources/glossary.md#block). This is essential for miners who will actually mine some or all of those transactions, but it's also useful for any peer who wants to keep track of unconfirmed transactions, such as peers serving unconfirmed transaction information to SPV clients. + +Because unconfirmed transactions have no permanent status in Dash, Dash Core stores them in non-persistent memory, calling them a memory pool or mempool. When a peer shuts down, its memory pool is lost except for any transactions stored by its wallet. This means that never-mined unconfirmed transactions tend to slowly disappear from the network as peers restart or as they purge some transactions to make room in memory for others. + +Transactions which are mined into blocks that later become [stale blocks](../resources/glossary.md#stale-block) may be added back into the memory pool. These re-added transactions may be re-removed from the pool almost immediately if the replacement blocks include them. This is the case in Dash Core, which removes stale blocks from the chain one by one, starting with the tip (highest block). As each block is removed, its transactions are added back to the memory pool. After all of the stale blocks are removed, the replacement blocks are added to the chain one by one, ending with the new tip. As each block is added, any transactions it confirms are removed from the memory pool. + +SPV clients don't have a memory pool for the same reason they don't relay transactions. They can't independently verify that a transaction hasn't yet been included in a block and that it only spends UTXOs, so they can't know which transactions are eligible to be included in the next block. diff --git a/docs/core/guide/p2p-network.md b/docs/core/guide/p2p-network.md new file mode 100644 index 000000000..85891c009 --- /dev/null +++ b/docs/core/guide/p2p-network.md @@ -0,0 +1,25 @@ +```{eval-rst} +.. meta:: + :title: P2P Network + :description: The Dash P2P network is a system where full nodes collaboratively maintain a network for block and transaction exchange, with some nodes storing the entire blockchain (archival nodes) and others only storing parts of it (pruned nodes). +``` + +# P2P Network + +The Dash network protocol allows full [nodes](../resources/glossary.md#node) (peers) to collaboratively maintain a peer-to-peer [network](../resources/glossary.md#network) for [block](../resources/glossary.md#block) and [transaction](../resources/glossary.md#transaction) exchange. Full nodes download and verify every block and transaction prior to relaying them to other nodes. Archival nodes are full nodes which store the entire [block chain](../resources/glossary.md#block-chain) and can serve historical blocks to other nodes. Pruned nodes are full nodes which do not store the entire block chain. Many SPV clients also use the Dash network protocol to connect to full nodes. + +Consensus rules do _not_ cover networking, so Dash programs may use alternative networks and protocols, such as the [high-speed block relay network](https://www.mail-archive.com/bitcoin-development@lists.sourceforge.net/msg03189.html) used by some miners and the [dedicated transaction information servers](https://github.com/spesmilo/electrum-server) used by some wallets that provide SPV-level security. + +To provide practical examples of the Dash peer-to-peer network, this section uses Dash Core as a representative full node and [DashJ](https://github.com/HashEngineering/dashj) as a representative SPV client. Both programs are flexible, so only default behavior is described. Also, for privacy, actual IP addresses in the example output below have been replaced with [RFC5737](http://tools.ietf.org/html/rfc5737) reserved IP addresses. + +```{toctree} +:maxdepth: 3 +:titlesonly: + +p2p-network-peer-discovery +p2p-network-connecting-to-peers +p2p-network-initial-block-download +p2p-network-block-broadcasting +p2p-network-transaction-broadcasting +p2p-network-misbehaving-nodes +``` diff --git a/docs/core/guide/transactions-avoiding-key-reuse.md b/docs/core/guide/transactions-avoiding-key-reuse.md new file mode 100644 index 000000000..b5b739c64 --- /dev/null +++ b/docs/core/guide/transactions-avoiding-key-reuse.md @@ -0,0 +1,23 @@ +```{eval-rst} +.. meta:: + :title: Avoiding Key Reuse + :description: Avoiding key reuse in Dash is the practice of using each public key only twice (to receive and spend a payment) to enhance financial privacy and security. +``` + +# Avoiding Key Reuse + +In a [transaction](../resources/glossary.md#transaction), the spender and receiver each reveal to each other all [public keys](../resources/glossary.md#public-key) or [addresses](../resources/glossary.md#address) used in the transaction. This allows either person to use the public [block chain](../resources/glossary.md#block-chain) to track past and future transactions involving the other person's same public keys or addresses. + +If the same public key is reused often, as happens when people use Dash addresses (hashed public keys) as static payment addresses, other people can easily track the receiving and spending habits of that person, including how many [duffs](../resources/glossary.md#duffs) they control in known addresses. + +It doesn't have to be that way. If each public key is used exactly twice---once to receive a payment and once to spend that payment---the user can gain a significant amount of financial privacy. + +Even better, using new public keys or [unique addresses](../resources/glossary.md#unique-addresses) when accepting payments or creating change outputs can be combined with other techniques discussed later, such as CoinJoin or merge avoidance, to make it extremely difficult to use the block chain by itself to reliably track how users receive and spend their duffs. + +Avoiding key reuse can also provide security against attacks which might allow reconstruction of [private keys](../resources/glossary.md#private-key) from public keys (hypothesized) or from signature comparisons (possible today under certain circumstances described below, with more general attacks hypothesized). + +1. Unique (non-reused) [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) and [P2SH](../resources/glossary.md#pay-to-script-hash) addresses protect against the first type of attack by keeping ECDSA public keys hidden (hashed) until the first time duffs sent to those addresses are spent, so attacks are effectively useless unless they can reconstruct private keys in less than the hour or two it takes for a transaction to be well protected by the block chain. + +2. Unique (non-reused) private keys protect against the second type of attack by only generating one signature per private key, so attackers never get a subsequent signature to use in comparison-based attacks. Existing comparison-based attacks are only practical today when insufficient entropy is used in signing or when the entropy used is exposed by some means, such as a [side-channel attack](https://en.wikipedia.org/wiki/Side_channel_attack). + +So, for both privacy and security, we encourage you to build your applications to avoid public key reuse and, when possible, to discourage users from reusing addresses. If your application needs to provide a fixed URI to which payments should be sent, please use `dash:` URIs as defined by [BIP21](https://github.com/dashevo/bips/blob/master/bip-0021.mediawiki#general-format). diff --git a/docs/core/guide/transactions-locktime-and-sequence-number.md b/docs/core/guide/transactions-locktime-and-sequence-number.md new file mode 100644 index 000000000..0edbaa958 --- /dev/null +++ b/docs/core/guide/transactions-locktime-and-sequence-number.md @@ -0,0 +1,27 @@ +```{eval-rst} +.. meta:: + :title: Locktime and Sequence Number + :description: Locktime specifies the earliest a transaction can be added to the blockchain, while Sequence Number can enable or disable this locktime. +``` + +# Locktime and Sequence Number + +One thing all signature hash types sign is the transaction's [locktime](../resources/glossary.md#locktime). (Called nLockTime in the Dash Core source code.) The locktime indicates the earliest time a [transaction](../resources/glossary.md#transaction) can be added to the [block chain](../resources/glossary.md#block-chain). + +Locktime allows signers to create time-locked transactions which will only become valid in the future, giving the signers a chance to change their minds. + +If any of the signers change their mind, they can create a new non-locktime transaction. The new transaction will use, as one of its [inputs](../resources/glossary.md#input), one of the same [outputs](../resources/glossary.md#output) which was used as an input to the locktime transaction. This makes the locktime transaction invalid if the new transaction is added to the block chain before the time lock expires. + +Care must be taken near the expiry time of a time lock. The peer-to-peer [network](../resources/glossary.md#network) allows block time to be up to two hours ahead of real time, so a locktime transaction can be added to the block chain up to two hours before its time lock officially expires. Also, blocks are not created at guaranteed intervals, so any attempt to cancel a valuable transaction should be made a few hours before the time lock expires. + +Previous versions of Dash Core provided a feature which prevented transaction signers from using the method described above to cancel a time-locked transaction, but a necessary part of this feature was disabled to prevent denial of service attacks. A legacy of this system is a four-byte [sequence number](../resources/glossary.md#sequence-number) in every input. Sequence numbers were meant to allow multiple signers to agree to update a transaction; when they finished updating the transaction, they could agree to set every input's sequence number to the four-byte unsigned maximum (0xffffffff), allowing the transaction to be added to a block even if its time lock had not expired. + +Even today, setting all sequence numbers to 0xffffffff (the default in Dash Core) can still disable the time lock, so if you want to use locktime, at least one input must have a sequence number below the maximum. Since sequence numbers are not used by the network for any other purpose, setting any sequence number to zero is sufficient to enable locktime. + +## Locktime Parsing Rules + +Locktime itself is an unsigned 4-byte integer which can be parsed two ways: + +* If less than 500 million, locktime is parsed as a [block height](../resources/glossary.md#block-height). The transaction can be added to any block which has this height or higher. + +* If greater than or equal to 500 million, locktime is parsed using the Unix epoch time format (the number of seconds elapsed since 1970-01-01T00:00 UTC---currently over 1.395 billion). The transaction can be added to any block whose block time is greater than the locktime. diff --git a/docs/core/guide/transactions-non-standard-transactions.md b/docs/core/guide/transactions-non-standard-transactions.md new file mode 100644 index 000000000..eadf55692 --- /dev/null +++ b/docs/core/guide/transactions-non-standard-transactions.md @@ -0,0 +1,29 @@ +```{eval-rst} +.. meta:: + :title: Non-Standard Transactions + :description: Non-Standard Transactions are those not adhering to specific network rules, hence not accepted by nodes running on default-settings. +``` + +# Non-Standard Transactions + +If you use anything besides a standard [pubkey script](../resources/glossary.md#pubkey-script) in an [output](../resources/glossary.md#output), [peers](../resources/glossary.md#peer) and miners using the default Dash Core settings will neither accept, broadcast, nor mine your [transaction](../resources/glossary.md#transaction). When you try to broadcast your transaction to a peer running the default settings, you will receive an error. + +If you create a [redeem script](../resources/glossary.md#redeem-script), hash it, and use the hash in a [P2SH](../resources/glossary.md#pay-to-script-hash) output, the network sees only the hash, so it will accept the output as valid no matter what the redeem script says. This allows payment to non-standard scripts, and as of Bitcoin Core 0.11, almost all valid redeem scripts can be spent. The exception is scripts that use unassigned [NOP opcodes](https://en.bitcoin.it/wiki/Script#Reserved_words); these opcodes are reserved for future soft forks and can only be relayed or mined by nodes that don't follow the standard mempool policy. + +:::{note} +Standard transactions are designed to protect and help the network, not prevent you from making mistakes. It's easy to create standard transactions which make the duffs sent to them unspendable. +::: + +Standard transactions must also meet the following conditions: + +* The transaction must be finalized: either its locktime must be in the past (or less than or equal to the current block height), or all of its sequence numbers must be 0xffffffff. + +* The transaction must be smaller than 100,000 bytes. That's around 200 times larger than a typical single-input, single-output P2PKH transaction. + +* Each of the transaction's signature scripts must be smaller than 1,650 bytes. That's large enough to allow 15-of-15 multisig transactions in P2SH using compressed [public keys](../resources/glossary.md#public-key). + +* Bare (non-P2SH) multisig transactions which require more than 3 public keys are currently non-standard. + +* The transaction's [signature script](../resources/glossary.md#signature-script) must only push data to the script evaluation stack. It cannot push new opcodes, with the exception of opcodes which solely push data to the stack. + +* The transaction must not include any [outputs](../resources/glossary.md#output) which receive fewer than 1/3 as many [duffs](../resources/glossary.md#duffs) as it would take to spend it in a typical [input](../resources/glossary.md#input). That's currently 5460 duffs for a P2PKH or P2SH output on a Dash Core node with the default relay fee. **Exception: standard null data outputs must receive zero duffs.** diff --git a/docs/core/guide/transactions-p2pkh-script-validation.md b/docs/core/guide/transactions-p2pkh-script-validation.md new file mode 100644 index 000000000..4e609e670 --- /dev/null +++ b/docs/core/guide/transactions-p2pkh-script-validation.md @@ -0,0 +1,43 @@ +```{eval-rst} +.. meta:: + :title: P2PKH Script Validation + :description: In a Dash P2PKH transaction, a spender’s signature script contains an secp256k1 signature (sig) and full public key (pubkey). Checkout the full structure in this section. +``` + +# P2PKH Script Validation + +The validation procedure requires evaluation of the [signature script](../resources/glossary.md#signature-script) and [pubkey script](../resources/glossary.md#pubkey-script). In a [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) [output](../resources/glossary.md#output), the pubkey script is: + +``` +OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +``` + +The spender's signature script is evaluated and prefixed to the beginning of the script. In a P2PKH transaction, the signature script contains an secp256k1 signature (sig) and full public key (pubkey), creating the following concatenation: + +``` + OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +``` + +The script language is a [Forth-like](https://en.wikipedia.org/wiki/Forth_%28programming_language%29) stack-based language deliberately designed to be stateless and not Turing complete. Statelessness ensures that once a [transaction](../resources/glossary.md#transaction) is added to the [block chain](../resources/glossary.md#block-chain), there is no condition which renders it permanently unspendable. Turing-incompleteness (specifically, a lack of loops or gotos) makes the script language less flexible and more predictable, greatly simplifying the security model. + +To test whether the transaction is valid, signature script and pubkey script operations are executed one item at a time, starting with Bob's signature script and continuing to the end of Alice's pubkey script. The figure below shows the evaluation of a standard P2PKH pubkey script; below the figure is a description of the process. + +![P2PKH Stack Evaluation](../../img/dev/en-p2pkh-stack.svg) + +* The [signature](../resources/glossary.md#signature) (from Bob's signature script) is added (pushed) to an empty stack. Because it's just data, nothing is done except adding it to the stack. The [public key](../resources/glossary.md#public-key) (also from the signature script) is pushed on top of the signature. + +* From Alice's pubkey script, the `OP_DUP` operation is executed. `OP_DUP` pushes onto the stack a copy of the data currently at the top of it---in this case creating a copy of the public key Bob provided. + +* The operation executed next, `OP_HASH160`, pushes onto the stack a hash of the data currently on top of it---in this case, Bob's public key. This creates a hash of Bob's public key. + +* Alice's pubkey script then pushes the pubkey hash that Bob gave her for the first transaction. At this point, there should be two copies of Bob's pubkey hash at the top of the stack. + +* Now it gets interesting: Alice's pubkey script executes `OP_EQUALVERIFY`. `OP_EQUALVERIFY` is equivalent to executing `OP_EQUAL` followed by `OP_VERIFY` (not shown). + + `OP_EQUAL` (not shown) checks the two values at the top of the stack; in this case, it checks whether the pubkey hash generated from the full public key Bob provided equals the pubkey hash Alice provided when she created transaction #1. `OP_EQUAL` pops (removes from the top of the stack) the two values it compared, and replaces them with the result of that comparison: zero (*false*) or one (*true*). + + `OP_VERIFY` (not shown) checks the value at the top of the stack. If the value is *false* it immediately terminates evaluation and the transaction validation fails. Otherwise it pops the *true* value off the stack. + +* Finally, Alice's pubkey script executes `OP_CHECKSIG`, which checks the signature Bob provided against the now-authenticated public key he also provided. If the signature matches the public key and was generated using all of the data required to be signed, `OP_CHECKSIG` pushes the value *true* onto the top of the stack. + +If *false* is not at the top of the stack after the pubkey script has been evaluated, the transaction is valid (provided there are no other problems with it). diff --git a/docs/core/guide/transactions-p2sh-scripts.md b/docs/core/guide/transactions-p2sh-scripts.md new file mode 100644 index 000000000..913f370be --- /dev/null +++ b/docs/core/guide/transactions-p2sh-scripts.md @@ -0,0 +1,21 @@ +```{eval-rst} +.. meta:: + :title: P2SH Scripts + :description: P2SH (Pay-to-Script-Hash) is a Dash transaction type that enhances flexibility in script creation and execution. +``` + +# P2SH Scripts + +Pubkey scripts are created by spenders who have little interest what that script does. Receivers do care about the script conditions and, if they want, they can ask spenders to use a particular [pubkey script](../resources/glossary.md#pubkey-script). Unfortunately, custom pubkey scripts are less convenient than short Dash [addresses](../resources/glossary.md#address) and there was no standard way to communicate them between programs prior to widespread implementation of the BIP70 Payment Protocol discussed later. + +To solve these problems, pay-to-script-hash ([P2SH](../resources/glossary.md#pay-to-script-hash)) transactions were created in 2012 to let a spender create a pubkey script containing a hash of a second script, the [redeem script](../resources/glossary.md#redeem-script). + +The basic P2SH workflow, illustrated below, looks almost identical to the [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) workflow. Bob creates a redeem script with whatever script he wants, hashes the redeem script, and provides the [redeem script](../resources/glossary.md#redeem-script) hash to Alice. Alice creates a P2SH-style [output](../resources/glossary.md#output) containing Bob's redeem script hash. + +![Creating A P2SH Redeem Script And Hash](../../img/dev/en-creating-p2sh-output.svg) + +When Bob wants to spend the [output](../resources/glossary.md#output), he provides his [signature](../resources/glossary.md#signature) along with the full (serialized) redeem script in the [signature script](../resources/glossary.md#signature-script). The peer-to-peer [network](../resources/glossary.md#network) ensures the full redeem script hashes to the same value as the script hash Alice put in her output; it then processes the redeem script exactly as it would if it were the primary pubkey script, letting Bob spend the output if the redeem script does not return false. + +![Unlocking A P2SH Output For Spending](../../img/dev/en-unlocking-p2sh-output.svg) + +The hash of the redeem script has the same properties as a pubkey hash---so it can be transformed into the standard Dash address format with only one small change to differentiate it from a standard address. This makes collecting a P2SH-style address as simple as collecting a P2PKH-style address. The hash also obfuscates any public keys in the redeem script, so P2SH scripts are as secure as P2PKH pubkey hashes. diff --git a/docs/core/guide/transactions-signature-hash-types.md b/docs/core/guide/transactions-signature-hash-types.md new file mode 100644 index 000000000..805a576a4 --- /dev/null +++ b/docs/core/guide/transactions-signature-hash-types.md @@ -0,0 +1,27 @@ +```{eval-rst} +.. meta:: + :title: Signature Hash Types + :description: Signature Hash Types are the options in the Dash protocol that define which parts of a transaction are protected by a signature, allowing signers to decide what parts of the transaction can be modified by others. +``` + +# Signature Hash Types + +`OP_CHECKSIG` extracts a non-stack argument from each [signature](../resources/glossary.md#signature) it evaluates, allowing the signer to decide which parts of the [transaction](../resources/glossary.md#transaction) to sign. Since the signature protects those parts of the transaction from modification, this lets signers selectively choose to let other people modify their transactions. + +The various options for what to sign are called [signature hash](../resources/glossary.md#signature-hash) types. There are three base SIGHASH types currently available: + +* [SIGHASH_ALL](../resources/glossary.md#sighash_all), the default, signs all the [inputs](../resources/glossary.md#input) and [outputs](../resources/glossary.md#output), protecting everything except the signature scripts against modification. + +* [SIGHASH_NONE](../resources/glossary.md#sighash_none) signs all of the inputs but none of the outputs, allowing anyone to change where the [duffs](../resources/glossary.md#duffs) are going unless other signatures using other signature hash flags protect the outputs. + +* [SIGHASH_SINGLE](../resources/glossary.md#sighash_single) the only output signed is the one corresponding to this input (the output with the same output index number as this input), ensuring nobody can change your part of the transaction but allowing other signers to change their part of the transaction. The corresponding output must exist or the value "1" will be signed, breaking the security scheme. This input, as well as other inputs, are included in the signature. The sequence numbers of other inputs are not included in the signature, and can be updated. + +The base types can be modified with the [SIGHASH_ANYONECANPAY](../resources/glossary.md#sighash_anyonecanpay) (anyone can pay) flag, creating three new combined types: + +* `SIGHASH_ALL|SIGHASH_ANYONECANPAY` signs all of the outputs but only this one input, and it also allows anyone to add or remove other inputs, so anyone can contribute additional duffs but they cannot change how many duffs are sent nor where they go. + +* `SIGHASH_NONE|SIGHASH_ANYONECANPAY` signs only this one input and allows anyone to add or remove other inputs or outputs, so anyone who gets a copy of this input can spend it however they'd like. + +* `SIGHASH_SINGLE|SIGHASH_ANYONECANPAY` signs this one input and its corresponding output. Allows anyone to add or remove other inputs. + +Because each input is signed, a transaction with multiple inputs can have multiple signature hash types signing different parts of the transaction. For example, a single-input transaction signed with `NONE` could have its output changed by the miner who adds it to the block chain. On the other hand, if a two-input transaction has one input signed with `NONE` and one input signed with `ALL`, the `ALL` signer can choose where to spend the duffs without consulting the `NONE` signer---but nobody else can modify the transaction. diff --git a/docs/core/guide/transactions-standard-transactions.md b/docs/core/guide/transactions-standard-transactions.md new file mode 100644 index 000000000..63e56ac72 --- /dev/null +++ b/docs/core/guide/transactions-standard-transactions.md @@ -0,0 +1,104 @@ +```{eval-rst} +.. meta:: + :title: Standard Transactions + :description: Standard transactions in Dash are those that pass the IsStandard() test, meaning they adhere to certain safety and good network behavior rules. +``` + +# Standard Transactions + +After the discovery of several dangerous bugs in early versions of Bitcoin, a test was added which only accepted [transactions](../resources/glossary.md#transaction) from the [network](../resources/glossary.md#network) if their pubkey scripts and signature scripts matched a small set of believed-to-be-safe templates, and if the rest of the transaction didn't violate another small set of rules enforcing good network behavior. This is the `IsStandard()` test, and transactions which pass it are called standard transactions. + +Non-standard transactions---those that fail the test---may be accepted by [nodes](../resources/glossary.md#node) not using the default Dash Core settings. If they are included in blocks, they will also avoid the IsStandard test and be processed. + +Besides making it more difficult for someone to attack Dash for free by broadcasting harmful transactions, the standard transaction test also helps prevent users from creating transactions today that would make adding new transaction features in the future more difficult. For example, as described above, each transaction includes a version number---if users started arbitrarily changing the version number, it would become useless as a tool for introducing backwards-incompatible features. + +As of Dash Core 0.12.2, the standard pubkey script types are: + +## Pay To Public Key Hash (P2PKH) + +[P2PKH](../resources/glossary.md#pay-to-pubkey-hash) is the most common form of pubkey script used to send a transaction to one or multiple Dash [addresses](../resources/glossary.md#address). + +``` +Pubkey script: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +Signature script: +``` + +## Pay To Script Hash (P2SH) + +[P2SH](../resources/glossary.md#pay-to-script-hash) is used to send a transaction to a script hash. Each of the standard pubkey scripts can be used as a P2SH redeem script, but in practice only the multisig pubkey script makes sense until more transaction types are made standard. + +``` +Pubkey script: OP_HASH160 OP_EQUAL +Signature script: [sig] [sig...] +``` + +## Multisig + +Although P2SH multisig is now generally used for multisig transactions, this base script can be used to require multiple signatures before a UTXO can be spent. + +In multisig pubkey scripts, called m-of-n, *m* is the *minimum* number of signatures which must match a public key; *n* is the *number* of public keys being provided. Both *m* and *n* should be opcodes `OP_1` through `OP_16`, corresponding to the number desired. + +Because of an off-by-one error in the original Bitcoin implementation which must be preserved for compatibility, `OP_CHECKMULTISIG` consumes one more value from the stack than indicated by *m*, so the list of secp256k1 signatures in the signature script must be prefaced with an extra value (`OP_0`) which will be consumed but not used. + +The signature script must provide signatures in the same order as the corresponding public keys appear in the pubkey script or redeem script. See the description in [`OP_CHECKMULTISIG`](../reference/transactions-opcodes.md) for details. + +``` +Pubkey script: [B pubkey] [C pubkey...] OP_CHECKMULTISIG +Signature script: OP_0 [B sig] [C sig...] +``` + +Although it’s not a separate transaction type, this is a P2SH multisig with 2-of-3: + +``` +Pubkey script: OP_HASH160 OP_EQUAL +Redeem script: OP_CHECKMULTISIG +Signature script: OP_0 +``` + +## Pubkey + +Pubkey [outputs](../resources/glossary.md#output) are a simplified form of the P2PKH pubkey script, but they aren’t as secure as P2PKH, so they generally aren’t used in new transactions anymore. + +``` +Pubkey script: OP_CHECKSIG +Signature script: +``` + +## Null Data + +Null data transactions (relayed and mined by default in Bitcoin Core 0.9.0 and later) add arbitrary data to a provably unspendable pubkey script that full [nodes](../resources/glossary.md#node) don't have to store in their UTXO database. It is preferable to use null data transactions over transactions that bloat the UTXO database because they cannot be automatically pruned; however, it is usually even more preferable to store data outside transactions if possible. + +Consensus rules allow null data outputs up to the maximum allowed pubkey script size of 10,000 bytes provided they follow all other consensus rules, such as not having any data pushes larger than 520 bytes. + +Dash Core 0.11.x, by default, relayed and mined null data transactions with up to 40 bytes in a single data push and only one null data output that pays exactly 0 duffs: + +``` +Pubkey Script: OP_RETURN <0 to 40 bytes of data> +(Null data scripts cannot be spent, so there's no signature script.) +``` + +Dash Core 0.12.1+ defaults to relaying and mining null data outputs with up to 83 bytes with any number of data pushes, provided the total byte limit is not exceeded. There must still only be a single null data output and it must still pay exactly 0 duffs. + +:::{note} +Since the null data output must include opcodes, the limit for data is less than 83 bytes. A typical `OP_RETURN` is limited to 80 bytes due to the following 3 required bytes: + +* `OP_RETURN` (0x6a) +* `OP_PUSHDATA1` (0x4c) +* Data Size (e.g. 0x50 for 80 bytes) +::: + +The following annotated hexdump shows an example `OP_RETURN` output: + +``` bash +6a ......................................... OP_RETURN Opcode +4c ......................................... OP_PUSHDATA1 Opcode +50 ......................................... Bytes to push: 80 + +48656c6c6f2066726f6d207468657068657a203 +a2d29205468697320697320746865206d617869 +6d756d2074657874206c656e67746820616c6c6 +f77656420666f7220616e204f505f5245545552 +4e2e ....................................... Data +``` + +The `-datacarriersize` Dash Core configuration option allows you to set the maximum number of bytes in null data outputs that you will relay or mine. diff --git a/docs/core/guide/transactions-transaction-fees-and-change.md b/docs/core/guide/transactions-transaction-fees-and-change.md new file mode 100644 index 000000000..a60efe2a3 --- /dev/null +++ b/docs/core/guide/transactions-transaction-fees-and-change.md @@ -0,0 +1,17 @@ +```{eval-rst} +.. meta:: + :title: Transaction Fees and Change + :description: Transaction fees in Dash depend on transaction size and surplus from UTXOs is returned to the spender as a change output. +``` + +# Transaction Fees and Change + +Transactions pay fees based on the total byte size of the signed transaction. Fees per byte are calculated based on current demand for space in mined blocks with fees rising as demand increases. The [transaction fee](../resources/glossary.md#transaction-fee) is split between the miner (25%) and masternode (75%), as explained in the [block reward allocation section](https://docs.dash.org/en/stable/docs/user/introduction/features.html#block-reward-allocation). It is ultimately up to each [miner](../resources/glossary.md#miner) to choose the minimum transaction fee they will accept. + +All transactions are prioritized based on their fee per byte, with higher-paying transactions being added in sequence until all of the available space is filled. + +As of Dash Core 0.12.2.x, a [minimum relay fee](../resources/glossary.md#minimum-relay-fee) (1,000 [duffs](../resources/glossary.md#duffs) following [DIP1](https://github.com/dashpay/dips/blob/master/dip-0001.md) activation) is required to broadcast a transaction across the [network](../resources/glossary.md#network). Any transaction paying only the minimum fee should be prepared to wait a long time before there's enough spare space in a block to include it. + +Since each transaction spends Unspent Transaction Outputs (UTXOs) and because a UTXO can only be spent once, the full value of the included UTXOs must be spent or given to a miner as a [transaction fee](../resources/glossary.md#transaction-fee). Few people will have UTXOs that exactly match the amount they want to pay, so most transactions include a change output. + +A [change output](../resources/glossary.md#change-output) is a regular output which spends the surplus duffs from the UTXOs back to the spender. Change outputs can reuse the same P2PKH pubkey hash or P2SH script hash as was used in the UTXO, but for the reasons described in the [next subsection](../guide/transactions-avoiding-key-reuse.md), it is highly recommended that change outputs be sent to a new [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) or [P2SH](../resources/glossary.md#pay-to-script-hash) [address](../resources/glossary.md#address). diff --git a/docs/core/guide/transactions-transaction-malleability.md b/docs/core/guide/transactions-transaction-malleability.md new file mode 100644 index 000000000..d1c57c3db --- /dev/null +++ b/docs/core/guide/transactions-transaction-malleability.md @@ -0,0 +1,23 @@ +```{eval-rst} +.. meta:: + :title: Transaction Malleability + :description: Transaction malleability refers to the possibility of altering a transaction's hash ID without invalidating the transaction itself. +``` + +# Transaction Malleability + +None of Dash's signature hash types protect the [signature script](../resources/glossary.md#signature-script), leaving the door open for a limited denial of service attack called transaction [malleability](../resources/glossary.md#malleability). The signature script contains the secp256k1 [signature](../resources/glossary.md#signature), which can't sign itself, allowing attackers to make non-functional modifications to a transaction without rendering it invalid. For example, an attacker can add some data to the signature script which will be dropped before the previous [pubkey script](../resources/glossary.md#pubkey-script) is processed. + +Although the modifications are non-functional---so they do not change what [inputs](../resources/glossary.md#input) the transaction uses nor what [outputs](../resources/glossary.md#output) it pays---they do change the computed hash of the transaction. Since each transaction links to previous transactions using hashes as a transaction identifier ([TXID](../resources/glossary.md#transaction-identifiers)), a modified transaction will not have the txid its creator expected. + +This isn't a problem for most Dash transactions which are designed to be added to the [block chain](../resources/glossary.md#block-chain) immediately. But it does become a problem when the output from a transaction is spent before that transaction is added to the block chain. + +Dash Core 12.3 implemented [BIP-147: Dealing with dummy stack element malleability](https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki) which fixes a design flaw in OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY that caused them to consume an extra stack element ("dummy element") after signature validation. Previously, the dummy element was not inspected in any manner, and could be replaced by any value without invalidating the script. BIP147 removed this malleability vector by forcing the dummy element to be an empty byte array and rejecting anything else. + +Transaction malleability also affects payment tracking. Dash Core's RPC interface lets you track transactions by their txid---but if that txid changes because the transaction was modified, it may appear that the transaction has disappeared from the network. + +Current best practices for transaction tracking dictate that a transaction should be tracked by the transaction outputs (UTXOs) it spends as inputs, as they cannot be changed without invalidating the transaction. + +Best practices further dictate that if a transaction does seem to disappear from the network and needs to be reissued, that it be reissued in a way that invalidates the lost transaction. One method which will always work is to ensure the reissued payment spends all of the same outputs that the lost transaction used as inputs. + +For additional information regarding the types transaction malleability, reference [this blog post](https://blog.dash.org/segwit-lighting-rbf-in-dash-9536868ca861) by one of the Dash Core developers. diff --git a/docs/core/guide/transactions.md b/docs/core/guide/transactions.md new file mode 100644 index 000000000..ac75cdcc4 --- /dev/null +++ b/docs/core/guide/transactions.md @@ -0,0 +1,73 @@ +```{eval-rst} +.. meta:: + :title: Dash Transactions + :description: Transactions in Dash facilitate the transfer of duffs or DASH, allowing for either straightforward payments or more complex operations. +``` + +# Transactions + +Transactions let users spend [duffs](../resources/glossary.md#duffs). Each [transaction](../resources/glossary.md#transaction) is constructed out of several parts which enable both simple direct payments and complex transactions. This section will describe each part and demonstrate how to use them together to build complete transactions. + +To keep things simple, this section pretends coinbase transactions do not exist. Coinbase transactions can only be created by Dash miners and they're an exception to many of the rules listed below. Instead of pointing out the coinbase exception to each rule, we invite you to read about coinbase transactions in the [block chain](../resources/glossary.md#block-chain) [section](../guide/block-chain.md) of this guide. + +![The Parts Of A Transaction](../../img/dev/en-tx-overview.svg) + +The figure above shows the main parts of a Dash transaction. Each transaction has at least one [input](../resources/glossary.md#input) and one [output](../resources/glossary.md#output). Each [input](../resources/glossary.md#input) spends the duffs paid to a previous output. Each [output](../resources/glossary.md#output) then waits as an Unspent Transaction Output (UTXO) until a later input spends it. When your Dash wallet tells you that you have a 10,000 duff balance, it really means that you have 10,000 duffs waiting in one or more UTXOs. + +Each transaction is prefixed by a four-byte [transaction version number](../resources/glossary.md#transaction-version-number) which tells Dash [peers](../resources/glossary.md#peer) and miners which set of rules to use to validate it. This lets developers create new rules for future transactions without invalidating previous transactions. + +![Spending An Output](../../img/dev/en-tx-overview-spending.svg) + +An output has an implied [index](../resources/glossary.md#index) number based on its location in the transaction---the index of the first output is zero. The output also has an amount in duffs which it pays to a conditional [pubkey script](../resources/glossary.md#pubkey-script). Anyone who can satisfy the conditions of that pubkey script can spend up to the amount of duffs paid to it. + +An input uses a transaction identifier ([TXID](../resources/glossary.md#transaction-identifiers)) and an output index number (often called "vout" for output vector) to identify a particular output to be spent. It also has a signature script which allows it to provide data parameters that satisfy the conditionals in the pubkey script. (The sequence number and locktime are related and will be covered together in a later subsection.) + +The figures below help illustrate how these features are used by showing the workflow Alice uses to send Bob a transaction and which Bob later uses to spend that transaction. Both Alice and Bob will use the most common form of the standard Pay-To-Public-Key-Hash (P2PKH) transaction type. [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) lets Alice spend duffs to a typical Dash [address](../resources/glossary.md#address), and then lets Bob further spend those duffs using a simple cryptographic key pair. + +![Creating A P2PKH Public Key Hash To Receive Payment](../../img/dev/en-creating-p2pkh-output.svg) + +Bob must first generate a private/public [key pair](../resources/glossary.md#key-pair) before Alice can create the first transaction. Dash uses the Elliptic Curve Digital Signature Algorithm (ECDSA) with the secp256k1 curve; secp256k1 [private keys](../resources/glossary.md#private-key) are 256 bits of random data. A copy of that data is deterministically transformed into an secp256k1 [public key](../resources/glossary.md#public-key). Because the transformation can be reliably repeated later, the public key does not need to be stored. + +The [public key](../resources/glossary.md#public-key) (pubkey) is then cryptographically hashed. This pubkey hash can also be reliably repeated later, so it also does not need to be stored. The hash shortens and obfuscates the public key, making manual transcription easier and providing security against unanticipated problems which might allow reconstruction of [private keys](../resources/glossary.md#private-key) from public key data at some later point. + +Bob provides the pubkey hash to Alice. Pubkey hashes are almost always sent encoded as a Dash [address](../resources/glossary.md#address), which is a [base58](../resources/glossary.md#base58)-encoded string containing an address version number, the hash, and an error-detection checksum to catch typos. The address can be transmitted through any medium, including one-way mediums which prevent the spender from communicating with the receiver, and it can be further encoded into another format, such as a QR code containing a `dash:` URI. + +Once Alice has the address and decodes it back into a standard hash, she can create the first transaction. She creates a standard [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) transaction output containing instructions which allow anyone to spend that output if they can prove they control the private key corresponding to Bob's hashed public key. These instructions are called the [pubkey script](../resources/glossary.md#pubkey-script) +or scriptPubKey. + +Alice broadcasts the transaction and it is added to the block chain. The [network](../resources/glossary.md#network) categorizes it as an Unspent Transaction Output (UTXO), and Bob's wallet software displays it as a spendable balance. + +When, some time later, Bob decides to spend the UTXO, he must create an input which references the transaction Alice created by its hash, called a Transaction Identifier (txid), and the specific output she used by its index number ([output index](../resources/glossary.md#output-index)). He must then create a [signature script](../resources/glossary.md#signature-script)---a collection of data parameters which satisfy the conditions Alice placed in the previous output's pubkey script. [Signature scripts](../resources/glossary.md#signature-script) are also called scriptSigs. + +Pubkey scripts and signature scripts combine secp256k1 pubkeys and [signatures](../resources/glossary.md#signature) with conditional logic, creating a programmable authorization mechanism. + +![Unlocking A P2PKH Output For Spending](../../img/dev/en-unlocking-p2pkh-output.svg) + +For a P2PKH-style output, Bob's signature script will contain the following two pieces of data: + +1. His full (unhashed) public key, so the pubkey script can check that it hashes to the same value as the pubkey hash provided by Alice. + +2. An secp256k1 [signature](../resources/glossary.md#signature) made by using the ECDSA cryptographic formula to combine certain transaction data (described below) with Bob's private key. This lets the pubkey script verify that Bob owns the private key which created the public key. + +Bob's secp256k1 signature doesn't just prove Bob controls his private key; it also makes the non-signature-script parts of his transaction tamper-proof so Bob can safely broadcast them over the peer-to-peer network. + +![Some Things Signed When Spending An Output](../../img/dev/en-signing-output-to-spend.svg) + +As illustrated in the figure above, the data Bob signs includes the txid and output index of the previous transaction, the previous output's pubkey script, the pubkey script Bob creates which will let the next recipient spend this transaction's output, and the amount of duffs to spend to the next recipient. In essence, the entire transaction is signed except for any signature scripts, which hold the full public keys and secp256k1 signatures. + +After putting his signature and public key in the signature script, Bob broadcasts the transaction to Dash miners through the peer-to-peer network. Each peer and miner independently validates the transaction before broadcasting it further or attempting to include it in a new block of transactions. + +```{toctree} +:maxdepth: 3 +:titlesonly: + +transactions-p2pkh-script-validation +transactions-p2sh-scripts +transactions-standard-transactions +transactions-non-standard-transactions +transactions-signature-hash-types +transactions-locktime-and-sequence-number +transactions-transaction-fees-and-change +transactions-avoiding-key-reuse +transactions-transaction-malleability +``` diff --git a/docs/core/guide/wallets-wallet-files.md b/docs/core/guide/wallets-wallet-files.md new file mode 100644 index 000000000..de9749036 --- /dev/null +++ b/docs/core/guide/wallets-wallet-files.md @@ -0,0 +1,191 @@ +```{eval-rst} +.. meta:: + :title: Dash Wallet Files + :description: Dash wallets at their core are a collection of private keys. These collections are stored digitally in a file, or can even be physically stored on pieces of paper. +``` + +# Wallet Files + +Dash wallets at their core are a collection of [private keys](../resources/glossary.md#private-key). These collections are stored digitally in a file, or can even be physically stored on pieces of paper. + +## Private Key Formats + +Private keys are what are used to unlock [duffs](../resources/glossary.md#duffs) from a particular [address](../resources/glossary.md#address). In Dash, a private key in standard format is simply a 256-bit number, between the values: + +`0x01` and `0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140`, representing nearly the entire range of 2256-1 values. The range is governed by the secp256k1 ECDSA encryption standard used by Dash. + +### Wallet Import Format (WIF) + +In order to make copying of private keys less prone to error, [Wallet Import Format](../resources/glossary.md#wallet-import-format) may be utilized. WIF uses [base58check](../resources/glossary.md#base58check) encoding on a private key, greatly decreasing the chance of copying error, much like standard Dash [addresses](../resources/glossary.md#address). + +1. Take a private key. + +2. Add a `0xCC` byte in front of it for [mainnet](../resources/glossary.md#mainnet) addresses or `0xEF` for [testnet](../resources/glossary.md#testnet) addresses. + +3. Append a `0x01` byte after it if it should be used with compressed public keys (described in a later subsection). Nothing is appended if it is used with uncompressed public keys. + +4. Perform a SHA-256 hash on the [extended key](../resources/glossary.md#extended-key). + +5. Perform a SHA-256 hash on result of SHA-256 hash. + +6. Take the first four bytes of the second SHA-256 hash; this is the checksum. + +7. Add the four checksum bytes from point 5 at the end of the extended key from point 2. + +8. Convert the result from a byte string into a Base58 string using Base58Check encoding. + +The process is easily reversible, using the Base58 decoding function, and removing the padding. + +### Mini Private Key Format + +Mini private key format is a method for encoding a private key in under 30 characters, enabling keys to be embedded in a small physical space and more damage-resistant QR codes. + +1. The first character of mini keys is '`S`'. + +2. In order to determine if a mini private key is well-formatted, a question mark is added to the private key. + +3. The SHA256 hash is calculated. If the first byte produced is a `00`, it is well-formatted. This key restriction acts as a typo-checking mechanism. A user brute forces the process using random numbers until a well-formatted mini private key is produced. + +4. In order to derive the full private key, the user simply takes a single SHA256 hash of the original mini private key. This process is one-way: it is intractable to compute the mini private key format from the derived key. + +Many implementations disallow the character '1' in the mini private key due to its visual similarity to 'l'. + +**Resource:** A common tool to create and redeem these keys is the [Casascius Bitcoin Address Utility](https://github.com/casascius/Bitcoin-Address-Utility). Note: this tool is no longer actively developed. + +## Public Key Formats + +Dash ECDSA public keys represent a point on a particular Elliptic Curve (EC) defined in secp256k1. In their traditional uncompressed form, public keys contain an identification byte, a 32-byte X coordinate, and a 32-byte Y coordinate. The extremely simplified illustration below shows such a point on the elliptic curve used by Dash, y2 = x3 + 7, over a field of contiguous numbers. + +![Point On ECDSA Curve](../../img/dev/en-ecdsa-compressed-public-key.svg) + +(Secp256k1 actually modulos coordinates by a large prime, which produces a field of non-contiguous integers and a significantly less clear plot, although the principles are the same.) + +An almost 50% reduction in [public key](../resources/glossary.md#public-key) size can be realized without changing any fundamentals by dropping the Y coordinate. This is possible because only two points along the curve share any particular X coordinate, so the 32-byte Y coordinate can be replaced with a single bit indicating whether the point is on what appears in the illustration as the "top" side or the "bottom" side. + +No data is lost by creating a [compressed public key](../resources/glossary.md#compressed-public-key)---only a small amount of CPU is necessary to reconstruct the Y coordinate and access the uncompressed public key. Both uncompressed and compressed public keys are described in official secp256k1 documentation and supported by default in the widely-used OpenSSL library. + +Because they're easy to use, and because they reduce almost by half the [block chain](../resources/glossary.md#block-chain) space used to store public keys for every spent [output](../resources/glossary.md#output), compressed public keys are the default in Dash Core and are the recommended default for all Dash software. + +However, Bitcoin Core prior to 0.6 used uncompressed keys. This creates a few complications, as the hashed form of an uncompressed key is different than the hashed form of a compressed key, so the same key works with two different [P2PKH](../resources/glossary.md#pay-to-pubkey-hash) addresses. This also means that the key must be submitted in the correct format in the [signature script](../resources/glossary.md#signature-script) so it matches the hash in the previous output's pubkey script. + +For this reason, Bitcoin Core (and Dash Core) uses several different identifier bytes to help programs identify how keys should be used: + +* Private keys meant to be used with compressed public keys have 0x01 appended to them before being Base-58 encoded. (See the private key encoding section above.) + +* Uncompressed public keys start with 0x04; compressed public keys begin with 0x03 or 0x02 depending on whether they're greater or less than the midpoint of the curve. These prefix bytes are all used in official secp256k1 documentation. + +## Hierarchical Deterministic Key Creation + +The hierarchical deterministic key creation and transfer protocol ([HD protocol](../resources/glossary.md#bip32)) greatly simplifies wallet backups, eliminates the need for repeated communication between multiple programs using the same wallet, permits creation of child accounts which can operate independently, gives each parent account the ability to monitor or control its children even if the child account is compromised, and divides each account into full-access and restricted-access parts so untrusted users or programs can be allowed to receive or monitor payments without being able to spend them. + +The HD protocol takes advantage of the ECDSA public key creation function, [point()](../resources/glossary.md#point-function), which takes a large integer (the private key) and turns it into a graph point (the public key): + + point(private_key) == public_key + +Because of the way `point()` works, it's possible to create a [child public key](../resources/glossary.md#child-public-key) by combining an existing [parent public key](../resources/glossary.md#parent-public-key) with another public key created from any integer (*i*) value. This child public key is the same public key which would be created by the `point()` function if you added the *i* value to the original (parent) private key and then found the remainder of that sum divided by a global constant used by all Dash software (*p*): + + point( (parent_private_key + i) % p ) == parent_public_key + point(i) + +This means that two or more independent programs which agree on a sequence of integers can create a series of unique [child key](../resources/glossary.md#child-key) pairs from a single [parent key](../resources/glossary.md#parent-key) pair without any further communication. Moreover, the program which distributes new public keys for receiving payment can do so without any access to the private keys, allowing the public key distribution program to run on a possibly-insecure platform such as a public web server. + +Child public keys can also create their own child public keys (grandchild public keys) by repeating the child key derivation operations: + + point( (child_private_key + i) % p ) == child_public_key + point(i) + +Whether creating child public keys or further-descended public keys, a predictable sequence of integer values would be no better than using a single public key for all transactions, as anyone who knew one child public key could find all of the other child public keys created from the same parent public key. Instead, a random seed can be used to deterministically generate the sequence of integer values so that the relationship between the child public keys is invisible to anyone without that seed. + +The HD protocol uses a single [root seed](../resources/glossary.md#root-seed) to create a hierarchy of child, grandchild, and other descended keys with unlinkable deterministically-generated integer values. Each child key also gets a deterministically-generated seed from its parent, called a [chain code](../resources/glossary.md#chain-code), so the compromising of one chain code doesn't necessarily compromise the integer sequence for the whole hierarchy, allowing the [master chain code](../resources/glossary.md#master-chain-code-and-private-key) to continue being useful even if, for example, a web-based public key distribution program gets hacked. + +![Overview Of Hierarchical Deterministic Key Derivation](../../img/dev/en-hd-overview.svg) + +As illustrated above, HD key derivation takes four inputs: + +* The *[parent private key](../resources/glossary.md#parent-private-key)* and *[parent public key](../resources/glossary.md#parent-public-key)* are regular uncompressed 256-bit ECDSA keys. + +* The [parent chain code](../resources/glossary.md#parent-chain-code) is 256 bits of seemingly-random data. + +* The [index](../resources/glossary.md#index) number is a 32-bit integer specified by the program. + +In the normal form shown in the above illustration, the [parent chain code](../resources/glossary.md#parent-chain-code), the parent public key, and the index number are fed into a one-way cryptographic hash ([HMAC-SHA512](https://en.wikipedia.org/wiki/HMAC)) to produce 512 bits of deterministically-generated-but-seemingly-random data. The seemingly-random 256 bits on the right-hand side of the hash output are used as a new child chain code. The seemingly-random 256 bits on the left-hand side of the hash output are used as the integer value to be combined with either the parent private key or parent public key to, respectively, create either a child private key or child public key: + +``` +child_private_key == (parent_private_key + lefthand_hash_output) % G +child_public_key == point( (parent_private_key + lefthand_hash_output) % G ) +child_public_key == point(child_private_key) == parent_public_key + point(lefthand_hash_output) +``` + +Specifying different index numbers will create different unlinkable child keys from the same parent keys. Repeating the procedure for the child keys using the child chain code will create unlinkable grandchild keys. + +Because creating child keys requires both a key and a chain code, the key and chain code together are called the [extended key](../resources/glossary.md#extended-key). An [extended private key](../resources/glossary.md#extended-private-key) and its corresponding [extended public key](../resources/glossary.md#extended-public-key) have the same chain code. The (top-level parent) [master private key](../resources/glossary.md#master-private-key) and master chain code are derived from random data, as illustrated below. + +![Creating A Root Extended Key Pair](../../img/dev/en-hd-root-keys.svg) + +A [root seed](../resources/glossary.md#root-seed) is created from either 128 bits, 256 bits, or 512 bits of random data. This root seed of as little as 128 bits is the the only data the user needs to backup in order to derive every key created by a particular wallet program using particular settings. + +:::{warning} +HD wallet programs are not always fully compatible, so users should only use the same HD wallet program with the same HD-related settings for a particular root seed. +::: + +The root seed is hashed to create 512 bits of seemingly-random data, from which the master private key and master chain code are created (together, the master extended private key). The master public key is derived from the master private key using `point()`, which, together with the master chain code, is the master extended public key. The master extended keys are functionally equivalent to other extended keys; it is only their location at the top of the hierarchy which makes them special. + +### Hardened Keys + +Hardened extended keys fix a potential problem with normal extended keys. If an attacker gets a normal parent chain code and parent public key, he can brute-force all chain codes deriving from it. If the attacker also obtains a child, grandchild, or further-descended private key, he can use the chain code to generate all of the extended private keys descending from that private key, as shown in the grandchild and great-grandchild generations of the illustration below. + +![Cross-Generational Key Compromise](../../img/dev/en-hd-cross-generational-key-compromise.svg) + +Perhaps worse, the attacker can reverse the normal [child private key](../resources/glossary.md#child-private-key) derivation formula and subtract a [parent chain code](../resources/glossary.md#parent-chain-code) from a child private key to recover the [parent private key](../resources/glossary.md#parent-private-key), as shown in the child and parent generations of the illustration above. This means an attacker who acquires an [extended public key](../resources/glossary.md#extended-public-key) and any private key descended from it can recover that public key's private key and all keys descended from it. + +For this reason, the [chain code](../resources/glossary.md#chain-code) part of an extended public key should be better secured than standard public keys and users should be advised against exporting even non-extended private keys to possibly-untrustworthy environments. + +This can be fixed, with some tradeoffs, by replacing the the normal key derivation formula with a hardened key derivation formula. + +The normal key derivation formula, described in the section above, combines together the index number, the parent chain code, and the parent public key to create the child chain code and the integer value which is combined with the parent private key to create the child private key. + +![Creating Child Public Keys From An Extended Private Key](../../img/dev/en-hd-private-parent-to-private-child.svg) + +The hardened formula, illustrated above, combines together the index number, the parent chain code, and the parent private key to create the data used to generate the child chain code and child private key. This formula makes it impossible to create child public keys without knowing the parent private key. In other words, parent extended public keys can't create hardened child public keys. + +Because of that, a [hardened extended private key](../resources/glossary.md#hardened-extended-private-key) is much less useful than a normal extended private key---however, hardened extended private keys create a firewall through which multi-level key derivation compromises cannot happen. Because hardened child extended public keys cannot generate grandchild chain codes on their own, the compromise of a parent extended public key cannot be combined with the compromise of a grandchild private key to create great-grandchild extended private keys. + +The HD protocol uses different index numbers to indicate whether a normal or hardened key should be generated. Index numbers from `0x00` to `0x7fffffff` (0 to 231-1) will generate a normal key; index numbers from `0x80000000` to `0xffffffff` will generate a hardened key. To make descriptions easy, many developers use the [prime symbol](https://en.wikipedia.org/wiki/Prime_%28symbol%29) to indicate hardened keys, so the first normal key (0x00) is 0 and the first hardened key (0x80000000) is 0´. + +:::{note} +Dash developers typically use the ASCII apostrophe rather than the unicode prime symbol, a convention we will henceforth follow. +::: + +This compact description is further combined with slashes prefixed by *m* or *M* to indicate hierarchy and key type, with *m* being a private key and *M* being a public key. For example, m/0'/0/122' refers to the 123rd hardened private child (by index number) of the first normal child (by index) of the first hardened child (by index) of the master private key. The following hierarchy illustrates prime notation and hardened key firewalls. + +![Example HD Wallet Tree Using Prime Notation](../../img/dev/en-hd-tree.svg) + +Wallets following the [BIP32](../resources/glossary.md#bip32) [HD protocol](../resources/glossary.md#bip32) only create hardened children of the master private key (*m*) to prevent a compromised child key from compromising the master key. As there are no normal children for the master keys, the master public key is not used in HD wallets. All other keys can have normal children, so the corresponding extended public keys may be used instead. + +The HD protocol also describes a serialization format for extended public keys and extended private keys. For details, please see the [wallet section in the developer reference](../reference/wallets.md) or [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) for the full HD protocol specification. + +### Storing Root Seeds + +Root seeds in the HD protocol are 128, 256, or 512 bits of random data which must be backed up precisely. To make it more convenient to use non-digital backup methods, such as memorization or hand-copying, [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) defines a method for creating a 512-bit root seed from a pseudo-sentence (mnemonic) of common natural-language words which was itself created from 128 to 256 bits of entropy and optionally protected by a password. + +The number of words generated correlates to the amount of entropy used: + +| Entropy Bits | Words | +| --- | --- | +| 128 | 12 | +| 160 | 15 | +| 192 | 18 | +| 224 | 21 | +| 256 | 24 | + +The passphrase can be of any length. It is simply appended to the mnemonic pseudo-sentence, and then both the mnemonic and password are hashed 2,048 times using HMAC-SHA512, resulting in a seemingly-random 512-bit seed. Because any input to the hash function creates a seemingly-random 512-bit seed, there is no fundamental way to prove the user entered the correct password, possibly allowing the user to protect a seed even when under duress. + +For implementation details, please see [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki). + +## Loose-Key Wallets + +Loose-Key wallets, also called "Just a Bunch Of Keys (JBOK)", are a form of wallet that originated from the Bitcoin Core client wallet. The Dash Core client wallet creates 1000 private key/public key pairs automatically via a Pseudo-Random-Number Generator (PRNG) for later use. + +These unused private keys are stored in a virtual "key pool", with new keys being generated whenever a previously-generated key was used, ensuring the pool maintained 1000 unused keys. (If the wallet is encrypted, new keys are only generated while the wallet is unlocked.) + +This creates considerable difficulty in backing up one’s keys, considering backups have to be run manually to save the newly-generated private keys. If a new key pair set is generated, used, and then lost prior to a backup, the stored duffs are likely lost forever. Many older-style mobile wallets followed a similar format, but only generated a new private key upon user demand. + +This wallet type is being actively phased out and discouraged from being used due to the backup hassle. diff --git a/docs/core/guide/wallets-wallet-programs.md b/docs/core/guide/wallets-wallet-programs.md new file mode 100644 index 000000000..24bbf789f --- /dev/null +++ b/docs/core/guide/wallets-wallet-programs.md @@ -0,0 +1,97 @@ +```{eval-rst} +.. meta:: + :title: Dash Wallet Programs + :description: Dash wallet programs consist of three essential components: public key distribution, transaction signing, and network interaction. +``` + +# Wallet Programs + +Permitting receiving and spending of [duffs](../resources/glossary.md#duffs) is the only essential feature of [wallet](../resources/glossary.md#wallet) software---but a particular wallet program doesn't need to do both things. Two wallet programs can work together, one program distributing [public keys](../resources/glossary.md#public-key) in order to receive duffs and another program signing [transactions](../resources/glossary.md#transaction) spending those duffs. + +Wallet programs also need to interact with the peer-to-peer [network](../resources/glossary.md#network) to get information from the [block chain](../resources/glossary.md#block-chain) and to broadcast new transactions. However, the programs which distribute public keys or sign transactions don't need to interact with the peer-to-peer network themselves. + +This leaves us with three necessary, but separable, parts of a wallet system: a public key distribution program, a signing program, and a networked program. In the subsections below, we will describe common combinations of these parts. + +:::{note} +We speak about distributing public keys generically. In many cases, P2PKH or P2SH hashes will be distributed instead of public keys, with the actual public keys only being distributed when the outputs they control are spent. +::: + +## Full-Service Wallets + +The simplest wallet is a program which performs all three functions: it generates [private keys](../resources/glossary.md#private-key), derives the corresponding [public keys](../resources/glossary.md#public-key), helps distribute those public keys as necessary, monitors for outputs spent to those public keys, creates and signs transactions spending those outputs, and broadcasts the signed transactions. + +![Full-Service Wallets](../../img/dev/en-wallets-full-service.svg) + +As of this writing, almost all popular wallets can be used as full-service wallets. + +The main advantage of full-service wallets is that they are easy to use. A single program does everything the user needs to receive and spend duffs. + +The main disadvantage of full-service wallets is that they store the private keys on a device connected to the Internet. The compromise of such devices is a common occurrence, and an Internet connection makes it easy to transmit private keys from a compromised device to an attacker. + +To help protect against theft, many wallet programs offer users the option of encrypting the wallet files which contain the private keys. This protects the private keys when they aren't being used, but it cannot protect against an attack designed to capture the encryption key or to read the decrypted keys from memory. + +## Signing-Only Wallets + +To increase security, private keys can be generated and stored by a separate wallet program operating in a more secure environment. These signing-only wallets work in conjunction with a networked wallet which interacts with the peer-to-peer network. + +Signing-only wallets programs typically use deterministic key creation (described in a [later subsection](../guide/wallets-wallet-files.md#hierarchical-deterministic-key-creation)) to create parent private and public keys which can create child private and public keys. + +![Signing-Only Wallets](../../img/dev/en-wallets-signing-only.svg) + +When first run, the signing-only wallet creates a [parent private key](../resources/glossary.md#parent-private-key) and transfers the corresponding [parent public key](../resources/glossary.md#parent-public-key) to the networked wallet. + +The networked wallet uses the parent public key to derive each [child public key](../resources/glossary.md#child-public-key), optionally helps distribute them, monitors for outputs spent to those public keys, creates unsigned transactions spending those outputs, and transfers the unsigned transactions to the signing-only wallet. + +Often, users are given a chance to review the unsigned transactions' details (particularly the output details) using the signing-only wallet. + +After the optional review step, the signing-only wallet uses the parent private key to derive each appropriate [child private key](../resources/glossary.md#child-private-key) and signs the transactions, giving the signed transactions back to the networked wallet. + +The networked wallet then broadcasts the signed transactions to the peer-to-peer [network](../resources/glossary.md#network). + +The following subsections describe the two most common variants of signing-only wallets: offline wallets and hardware wallets. + +### Offline Wallets + +Several full-service wallets programs will also operate as two separate wallets: one program instance acting as a signing-only wallet (often called an "offline wallet") and the other program instance acting as the networked wallet (often called an "online wallet" or "watching-only wallet"). + +The offline wallet is so named because it is intended to be run on a device which does not connect to any network, greatly reducing the number of attack vectors. If this is the case, it is usually up to the user to handle all data transfer using removable media such as USB drives. The user's workflow is something like: + +1. (Offline) Disable all network connections on a device and install the wallet software. Start the wallet software in offline mode to create the parent private and public keys. Copy the parent public key to removable media. + +2. (Online) Install the wallet software on another device, this one connected to the Internet, and import the parent public key from the removable media. As you would with a full-service wallet, distribute public keys to receive payment. When ready to spend duffs, fill in the output details and save the unsigned transaction generated by the wallet to removable media. + +3. (Offline) Open the unsigned transaction in the offline instance, review the output details to make sure they spend the correct amount to the correct address. This prevents malware on the online wallet from tricking the user into signing a transaction which pays an attacker. After review, sign the transaction and save it to removable media. + +4. (Online) Open the signed transaction in the online instance so it can broadcast it to the peer-to-peer network. + +The primary advantage of offline wallets is their possibility for greatly improved security over full-service wallets. As long as the offline wallet is not compromised (or flawed) and the user reviews all outgoing transactions before signing, the user's duffs are safe even if the online wallet is compromised. + +The primary disadvantage of offline wallets is hassle. For maximum security, they require the user dedicate a device to only offline tasks. The offline device must be booted up whenever funds are to be spent, and the user must physically copy data from the online device to the offline device and back. + +### Hardware Wallets + +Hardware wallets are devices dedicated to running a signing-only wallet. Their dedication lets them eliminate many of the vulnerabilities present in operating systems designed for general use, allowing them to safely communicate directly with other devices so users don't need to transfer data manually. The user's workflow is something like: + +1. (Hardware) Create parent private and public keys. Connect hardware wallet to a networked device so it can get the parent public key. + +2. (Networked) As you would with a full-service wallet, distribute public keys to receive payment. When ready to spend duffs, fill in the transaction details, connect the hardware wallet, and click Spend. The networked wallet will automatically send the transaction details to the hardware wallet. + +3. (Hardware) Review the transaction details on the hardware wallet's screen. Some hardware wallets may prompt for a passphrase or PIN number. The hardware wallet signs the transaction and uploads it to the networked wallet. + +4. (Networked) The networked wallet receives the signed transaction from the hardware wallet and broadcasts it to the network. + +The primary advantage of hardware wallets is their possibility for greatly improved security over full-service wallets with much less hassle than offline wallets. + +The primary disadvantage of hardware wallets is their hassle. Even though the hassle is less than that of offline wallets, the user must still purchase a hardware wallet device and carry it with them whenever they need to make a transaction using the signing-only wallet. An additional disadvantage is that not all wallet programs support hardware wallets. + +## Distributing-Only Wallets + +Wallet programs which run in difficult-to-secure environments, such as webservers, can be designed to distribute public keys (including P2PKH or P2SH addresses) and nothing more. There are two common ways to design these minimalist wallets: + +![Distributing-Only Wallets](../../img/dev/en-wallets-distributing-only.svg) + +* Pre-populate a database with a number of public keys or addresses, and then distribute on request a pubkey script or address using one of the database entries. To [avoid key reuse](../guide/transactions-avoiding-key-reuse.md), webservers should keep track of used keys and never run out of public keys. This can be made easier by using parent public keys as suggested in the next method. + +* Use a parent public key to create child public keys. To avoid key reuse, a method must be used to ensure the same public key isn't distributed twice. This can be a database entry for each key distributed or an incrementing pointer to the key index number. + +Neither method adds a significant amount of overhead, especially if a database is used anyway to associate each incoming payment with a separate public key for payment tracking. diff --git a/docs/core/guide/wallets.md b/docs/core/guide/wallets.md new file mode 100644 index 000000000..995377eda --- /dev/null +++ b/docs/core/guide/wallets.md @@ -0,0 +1,18 @@ +```{eval-rst} +.. meta:: + :title: Dash Wallets + :description: Dash wallet refers to either a wallet program or a wallet file used for creating and managing public and private keys for Dash transactions. +``` + +# Wallets + +A Dash [wallet](../resources/glossary.md#wallet) can refer to either a wallet program or a wallet file. Wallet programs create [public keys](../resources/glossary.md#public-key) to receive [duffs](../resources/glossary.md#duffs) and use the corresponding [private keys](../resources/glossary.md#private-key) to spend those duffs. Wallet files store private keys and (optionally) other information related to [transactions](../resources/glossary.md#transaction) for the wallet program. + +Wallet programs and wallet files are addressed below in separate subsections, and this document attempts to always make it clear whether we're talking about wallet programs or wallet files. + +```{toctree} +:maxdepth: 3 + +wallets-wallet-programs +wallets-wallet-files +``` diff --git a/docs/core/index.md b/docs/core/index.md new file mode 100644 index 000000000..e1db133b3 --- /dev/null +++ b/docs/core/index.md @@ -0,0 +1,171 @@ +```{eval-rst} +.. _core-index: +``` + +# Core docs + +Welcome to the Dash Core developer documentation. You'll find sections for +[reference information](reference/introduction.md), [API +details](api/remote-procedure-calls.md), [guides](guide/introduction.md), +[examples](examples/introduction.md) and [Dash Core wallet +information](dashcore/wallet-arguments-and-commands.md) to help you start +working with Dash as quickly as possible. Let's jump right in! + +```{eval-rst} +.. grid:: 1 2 3 3 + + .. grid-item-card:: 🛠 Core Reference + :margin: 2 2 auto auto + :link-type: ref + :link: reference-index + + Blockchain and protocol details + + +++ + :ref:`Click to begin ` + + .. grid-item-card:: ⚡ API Reference + :margin: 2 2 auto auto + :link-type: ref + :link: api-rpc + + RPC, REST, and ZMQ information + + +++ + :ref:`Click to begin ` + + .. grid-item-card:: 📑 Core Guides + :margin: 2 2 auto auto + :link-type: ref + :link: guide-index + + Dash features and operation + + +++ + :ref:`Click to begin ` + + .. grid-item-card:: 🚀 Core Examples + :margin: 2 2 auto auto + :link-type: ref + :link: examples-index + + Examples for common use-cases + + +++ + :ref:`Click to begin ` + + .. grid-item-card:: ⚙ Dash Core + :margin: 2 2 auto auto + :link-type: ref + :link: dashcore-arguments-and-commands + + Dash Core configuration and usage + + +++ + :ref:`Click to begin ` + + .. grid-item-card:: 📖 Glossary + :margin: 2 2 auto auto + :link-type: ref + :link: resources-glossary + + Important terms with definitions + + +++ + :ref:`Click to begin ` +``` + +```{toctree} +:maxdepth: 2 +:caption: Core Reference +:hidden: + +reference/introduction +reference/block-chain +reference/transactions +reference/wallets +reference/p2p-network +reference/improvement-proposals +``` + +```{toctree} +:maxdepth: 2 +:titlesonly: +:caption: Core API Reference +:hidden: + +api/dash-core-apis-hash-byte-order +api/remote-procedure-calls +api/http-rest +api/zmq +``` + +```{toctree} +:maxdepth: 2 +:caption: Core Guides +:titlesonly: +:hidden: + +guide/introduction +guide/dash-features +guide/block-chain +guide/transactions +guide/contracts +guide/wallets +guide/operating-modes +guide/p2p-network +guide/mining +``` + +```{toctree} +:maxdepth: 2 +:caption: Core Examples +:hidden: + +examples/introduction +examples/configuration-file +examples/testing-applications +examples/transaction-tutorial +examples/p2p-network +examples/receiving-zmq-notifications +``` + +```{toctree} +:maxdepth: 2 +:titlesonly: +:caption: Dash Core Wallet +:hidden: + +dashcore/wallet-arguments-and-commands +dashcore/wallet-configuration-file +``` + +```{toctree} +:maxdepth: 2 +:titlesonly: +:caption: Additional Resources +:hidden: + +resources/glossary +Mainnet Block Explorer +Testnet Block Explorer +Testnet Faucet +API Services +SDK Resources +Dash Improvement Proposals +Dash Whitepaper +Bitcoin Whitepaper +Previous Version of Docs +``` + +Questions about Dash development are best asked in one of the [Dash development +communities](https://www.dash.org/community/). Errors or suggestions related to +documentation can be submitted as via the "Edit this page" button on the top, +right of each page. + +```{eval-rst} +.. image:: https://raw.githubusercontent.com/dashpay/docs/master/img/businessplan.svg + :class: no-scaled-link + :align: center + :width: 90% +``` diff --git a/docs/core/reference/block-chain-block-headers.md b/docs/core/reference/block-chain-block-headers.md new file mode 100644 index 000000000..e99d640d3 --- /dev/null +++ b/docs/core/reference/block-chain-block-headers.md @@ -0,0 +1,99 @@ +```{eval-rst} +.. meta:: + :title: Dash Block Headers + :description: Describes the structure of Dash block headers and provides related details on block versions, merkle trees, and mining difficulty. +``` + +# Block Headers + +[Block headers](../resources/glossary.md#block-header) are serialized in the 80-byte format described below and then hashed as part of the proof-of-work algorithm, making the serialized header format part of the [consensus rules](../resources/glossary.md#consensus-rules). + +| Bytes | Name | Data Type | Description +|-------|---------------------|-----------|---------------- +| 4 | version | int32_t | The [block](../resources/glossary.md#block) version number indicates which set of block validation rules to follow. See the list of block versions below. +| 32 | previous block header hash | char[32] | An X11() hash in internal byte order of the previous block's header. This ensures no previous block can be changed without also changing this block's header. +| 32 | merkle root hash | char[32] | A SHA256(SHA256()) hash in internal byte order. The merkle root is derived from the hashes of all transactions included in this block, ensuring that none of those transactions can be modified without modifying the header. See the [merkle trees section](#merkle-trees) below. +| 4 | time | uint32_t | The block time is a Unix epoch time when the miner started hashing the header (according to the miner). Must be strictly greater than the median time of the previous 11 blocks. Full nodes will not accept blocks with headers more than two hours in the future according to their clock. +| 4 | nBits | uint32_t | An encoded version of the target threshold this block's header hash must be less than or equal to. See the nBits format described below. +| 4 | nonce | uint32_t | An arbitrary number miners change to modify the header hash in order to produce a hash less than or equal to the target threshold. If all 32-bit values are tested, the time can be updated or the coinbase transaction can be changed and the merkle root updated. + +The hashes are in [internal byte order](../resources/glossary.md#internal-byte-order); the other values are all in little-endian order. + +An example [header](../resources/glossary.md#header) in hex: + +``` text +02000000 ........................... Block version: 2 + +b6ff0b1b1680a2862a30ca44d346d9e8 +910d334beb48ca0c0000000000000000 ... Hash of previous block's header +9d10aa52ee949386ca9385695f04ede2 +70dda20810decd12bc9b048aaab31471 ... Merkle root + +24d95a54 ........................... Unix time: 1415239972 +30c31b18 ........................... Target: 0x1bc330 * 256**(0x18-3) +fe9f0864 ........................... Nonce +``` + +## Block Versions + +* **Version 1** was used by Dash for the [genesis block](../resources/glossary.md#genesis-block) only. + +* **Version 2** was introduced with the first block following the [genesis block](../resources/glossary.md#genesis-block) (January 2014). As described in [BIP34](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki), valid version 2 blocks require a [block height](../resources/glossary.md#block-height) parameter in the coinbase. + +* **Version 3** blocks were introduced in Dash Core 0.11.2 (March 2015) as a + soft fork (Block 244,834 was the first version 3 block). + + When the [fork](../resources/glossary.md#fork) reached full enforcement, it required strict [DER encoding](https://en.wikipedia.org/wiki/X.690#DER_encoding) of all [ECDSA signatures](../resources/glossary.md#ecdsa-signatures) in new blocks as described in [BIP66](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki). Transactions that do not use strict DER encoding had previously been non-standard since Dash Core 0.8.0. + +* **Version 4** blocks specified in [BIP65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki) and introduced in Bitcoin Core 0.11.2 (November 2015) as a [soft fork](../resources/glossary.md#soft-fork) became active in December 2015. These blocks now support the new `OP_CHECKLOCKTIMEVERIFY` [opcode](../resources/glossary.md#opcode) described in that BIP. + +The mechanism used for the version 2, 3, and 4 upgrades is commonly called IsSuperMajority() after the function added to Dash Core to manage those soft forking changes. See [BIP34](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki) for a full description of this method. + +As of this writing, a newer method called *version bits* is being designed to manage future soft forking changes, although it's not known whether version 4 will be the last soft fork to use the IsSuperMajority() function. Draft [BIP9](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki) describes the version bits design as of this writing, although it is still being actively edited and may substantially change while in the draft state. + +## Merkle Trees + +The [merkle root](../resources/glossary.md#merkle-root) is constructed using all the [TXIDs](../resources/glossary.md#transaction-identifiers) of transactions in this block, but first the TXIDs are placed in order as required by the [consensus rules](../resources/glossary.md#consensus-rules): + +* The [coinbase transaction](../resources/glossary.md#coinbase-transaction)'s [TXID](../resources/glossary.md#transaction-identifiers) is always placed first. + +* Any [input](../resources/glossary.md#input) within this block can spend an [output](../resources/glossary.md#output) which also appears in this block (assuming the spend is otherwise valid). However, the TXID corresponding to the output must be placed at some point before the TXID corresponding to the input. This ensures that any program parsing block chain transactions linearly will encounter each output before it is used as an input. + +If a [block](../resources/glossary.md#block) only has a coinbase transaction, the coinbase TXID is used as the merkle root hash. + +If a block only has a coinbase transaction and one other transaction, the TXIDs of those two transactions are placed in order, concatenated as 64 raw bytes, and then SHA256(SHA256()) hashed together to form the merkle root. + +If a block has three or more transactions, intermediate [merkle tree](../resources/glossary.md#merkle-tree) rows are formed. The TXIDs are placed in order and paired, starting with the coinbase transaction's TXID. Each pair is concatenated together as 64 raw bytes and SHA256(SHA256()) hashed to form a second row of hashes. If there are an odd (non-even) number of TXIDs, the last TXID is concatenated with a copy of itself and hashed. If there are more than two hashes in the second row, the process is repeated to create a third row (and, if necessary, repeated further to create additional rows). Once a row is obtained with only two hashes, those hashes are concatenated and hashed to produce the merkle root. + +![Example Merkle Tree Construction](../../img/dev/en-merkle-tree-construction.png) + +TXIDs and intermediate hashes are always in [internal byte order](../resources/glossary.md#internal-byte-order) when they're concatenated, and the resulting merkle root is also in internal byte order when it's placed in the [block header](../resources/glossary.md#block-header). + +## Target nBits + +The [target threshold](../resources/glossary.md#target) is a 256-bit unsigned integer which a [header](../resources/glossary.md#header) hash must be equal to or below in order for that header to be a valid part of the [block chain](../resources/glossary.md#block-chain). However, the header field *[nBits](../resources/glossary.md#nbits)* provides only 32 bits of space, so the [target](../resources/glossary.md#target) number uses a less precise format called "compact" which works like a base-256 version of scientific notation: + +![Converting nBits Into A Target Threshold](../../img/dev/en-nbits-overview.png) + +As a base-256 number, nBits can be quickly parsed as bytes the same way you might parse a decimal number in base-10 scientific notation: + +![Quickly Converting nBits](../../img/dev/en-nbits-quick-parse.png) + +Although the target threshold should be an unsigned integer, the original nBits implementation inherits properties from a signed data class, allowing the target threshold to be negative if the high bit of the significand is set. This is useless---the header hash is treated as an unsigned number, so it can never be equal to or lower than a negative target threshold. Dash Core deals with this in two ways: + +* When parsing nBits, Dash Core converts a negative target threshold into a target of zero, which the header hash can equal (in theory, at least). + +* When creating a value for nBits, Dash Core checks to see if it will produce an nBits which will be interpreted as negative; if so, it divides the significand by 256 and increases the exponent by 1 to produce the same number with a different encoding. + +Some examples taken from the Dash Core test cases: + +| nBits | Target | Notes +|------------|------------------|---------------- +| 0x01003456 |  0x00 | +| 0x01123456 |  0x12 | +| 0x02008000 |  0x80 | +| 0x05009234 |  0x92340000 | +| 0x04923456 | -0x12345600 | High bit set (0x80 in 0x92). +| 0x04123456 |  0x12345600 | Inverse of above; no high bit. + +Difficulty 1, the minimum allowed [difficulty](../resources/glossary.md#difficulty), is represented on [mainnet](../resources/glossary.md#mainnet) and the current [testnet](../resources/glossary.md#testnet) by the nBits value 0x1e0ffff0. Regtest mode uses a different difficulty 1 value---0x207fffff, the highest possible value below uint32_max which can be encoded; this allows near-instant building of blocks in [regression test mode](../resources/glossary.md#regression-test-mode). diff --git a/docs/core/reference/block-chain-serialized-blocks.md b/docs/core/reference/block-chain-serialized-blocks.md new file mode 100644 index 000000000..3e3c1be54 --- /dev/null +++ b/docs/core/reference/block-chain-serialized-blocks.md @@ -0,0 +1,120 @@ +```{eval-rst} +.. meta:: + :title: Serialized Blocks + :description: Describes the structure of serialized Dash blocks and how the block reward is divided among miners, masternodes, and the governance system. +``` + +# Serialized Blocks + +Under current [consensus rules](../resources/glossary.md#consensus-rules), a +[block](../resources/glossary.md#block) is not valid unless its serialized size is less than or +equal to 2 MB. All fields described below are counted towards the serialized size. + +| Bytes | Name | Data Type | Description | +| - | - | - | - | +| 80 | block header | block_header | The [block header](../resources/glossary.md#block-header) in the format described in the [block header section](../reference/block-chain-block-headers.md). +| *Varies* | txn_count | [compactSize uint](../resources/glossary.md#compactsize) | The total number of transactions in this block, including the coinbase transaction. +| *Varies* | txns | [raw transaction](../resources/glossary.md#raw-transaction) | Every transaction in this block, one after another, in raw transaction format. Transactions must appear in the data stream in the same order their TXIDs appeared in the first row of the merkle tree. See the [merkle tree section](../reference/block-chain-block-headers.md#merkle-trees) for details. + +## Coinbase + +The first transaction in a block must be a [coinbase +transaction](../resources/glossary.md#coinbase-transaction) which should collect and spend any +[transaction fee](../resources/glossary.md#transaction-fee) paid by transactions included in this +block. + +### Block Subsidy + +Until the coin limit (~18 million Dash) is hit, all blocks are entitled to receive a block subsidy +of newly created Dash value. The newly created value should be spent in the coinbase transaction. + +The block subsidy declines by ~7.1% per year until all Dash is mined. Subsidy calculations are +performed by the Dash Core +[GetBlockSubsidy()](https://github.com/dashpay/dash/blob/v19.x/src/validation.cpp#L1010) function. + +#### Treasury expansion + +In September of 2023, the Dash network approved a +[proposal](https://www.dashcentral.org/p/TREASURY-REALLOCATION-60-20-20) to double the governance +budget by modifying the block subsidy allocation. The new allocation designates 20% for miners, 20% +for the governance system budget, and 60% for masternodes. The expansion went into effect when +the Dash Core v20 hard fork activated in December 2023. + +| Subsidy allocation | Purpose | +|-|-| +| 20% | Mining reward | +| 20% | Governance budget | +| 60% | Masternode reward | + +### Block Reward + +Together, the transaction fees and block subsidy are called the [block +reward](../resources/glossary.md#block-reward). A coinbase transaction is invalid if it tries to +spend more value than is available from the block reward. + +The block reward is divided into three main parts: [miner](../resources/glossary.md#miner), +[masternode](../resources/glossary.md#masternode), and +[superblock](../resources/glossary.md#superblock). The miner and masternode portions add up to 80% +of the block subsidy with the remainder allocated to the governance system. + +Once Dash Platform is released, Dash Core will further divides the masternode reward into Core +(62.5%) and Platform (37.5%) portions. The Core portion will be paid out directly in the coinbase. +The Platform portion will go into the Platform credit pool and then distributed by Platform to +[evonodes](../resources/glossary.md#evolution-masternode-evonode) providing Platform services. + +The following table details how the block subsidy and fees are allocated between miners, masternodes, and the governance system. + +| Payee | Block subsidy | Transaction fees | Description | +| ----- | :-----: | :-------: | -| +| Superblock | 20% | - | Payment for maintenance/expansion of the ecosystem (Core development, marketing, integration, etc.) +| Miner | 20% | 25% | Payment for mining +| Masternode | 60% | 75% | Payment for masternode services including [CoinJoin](../guide/dash-features-coinjoin.md), [InstantSend](../guide/dash-features-instantsend.md), [Governance](https://docs.dash.org/en/stable/introduction/features.html#decentralized-governance), etc. + +Mining + +#### Block Reward Reallocation + +:::{attention} +This block reward reallocation process was superseded by the [treasury +expansion](#treasury-expansion) that was approved by the network in 2023 and subsequently activated +by the Dash Core v20 hard fork at block 1987776. +::: + +Dash Core v0.16 included logic to gradually adjust the block reward allocation once the BIP-9 +activation threshold was met. The reward reallocation was signaled via BIP-9 bit 5 and was activated +at block 1374912 upon signaling by a sufficient number of blocks. + +This reallocation will eventually result in miners receiving 40% of the non-governance block subsidy +and masternodes receiving 60% of it rather than the 50/50 split that was used for several years. + +**Reward reallocation changes** + +Reward reallocation changes began at the first superblock following activation (block 1379128) and +then occurred every three superblock cycles (approximately once per quarter) until the [treasury +expansion](#treasury-expansion) hard fork went into effect. + +| Quarter | Block | Miner % | Masternode % | Change \(%\) | +| :-: | :-: | :-: | :-: | :-: +| - | - | 50 | 50 | 0.00% | +| Q4 2020 | 1,379,128 | 48.7 | 51.3 | 1.30% | +| Q1 2021 | 1,428,976 | 47.4 | 52.6 | 1.30% | +| Q2 2021 | 1,478,824 | 46.7 | 53.3 | 0.70% | +| Q3 2021 | 1,528,672 | 46.0 | 54.0 | 0.70% | +| Q4 2021 | 1,578,520 | 45.4 | 54.6 | 0.60% | +| Q1 2022 | 1,628,368 | 44.8 | 55.2 | 0.60% | +| Q2 2022 | 1,678,216 | 44.3 | 55.7 | 0.50% | +| Q3 2022 | 1,728,064 | 43.8 | 56.2 | 0.50% | +| Q4 2022 | 1,777,912 | 43.3 | 56.7 | 0.50% | +| Q1 2023 | 1,827,760 | 42.8 | 57.2 | 0.50% | +| Q2 2023 | 1,877,608 | 42.3 | 57.7 | 0.50% | +| Q3 2023 | 1,927,456 | 41.8 | 58.2 | 0.50% | +| ***Q4 2023*** | ***1,977,304*** | ***41.5*** | ***58.5*** | ***0.30%*** | +| Q1 2024 * | 2,027,152 | 41.2 | 58.8 | 0.30% | +| Q2 2024 * | 2,077,000 | 40.9 | 59.1 | 0.30% | +| Q3 2024 * | 2,126,848 | 40.6 | 59.4 | 0.30% | +| Q4 2024 * | 2,176,696 | 40.3 | 59.7 | 0.30% | +| Q1 2025 * | 2,226,544 | 40.1 | 59.9 | 0.20% | +| Q2 2025 * | 2,276,392 | 40 | 60 | 0.10% | + +\* The 2024 and 2025 changes were superseded by the [treasury +expansion](#treasury-expansion) activated by hard fork in December 2023. diff --git a/docs/core/reference/block-chain.md b/docs/core/reference/block-chain.md new file mode 100644 index 000000000..c4fb53c3a --- /dev/null +++ b/docs/core/reference/block-chain.md @@ -0,0 +1,11 @@ +# Blockchain + +The following subsections briefly document core block details. + + + +```{toctree} +:maxdepth: 2 +block-chain-block-headers +block-chain-serialized-blocks +``` diff --git a/docs/core/reference/improvement-proposals.md b/docs/core/reference/improvement-proposals.md new file mode 100644 index 000000000..5e77ca14e --- /dev/null +++ b/docs/core/reference/improvement-proposals.md @@ -0,0 +1,17 @@ +```{eval-rst} +.. meta:: + :title: Improvement Proposals + :description: A Dash Improvement Proposal (DIP) is a design document that outlines new features or provides information to the Dash community, similar to Bitcoin's BIPs. +``` + +# Improvement Proposals + +## Dash (DIPs) + +Similar to Bitcoin's BIPs, a Dash Improvement Proposal ([DIP](https://github.com/dashpay/dips)) is a design document for providing information to the Dash community, or describing a new feature for Dash processes/environment. The DIP should provide a concise technical specification of the feature and a rationale for the feature. Please refer to the Dash DIP repository for details on the status of existing DIPs. + +## Bitcoin (BIPs) + +A Bitcoin Improvement Proposal (BIP) is a design document providing information to the Bitcoin community, or describing a new feature for Bitcoin or its processes or environment. + +Since Dash is forked from Bitcoin, some BIPs are applicable to both. Dash-specific BIP information can be found in Dash's BIP repository.The repository provides a list of the BIPs that are relevant to Dash. Note that some BIPs may only be partially implemented or modified to meet Dash requirements. The `Dash Status` column indicates if any changes were made. diff --git a/docs/core/reference/introduction.md b/docs/core/reference/introduction.md new file mode 100644 index 000000000..f2d171c94 --- /dev/null +++ b/docs/core/reference/introduction.md @@ -0,0 +1,25 @@ +```{eval-rst} +.. _reference-index: +.. meta:: + :title: Dash Core Introduction + :description: The Developer Reference provides technical details for building Dash-based applications. +``` + +# Introduction + +The Developer Reference aims to provide technical details and API information to help you start building Dash-based applications, but it is not a specification. To make the best use of this documentation, you may want to install the current version of Dash Core, either from [source](https://www.github.com/dashpay/dash) or from a [pre-compiled executable](https://github.com/dashpay/dash/releases/latest). + +Questions about Dash development are best asked in one of the [Dash development communities](https://www.dash.org/community/). Errors or suggestions related to documentation can be submitted as via the "Edit this page" button on the top, right of each page. + +In the following documentation, some strings have been shortened or wrapped: +"`[...]`" indicates extra data was removed, and lines ending in a single backslash "\\" are continued below. + +## Not A Specification + +This Developer Documentation describes how Dash works to help educate new Dash developers, but it is not a specification---and it never will be. + +Dash security depends on [consensus](../resources/glossary.md#consensus). Should your program diverge from consensus, its security is weakened or destroyed. The cause of the divergence doesn't matter: it could be a bug in your program, it could be an error in this documentation which you implemented as described, or it could be you do everything right but other software on the [network](../resources/glossary.md#network) [behaves unexpectedly](https://bitcoin.org/en/alert/2013-03-11-chain-fork) as in the case of Bitcoin's v0.8 chain fork. The specific cause will not matter to the users of your software whose wealth is lost. + +The only correct specification of consensus behavior is the actual behavior of programs on the network which maintain consensus. As that behavior is subject to arbitrary inputs in a large variety of unique environments, it cannot ever be fully documented here or anywhere else. + +In addition, we also warn you that this documentation has not been extensively reviewed by Dash experts and so likely contains numerous errors. diff --git a/docs/core/reference/p2p-network-constants-and-defaults.md b/docs/core/reference/p2p-network-constants-and-defaults.md new file mode 100644 index 000000000..921ce9582 --- /dev/null +++ b/docs/core/reference/p2p-network-constants-and-defaults.md @@ -0,0 +1,22 @@ +```{eval-rst} +.. meta:: + :title: Dash Core Constants and Defaults + :description: Details Dash network constants and defaults, including port configuration and start strings for Dash network messages. +``` + +# Constants and Defaults + +The following constants and defaults are taken from Dash Core's [chainparams.cpp](https://github.com/dashpay/dash/blob/master/src/chainparams.cpp) source code file. + +| Network | Default Port | Magic Value | [Start String](../resources/glossary.md#start-string) | Max nBits +|---------|--------------|-----------------------------------------------|---------------|-| +| Mainnet | 9999 | 0xBD6B0CBF | 0xBF0C6BBD | 0x1e0ffff0 +| Testnet | 19999 | 0xFFCAE2CE | 0xCEE2CAFF | 0x1e0ffff0 +| Regtest | 19899 | 0xDCB7C1FC | 0xFCC1B7DC | 0x207fffff +| Devnet | User-defined (default 19799) | 0xCEFFCAE2 | 0xE2CAFFCE | 0x207fffff + +Note: the testnet start string and nBits above are for testnet3. + +Command line parameters can change what port a [node](../resources/glossary.md#node) listens on (see `-help`). Start strings are hardcoded constants that appear at the start of all messages sent on the Dash [network](../resources/glossary.md#network); they may also appear in data files such as Dash Core's block database. The Magic Value and [nBits](../resources/glossary.md#nbits) displayed above are in big-endian order; they're sent over the network in little-endian order. The [Start String](../resources/glossary.md#start-string) is simply the endian reversed Magic Value. + +Dash Core's [chainparams.cpp](https://github.com/dashpay/dash/blob/master/src/chainparams.cpp) also includes other constants useful to programs, such as the hash of the [genesis block](../resources/glossary.md#genesis-block) blocks for the different networks. diff --git a/docs/core/reference/p2p-network-control-messages.md b/docs/core/reference/p2p-network-control-messages.md new file mode 100644 index 000000000..82d030da8 --- /dev/null +++ b/docs/core/reference/p2p-network-control-messages.md @@ -0,0 +1,536 @@ +```{eval-rst} +.. meta:: + :title: Control Messages + :description: The network messages in this section will help control the connection between two peers or allow them to advise each other about the rest of the Dash network. +``` + +# Control Messages + +The following [network](../resources/glossary.md#network) messages all help control the connection between two [peers](../resources/glossary.md#peer) or allow them to advise each other about the rest of the network. + +![Overview Of P2P Protocol Control And Advisory Messages](../../img/dev/en-p2p-control-messages.svg) + +Note that almost none of the control messages are authenticated in any way, meaning they can contain incorrect or intentionally harmful information. + +## addr + +The `addr` (IP address) message relays connection information for peers on the network. Each peer which wants to accept incoming connections creates an [`addr` message](../reference/p2p-network-control-messages.md#addr) providing its connection information and then sends that message to its peers unsolicited. Some of its peers send that information to their peers (also unsolicited), some of which further distribute it, allowing decentralized peer discovery for any program already on the network. + +An [`addr` message](../reference/p2p-network-control-messages.md#addr) may also be sent in response to a [`getaddr` message](../reference/p2p-network-control-messages.md#getaddr). + +| Bytes | Name | Data Type | Description +|------------|------------------|--------------------|---------------- +| *Varies* | IP address count | compactSize uint | The number of IP address entries up to a maximum of 1,000. +| *Varies* | IP addresses | network IP address | IP address entries. See the table below for the format of a Dash network IP address. + +Each encapsulated network IP address currently uses the following structure: + +| Bytes | Name | Data Type | Description +|-------|------------|-----------|--------------- +| 4 | time | uint32 | *Added in protocol version 31402.*

A time in Unix epoch time format. Nodes advertising their own IP address set this to the current time. Nodes advertising IP addresses they've connected to set this to the last time they connected to that node. Other nodes just relaying the IP address should not change the time. Nodes can use the time field to avoid relaying old [`addr` messages](../reference/p2p-network-control-messages.md#addr).

Malicious nodes may change times or even set them in the future. +| 8 | services | uint64_t | The services the node advertised in its [`version` message](../reference/p2p-network-control-messages.md#version). +| 16 | IP address | char | IPv6 address in **big endian byte order**. IPv4 addresses can be provided as [IPv4-mapped IPv6 addresses](http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses) +| 2 | port | uint16_t | Port number in **big endian byte order**. Note that Dash Core will only connect to nodes with non-standard port numbers as a last resort for finding peers. This is to prevent anyone from trying to use the network to disrupt non-Dash services that run on other ports. + +The following annotated hexdump shows part of an [`addr` message](../reference/p2p-network-control-messages.md#addr). (The [message header](../resources/glossary.md#message-header) has been omitted and the actual IP address has been replaced with a [RFC5737](http://tools.ietf.org/html/rfc5737) reserved IP address.) + +``` text +fde803 ............................. Address count: 1000 + +d91f4854 ........................... Epoch time: 1414012889 +0100000000000000 ................... Service bits: 01 (network node) +00000000000000000000ffffc0000233 ... IP Address: ::ffff:192.0.2.51 +208d ............................... Port: 8333 + +[...] .............................. (999 more addresses omitted) +``` + +## addrv2 + +*Added in protocol version 70220 of Dash Core* + +The `addrv2` message relays connection information for peers on the network just like the [`addr` message](#addr), but is extended to allow gossiping of longer node addresses as described in [BIP155](https://github.com/bitcoin/bips/blob/master/bip-0155.mediawiki). + +Each encapsulated network IP address currently uses the following structure: + +| Bytes | Name | Data Type | Description +|-------|------------|-----------|--------------- +| 4 | time | uint32_t | A time in Unix epoch time format. Nodes advertising their own IP address set this to the current time. Nodes advertising IP addresses they've connected to set this to the last time they connected to that node. Other nodes just relaying the IP address should not change the time. +| Varies | services | compactSize uint | The services the node advertised in its [`version` message](../reference/p2p-network-control-messages.md#version). +| 1 | networkID | uint8_t | Network identifier. An 8-bit value that specifies which network is addressed. Network ID types may be found in [BIP155](https://github.com/bitcoin/bips/blob/master/bip-0155.mediawiki#specification). +| Varies | addr | Vector | Network address. The interpretation depends on networkID. +| 2 | port | uint16_t | Port number in **big endian byte order**. Note that Dash Core will only connect to nodes with non-standard port numbers as a last resort for finding peers. This is to prevent anyone from trying to use the network to disrupt non-Dash services that run on other ports. + +The following annotated hexdump shows part of an `addrv2` message. (The [message header](../resources/glossary.md#message-header) has been omitted.) + +``` text +01 ................................. Address count: 1 + +1a2a8961 ........................... Epoch time: 1636379162 + +Services information +| fd ............................... Number of service bytes (2) +| 0504 ............................. Service bits: 10000000101 (network, bloom, network_limited) + +Peer address details +| 01 ............................... Network ID (1 - IPv4) +| 04 ............................... Address length +| 2d20ed4c ......................... IP Address: 45.32.237.76 +| 4a37 ............................. Port: 18999 +``` + +## filteradd + +*Added in protocol version 70001 as described by BIP37.* + +The [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd) tells the receiving [peer](../resources/glossary.md#peer) to add a single element to a previously-set [bloom filter](../resources/glossary.md#bloom-filter), such as a new [public key](../resources/glossary.md#public-key). The element is sent directly to the receiving peer; the peer then uses the parameters set in the [`filterload` message](../reference/p2p-network-control-messages.md#filterload) to add the element to the bloom filter. + +Because the element is sent directly to the receiving peer, there is no obfuscation of the element and none of the plausible-deniability privacy provided by the bloom filter. Clients that want to maintain greater privacy should recalculate the bloom filter themselves and send a new [`filterload` message](../reference/p2p-network-control-messages.md#filterload) with the recalculated bloom filter. + +| Bytes | Name | Data Type | Description +|----------|---------------|------------------|----------------- +| *Varies* | element bytes | compactSize uint | The number of bytes in the following element field. +| *Varies* | element | uint8_t[] | The element to add to the current filter. Maximum of 520 bytes, which is the maximum size of an element which can be pushed onto the stack in a pubkey or signature script. Elements must be sent in the byte order they would use when appearing in a raw transaction; for example, hashes should be sent in internal byte order. + +Note: a [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd) will not be accepted unless a filter was previously set with the [`filterload` message](../reference/p2p-network-control-messages.md#filterload). + +The annotated hexdump below shows a [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd) adding a [TXID](../resources/glossary.md#transaction-identifiers). (The message header has been omitted.) This TXID appears in the same block used for the example hexdump in the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock); if that [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) is re-sent after sending this [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd), six hashes are returned instead of four. + +``` text +20 ................................. Element bytes: 32 +fdacf9b3eb077412e7a968d2e4f11b9a +9dee312d666187ed77ee7d26af16cb0b ... Element (A TXID) +``` + +## filterclear + +*Added in protocol version 70001 as described by BIP37.* + +The [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear) tells the receiving [peer](../resources/glossary.md#peer) to remove a previously-set [bloom filter](../resources/glossary.md#bloom-filter). This also undoes the effect of setting the relay field in the [`version` message](../reference/p2p-network-control-messages.md#version) to 0, allowing unfiltered access to [`inv` messages](../reference/p2p-network-data-messages.md#inv) announcing new transactions. + +Dash Core does not require a [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear) before a replacement filter is loaded with `filterload`. It also doesn't require a [`filterload` message](../reference/p2p-network-control-messages.md#filterload) before a [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear). + +There is no payload in a [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## filterload + +*Added in protocol version 70001 as described by BIP37.* + +The [`filterload` message](../reference/p2p-network-control-messages.md#filterload) tells the receiving [peer](../resources/glossary.md#peer) to filter all relayed transactions and requested [merkle blocks](../resources/glossary.md#merkle-block) through the provided filter. This allows clients to receive transactions relevant to their [wallet](../resources/glossary.md#wallet) plus a configurable rate of false positive transactions which can provide plausible-deniability privacy. + +| Bytes | Name | Data Type | Description +|----------|--------------|-----------|--------------- +| *Varies* | nFilterBytes | compactSize uint | Number of bytes in the following filter bit field. +| *Varies* | filter | uint8_t[] | A bit field of arbitrary byte-aligned size. The maximum size is 36,000 bytes. +| 4 | nHashFuncs | uint32_t | The number of hash functions to use in this filter. The maximum value allowed in this field is 50. +| 4 | nTweak | uint32_t | An arbitrary value to add to the seed value in the hash function used by the bloom filter. +| 1 | nFlags | uint8_t | A set of flags that control how outpoints corresponding to a matched pubkey script are added to the filter. See the table in the Updating A Bloom Filter subsection below. + +The annotated hexdump below shows a [`filterload` message](../reference/p2p-network-control-messages.md#filterload). (The message header has been omitted.) For an example of how this payload was created, see the [filterload example](../examples/p2p-network-creating-a-bloom-filter.md). + +``` text +02 ......... Filter bytes: 2 +b50f ....... Filter: 1010 1101 1111 0000 +0b000000 ... nHashFuncs: 11 +00000000 ... nTweak: 0/none +00 ......... nFlags: BLOOM_UPDATE_NONE +``` + +### Initializing A Bloom Filter + +Filters have two core parameters: the size of the bit field and the number of hash functions to run against each data element. The following formulas from BIP37 will allow you to automatically select appropriate values based on the number of elements you plan to insert into the filter (*n*) and the false positive rate (*p*) you desire to maintain plausible deniability. + +* Size of the bit field in bytes (*nFilterBytes*), up to a maximum of 36,000: `(-1 / log(2)**2 * n * log(p)) / 8` + +* Hash functions to use (*nHashFuncs*), up to a maximum of 50: + `nFilterBytes * 8 / n * log(2)` + +Note that the filter matches parts of transactions (transaction elements), so the false positive rate is relative to the number of elements checked---not the number of transactions checked. Each normal transaction has a minimum of four matchable elements (described in the comparison subsection below), so a filter with a false-positive rate of 1 percent will match about 4 percent of all transactions at a minimum. + +According to BIP37, the formulas and limits described above provide support for bloom filters containing 20,000 items with a false positive rate of less than 0.1 percent or 10,000 items with a false positive rate of less than 0.0001 percent. + +Once the size of the bit field is known, the bit field should be initialized as all zeroes. + +### Populating A Bloom Filter + +The bloom filter is populated using between 1 and 50 unique hash functions (the number specified per filter by the *nHashFuncs* field). Instead of using up to 50 different hash function implementations, a single implementation is used with a unique seed value for each function. + +The seed is `nHashNum * 0xfba4c795 + nTweak` as a *uint32\_t*, where the values are: + +* **nHashNum** is the sequence number for this hash function, starting at 0 for the first hash iteration and increasing up to the value of the *nHashFuncs* field (minus one) for the last hash iteration. + +* **0xfba4c795** is a constant optimized to create large differences in the seed for different values of *nHashNum*. + +* **nTweak** is a per-filter constant set by the client to require the use of an arbitrary set of hash functions. + +If the seed resulting from the formula above is larger than four bytes, it must be truncated to its four most significant bytes (for example, `0x8967452301 & 0xffffffff → 0x67452301`). + +The actual hash function implementation used is the [32-bit Murmur3 hash function](https://en.wikipedia.org/wiki/MurmurHash). + +:::{warning} +The Murmur3 hash function has separate 32-bit and 64-bit versions that produce different results for the same [input](../resources/glossary.md#input). Only the 32-bit Murmur3 version is used with Dash bloom filters. +::: + +The data to be hashed can be any transaction element which the bloom filter can match. See the next subsection for the list of transaction elements checked against the filter. The largest element which can be matched is a script data push of 520 bytes, so the data should never exceed 520 bytes. + +The example below from Dash Core [bloom.cpp](https://github.com/dashpay/dash/blob/v0.15.x/src/bloom.cpp#L59) combines all the steps above to create the hash function template. The seed is the first parameter; the data to be hashed is the second parameter. The result is a uint32\_t modulo the size of the bit field in bits. + +``` c++ +MurmurHash3(nHashNum * 0xFBA4C795 + nTweak, vDataToHash) % (vData.size() * 8) +``` + +Each data element to be added to the filter is hashed by *nHashFuncs* number of hash functions. Each time a hash function is run, the result will be the index number (*nIndex*) of a bit in the bit field. That bit must be set to 1. For example if the filter bit field was `00000000` and the result is 5, the revised filter bit field is `00000100` (the first bit is bit 0). + +It is expected that sometimes the same index number will be returned more than once when populating the bit field; this does not affect the algorithm---after a bit is set to 1, it is never changed back to 0. + +After all data elements have been added to the filter, each set of eight bits is converted into a little-endian byte. These bytes are the value of the *filter* field. + +### Comparing Transaction Elements To A Bloom Filter + +To compare an arbitrary data element against the bloom filter, it is hashed using the same parameters used to create the bloom filter. Specifically, it is hashed *nHashFuncs* times, each time using the same +*nTweak* provided in the filter, and the resulting [output](../resources/glossary.md#output) is modulo the size of the bit field provided in the *filter* field. After each hash is performed, the filter is checked to see if the bit at that indexed location is set. For example if the result of a hash is `5` and the filter is `01001110`, the bit is considered set. + +If the result of every hash points to a set bit, the filter matches. If any of the results points to an unset bit, the filter does not match. + +The following transaction elements are compared against bloom filters. All elements will be hashed in the byte order used in [blocks](../resources/glossary.md#block) (for example, [TXIDs](../resources/glossary.md#transaction-identifiers) will be in [internal byte order](../resources/glossary.md#internal-byte-order)). + +* **TXIDs:** the transaction's SHA256(SHA256()) hash. + +* **Outpoints:** each 36-byte [outpoint](../resources/glossary.md#outpoint) used this transaction's input section is individually compared to the filter. + +* **Signature Script Data:** each element pushed onto the stack by a [data-pushing opcode](../resources/glossary.md#data-pushing-opcode) in a [signature script](../resources/glossary.md#signature-script) from this transaction is individually compared to the filter. This includes data elements present in P2SH [redeem script](../resources/glossary.md#redeem-script) when they are being spent. + +* **PubKey Script Data:** each element pushed onto the the stack by a data-pushing opcode in any [pubkey script](../resources/glossary.md#pubkey-script) from this transaction is individually compared to the filter. (If a pubkey script element matches the filter, the filter will be immediately updated if the `BLOOM_UPDATE_ALL` flag was set; if the pubkey script is in the P2PKH format and matches the filter, the filter will be immediately updated if the `BLOOM_UPDATE_P2PUBKEY_ONLY` flag was set. See the subsection below for details.) + +As of Dash Core 0.14.0, elements in the extra payload section of [DIP2](https://github.com/dashpay/dips/blob/master/dip-0002.md)-based [special transactions](../resources/glossary.md#special-transactions) are also compared against bloom filters. + +The following annotated hexdump of a transaction is from the [raw transaction format section](../reference/transactions-raw-transaction-format.md); the elements which would be checked by the filter are emphasized in bold. Note that this transaction's TXID (**`01000000017b1eab[...]`**) would also be checked, and that the outpoint TXID and index number below would be checked as a single 36-byte element. + +
01000000 ................................... Version
+
+01 ......................................... Number of inputs
+|
+| 7b1eabe0209b1fe794124575ef807057
+| c77ada2138ae4fa8d6c4de0398a14f3f ......... Outpoint TXID
+| 00000000 ................................. Outpoint index number
+|
+| 49 ....................................... Bytes in sig. script: 73
+| | 48 ..................................... Push 72 bytes as data
+| | | 30450221008949f0cb400094ad2b5eb3
+| | | 99d59d01c14d73d8fe6e96df1a7150de
+| | | b388ab8935022079656090d7f6bac4c9
+| | | a94e0aad311a4268e082a725f8aeae05
+| | | 73fb12ff866a5f01 ..................... Secp256k1 signature
+|
+| ffffffff ................................. Sequence number: UINT32_MAX
+
+01 ......................................... Number of outputs
+| f0ca052a01000000 ......................... Satoshis (49.99990000 BTC)
+|
+| 19 ....................................... Bytes in pubkey script: 25
+| | 76 ..................................... OP_DUP
+| | a9 ..................................... OP_HASH160
+| | 14 ..................................... Push 20 bytes as data
+| | | cbc20a7664f2f69e5355aa427045bc15
+| | | e7c6c772 ............................. PubKey hash
+| | 88 ..................................... OP_EQUALVERIFY
+| | ac ..................................... OP_CHECKSIG
+
+00000000 ................................... locktime: 0 (a block height)
+
+ +### Updating A Bloom Filter + +Clients will often want to track [inputs](../resources/glossary.md#input) that spend [outputs](../resources/glossary.md#output) (outpoints) relevant to their wallet, so the filterload field *nFlags* can be set to allow the filtering [node](../resources/glossary.md#node) to update the filter when a match is found. When the filtering node sees a [pubkey script](../resources/glossary.md#pubkey-script) that pays a pubkey, [address](../resources/glossary.md#address), or other data element matching the filter, the filtering node immediately updates the filter with the [outpoint](../resources/glossary.md#outpoint) corresponding to that pubkey script. + +![Automatically Updating Bloom Filters](../../img/dev/en-bloom-update.svg) + +If an input later spends that outpoint, the filter will match it, allowing the filtering node to tell the client that one of its transaction outputs has been spent. + +The *nFlags* field has three allowed values: + +| Value | Name | Description +|-------|----------------------------|--------------- +| 0 | `BLOOM_UPDATE_NONE` | The filtering node should not update the filter. +| 1 | `BLOOM_UPDATE_ALL` | If the filter matches any data element in a pubkey script, the corresponding outpoint is added to the filter. +| 2 | `BLOOM_UPDATE_P2PUBKEY_ONLY` | If the filter matches any data element in a pubkey script and that script is either a P2PKH or non-P2SH pay-to-multisig script, the corresponding outpoint is added to the filter. + +In addition, because the filter size stays the same even though additional elements are being added to it, the false positive rate increases. Each false positive can result in another element being added to the filter, creating a feedback loop that can (after a certain point) make the filter useless. For this reason, clients using automatic filter updates need to monitor the actual false positive rate and send a new filter when the rate gets too high. + +## getaddr + +The [`getaddr` message](../reference/p2p-network-control-messages.md#getaddr) requests an [`addr` message](../reference/p2p-network-control-messages.md#addr) from the receiving [node](../resources/glossary.md#node), preferably one with lots of IP addresses of other receiving nodes. The transmitting node can use those IP addresses to quickly update its database of available nodes rather than waiting for unsolicited [`addr` messages](../reference/p2p-network-control-messages.md#addr) to arrive over time. + +There is no payload in a [`getaddr` message](../reference/p2p-network-control-messages.md#getaddr). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## getsporks + +The [`getsporks` message](../reference/p2p-network-control-messages.md#getsporks) requests [`spork` messages](../reference/p2p-network-control-messages.md#spork) from the receiving node. + +There is no payload in a [`getsporks` message](../reference/p2p-network-control-messages.md#getsporks). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## ping + +The [`ping` message](../reference/p2p-network-control-messages.md#ping) helps confirm that the receiving [peer](../resources/glossary.md#peer) is still connected. If a TCP/IP error is encountered when sending the [`ping` message](../reference/p2p-network-control-messages.md#ping) (such as a connection timeout), the transmitting node can assume that the receiving node is disconnected. The response to a [`ping` message](../reference/p2p-network-control-messages.md#ping) is the [`pong` message](../reference/p2p-network-control-messages.md#pong). + +Before protocol version 60000, the [`ping` message](../reference/p2p-network-control-messages.md#ping) had no payload. As of protocol version 60001 and all later versions, the message includes a single field, the nonce. + +| Bytes | Name | Data Type | Description +|-------|-------|-----------|--------------- +| 8 | nonce | uint64_t | *Added in protocol version 60001 as described by BIP31.*

Random nonce assigned to this [`ping` message](../reference/p2p-network-control-messages.md#ping). The responding [`pong` message](../reference/p2p-network-control-messages.md#pong) will include this nonce to identify the [`ping` message](../reference/p2p-network-control-messages.md#ping) to which it is replying. + +The annotated hexdump below shows a [`ping` message](../reference/p2p-network-control-messages.md#ping). (The message header has been omitted.) + +``` text +0094102111e2af4d ... Nonce +``` + +## pong + +*Added in protocol version 60001 as described by BIP31.* + +The [`pong` message](../reference/p2p-network-control-messages.md#pong) replies to a [`ping` message](../reference/p2p-network-control-messages.md#ping), proving to the pinging [node](../resources/glossary.md#node) that the ponging node is still alive. Dash Core will, by default, disconnect from any clients which have not responded to a [`ping` message](../reference/p2p-network-control-messages.md#ping) within 20 minutes. + +To allow nodes to keep track of latency, the [`pong` message](../reference/p2p-network-control-messages.md#pong) sends back the same nonce received in the [`ping` message](../reference/p2p-network-control-messages.md#ping) it is replying to. + +The format of the [`pong` message](../reference/p2p-network-control-messages.md#pong) is identical to the [`ping` message](../reference/p2p-network-control-messages.md#ping); only the message header differs. + +## sendaddrv2 + +*Added in protocol version 70220 of Dash Core* + +The `sendaddrv2` message signals support for receiving [`addrv2` messages](#addrv2) (defined in [BIP155](https://github.com/bitcoin/bips/blob/master/bip-0155.mediawiki)). It also implies that its sender can encode as `addrv2` and would send `addrv2` messages instead of [`addr` messages](#addr) to a peer that has signaled `addrv2` support by sending a `sendaddrv2` message. + +There is no payload in a `sendaddrv2` message. See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## sendcmpct + +*Added in protocol version 70209 of Dash Core as described by BIP152* + +The [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) tells the receiving [peer](../resources/glossary.md#peer) whether or not to announce new [blocks](../resources/glossary.md#block) using a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock). It also sends the compact block protocol version it supports. The [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) is defined as a message containing a 1-byte integer followed by a 8-byte integer. The first integer is interpreted as a boolean and should have a value of either 1 or 0. The second integer is be interpreted as a little-endian version number. + +Upon receipt of a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) with the first and second integers set to 1, the [node](../resources/glossary.md#node) should announce new blocks by sending a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock). + +Upon receipt of a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) with the first integer set to 0, the node shouldn't announce new blocks by sending a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock), but instead announce new blocks by sending invs or [headers](../resources/glossary.md#header), as defined by [BIP130](https://github.com/bitcoin/bips/blob/master/bip-0130.mediawiki). + +Upon receipt of a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) with the second integer set to something other than 1, nodes should treat the peer as if they had not received the message (as it indicates the peer will provide an unexpected encoding in [`cmpctblock` messages](../reference/p2p-network-data-messages.md#cmpctblock), and/or other, messages). This allows future versions to send duplicate [`sendcmpct` messages](../reference/p2p-network-control-messages.md#sendcmpct) with different versions as a part of a version handshake. + +Nodes should check for a protocol version of >= 70209 before sending [`sendcmpct` messages](../reference/p2p-network-control-messages.md#sendcmpct). Nodes shouldn't send a request for a `MSG_CMPCT_BLOCK` object to a peer before having received a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) from that peer. Nodes shouldn't request a `MSG_CMPCT_BLOCK` object before having sent all [`sendcmpct` messages](../reference/p2p-network-control-messages.md#sendcmpct) to that peer which they intend to send, as the peer cannot know what protocol version to use in the response. + +The structure of a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct) is defined below. + +| Bytes | Name | Data Type | Description +|----------|---------------|------------------|-------------- +| 1 | announce | bool | 0 - Announce blocks via [`headers` message](../reference/p2p-network-data-messages.md#headers) or [`inv` message](../reference/p2p-network-data-messages.md#inv)
1 - Announce blocks via [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) +| 8 | version | uint64_t | The compact block protocol version number + +The annotated hexdump below shows a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct). (The message header has been omitted.) + +``` text +01 ................................. Block announce type: Compact Blocks +0100000000000000 ................... Compact block version: 1 +``` + +## senddsq + +*Added in protocol version 70214 of Dash Core* + +The [`senddsq` message](../reference/p2p-network-control-messages.md#senddsq) is used to notify a [peer](../resources/glossary.md#peer) whether or not to send [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq). This allows clients that are not interested in participating in CoinJoin processing (e.g. mobile [wallet](../resources/glossary.md#wallet)) to minimize data usage. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | fSendDSQueue | bool | 0 - Notify peer to not send any [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq)
1 - Notify peer to send all [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) + +The following annotated hexdump shows a [`senddsq` message](../reference/p2p-network-control-messages.md#senddsq). (The message header has been omitted.) + +``` text +01 ................................. CoinJoin participation: Enabled (1) +``` + +## sendheaders + +The [`sendheaders` message](../reference/p2p-network-control-messages.md#sendheaders) tells the receiving [peer](../resources/glossary.md#peer) to send new [block](../resources/glossary.md#block) announcements using a [`headers` message](../reference/p2p-network-data-messages.md#headers) rather than an [`inv` message](../reference/p2p-network-data-messages.md#inv). + +There is no payload in a [`sendheaders` message](../reference/p2p-network-control-messages.md#sendheaders). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## sendheaders2 + +*Added in protocol version 70223 of Dash Core.* + +The [`sendheaders2` message](../reference/p2p-network-control-messages.md#sendheaders2) tells the receiving [peer](../resources/glossary.md#peer) to send new [block](../resources/glossary.md#block) announcements using a [`headers2` message](../reference/p2p-network-data-messages.md#headers2) rather than an [`inv` message](../reference/p2p-network-data-messages.md#inv). + +There is no payload in a [`sendheaders2` message](../reference/p2p-network-control-messages.md#sendheaders2). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## spork + +Sporks are a mechanism by which updated code is released to test networks, but not immediately made active (or “enforced”). Enforcement of the updated code can be activated remotely. Should problems arise, the code can be deactivated in the same manner, without the need for a network-wide rollback or client update. + +A [`spork` message](../reference/p2p-network-control-messages.md#spork) may be sent in response to a [`getsporks` message](../reference/p2p-network-control-messages.md#getsporks). + +The [`spork` message](../reference/p2p-network-control-messages.md#spork) tells the receiving peer the status of the spork defined by the SporkID field. Upon receiving a [spork](../resources/glossary.md#spork) message, the client must verify the [signature](../resources/glossary.md#signature) before accepting the spork message as valid. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nSporkID | int | Required | ID assigned in spork.h +| 8 | nValue | int64_t | Required | Value assigned to spork
Default (disabled): `4000000000` +| 8 | nTimeSigned | int64_t | Required | Time the spork value was signed +| 66 | vchSig | char[] | Required | Length (1 byte) + Signature (65 bytes) + +The following annotated hexdump shows a [`spork` message](../reference/p2p-network-control-messages.md#spork). + +``` text +11270000 .................................... Spork ID: Spork 2 InstantSend enabled (10001) +0000000000000000 ............................ Value (0) +2478da5900000000 ............................ Epoch time: 2017-10-08 19:10:28 UTC (1507489828) + +41 .......................................... Signature length: 65 + +1b6762d3e70890b5cfaed5d1fd72121c +d32020c827a89f8128a00acd210f4ea4 +1b36c26c3767f8a24f48663e189865ed +403ed1e850cdb4207cdd466419d9d183 +45 .......................................... Masternode Signature +``` + +### Active sporks + +:::{note} +Dash Core 21.0.0 [hardened all spork values on mainnet](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md#mainnet-spork-hardening). Spork values can only be updated dynamically on test networks. +::: + +The list of all active sporks can be found in +[`src/spork.h`](https://github.com/dashpay/dash/blob/v20.x/src/spork.h#L36). See the [removed +sporks section](#removed-sporks) for a list of previously removed sporks. + +| Spork ID | Num. | Name | Description | +| :----------: | :----------: | ----------- | ----------- | +| 10001 | 2 | `INSTANTSEND_ENABLED` | *Updated in Dash Core 0.17.0*
Turns InstantSend on and off network wide. Also determines if new mempool transactions should be locked or not. +| 10002 | 3 | `INSTANTSEND_BLOCK_`
`FILTERING` | Turns on and off InstantSend block filtering +| 10008 | 9 | `SUPERBLOCKS_ENABLED` | Superblocks are enabled (20% of the block subsidy is allocated to the Dash treasury for funding approved proposals) +| 10016 | 17 | `SPORK_17_QUORUM_DKG_`
`ENABLED` | Enable long-living masternode quorum (LLMQ) distributed key generation (DKG). When enabled, simple PoSe scoring and banning is active as well. +| 10018 | 19 | `SPORK_19_CHAINLOCKS_`
`ENABLED` | ***Updated in Dash Core 19.2.0***
Enable LLMQ-based ChainLocks. +| 10020 | 21 | `SPORK_21_QUORUM_ALL_`
`CONNECTED` | *Added in Dash Core 0.16.0*
Enable connections between all masternodes in a quorum to optimize the signature recovery process.
Note: Prior to Dash Core 0.17.0 this spork also enforced [PoSe requirements](../guide/dash-features-proof-of-service.md#distributed-key-generation-participation-requirements) for masternodes to support a minimum protocol version and maintain open ports. +| 10022 | 23 | `SPORK_23_QUORUM_POSE`
`CONNECTED` | *Added in Dash Core 0.17.0*
Enforce [PoSe requirements](../guide/dash-features-proof-of-service.md#distributed-key-generation-participation-requirements) for masternodes to support a minimum protocol version and maintain open ports. +| 10023 | 24 | `SPORK_24_TEST_EHF` | **Added in Dash Core 20.0.0** (*Testnet/Devnet/Regtest only*)
Enables quorums to sign and broadcast the `mnhfsignal` message that allows the fork to proceed + +**Spork 2 values** + +Spork 2 supports two different enabled values: + +* `0` - Masternodes create InstantSend locks for all transactions. +* `1` - Masternodes only create InstantSend locks for transactions included in a block. Transactions + in the mempool are not locked. + +Mode 1 is only for use in the event of a sustained overload of InstantSend to ensure that ChainLocks +can remain operational. See [PR 4024](https://github.com/dashpay/dash/pull/4024) for details. + +**Spork 19 values** + +Spork 19 supports two different enable values: + +* `0` - Masternodes create ChainLocks for all blocks. +* `1` - Masternodes retain existing ChainLocks, but do not sign new ones. + +See [PR 5398](https://github.com/dashpay/dash/pull/5398) for implementation details. + +**Spork 21 and 23 values** + + Spork 21 and 23 support two different enabled values: + +* `0` - The spork is active for all quorums regardless of quorum size. +* `1` - The spork is active only for quorums which have a member size less than 100. + +### Removed sporks + +The following sporks were used in the past but are no longer necessary and have been removed recently. To see sporks removed longer ago, please see the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/reference/p2p-network-control-messages.html#removed-sporks). + +| Spork ID | Num. | Name | Description | +| :----------: | :----------: | ----------- | ----------- | +| *10005* | *6* | `NEW_SIGS` | _Removed in Dash Core 0.16.0.
Turns on and off new signature format for Dash-specific messages.
Never enabled on mainnet. The associated logic was hardened in [PR 3662](https://github.com/dashpay/dash/pull/3662) to support testnet (where it is enabled). If testnet is reset at some point in the future, the remaining logic will be removed._ +| *10021* | *22* | `SPORK_22_PS_MORE_`
`PARTICIPANTS` | *Removed in Dash Core 0.17.0*
*Increase the maximum number of participants in CoinJoin sessions.* + +### Spork verification + +To verify `vchSig`, compare the hard-coded spork public key (`strSporkPubKey` from [`src/chainparams.cpp`](https://github.com/dashpay/dash/blob/eaf90b77177efbaf9cbed46e822f0d794f1a0ee5/src/chainparams.cpp#L158)) with the public key recovered from the [`spork` message](../reference/p2p-network-control-messages.md#spork)'s hash and `vchSig` value (implementation details for Dash Core can be found in `CPubKey::RecoverCompact`). The hash is a double SHA-256 hash of: + +* The spork magic message (`"DarkCoin Signed Message:\n"`) +* nSporkID + nValue + nTimeSigned + +| Network | Spork Pubkey (wrapped) | +| ---------- | ---------- | +| Mainnet | 04549ac134f694c0243f503e8c8a9a986f5de6610049c40b07816809b0d1
d06a21b07be27b9bb555931773f62ba6cf35a25fd52f694d4e1106ccd237
a7bb899fdd | +| Testnet3 | 046f78dcf911fbd61910136f7f0f8d90578f68d0b3ac973b5040fb7afb50
1b5939f39b108b0569dca71488f5bbf498d92e4d1194f6f941307ffd95f7
5e76869f0e | +| RegTest | Undefined | +| Devnets | 046f78dcf911fbd61910136f7f0f8d90578f68d0b3ac973b5040fb7afb50
1b5939f39b108b0569dca71488f5bbf498d92e4d1194f6f941307ffd95f7
5e76869f0e | + +## verack + +The [`verack` message](../reference/p2p-network-control-messages.md#verack) acknowledges a previously-received [`version` message](../reference/p2p-network-control-messages.md#version), informing the connecting [node](../resources/glossary.md#node) that it can begin to send other messages. The [`verack` message](../reference/p2p-network-control-messages.md#verack) has no payload; for an example of a message with no payload, see the [message headers section](../reference/p2p-network-message-headers.md). + +## version + +The [`version` message](../reference/p2p-network-control-messages.md#version) provides information about the transmitting [node](../resources/glossary.md#node) to the receiving node at the beginning of a connection. Until both [peers](../resources/glossary.md#peer) have exchanged [`version` messages](../reference/p2p-network-control-messages.md#version), no other messages will be accepted. + +If a [`version` message](../reference/p2p-network-control-messages.md#version) is accepted, the receiving node should send a [`verack` message](../reference/p2p-network-control-messages.md#verack)---but no node should send a [`verack` message](../reference/p2p-network-control-messages.md#verack) before initializing its half of the connection by first sending a [`version` message](../reference/p2p-network-control-messages.md#version). + +Protocol version 70214 added a [masternode](../resources/glossary.md#masternode) authentication (challenge/response) system. Following the [`verack` message](../reference/p2p-network-control-messages.md#verack), masternodes should send a [`mnauth` message](../reference/p2p-network-masternode-messages.md#mnauth) that signs the `mnauth_challenge` with their BLS operator key. + +| Bytes | Name | Data
Type | Required/
Optional | Description +|----------|-----------------------|------------------|------------------------------------------|------------- +| 4 | version | int32_t | Required | The highest protocol version understood by the transmitting node. See the [protocol version section](../reference/p2p-network-protocol-versions.md). +| 8 | services | uint64_t | Required | The services supported by the transmitting node encoded as a bitfield. See the list of service codes below. +| 8 | timestamp | int64_t | Required | The current Unix epoch time according to the transmitting node's clock. Because nodes will reject blocks with timestamps more than two hours in the future, this field can help other nodes to determine that their clock is wrong. +| 8 | addr_recv services | uint64_t | Required | *Added in protocol version 106.*

The services supported by the receiving node as perceived by the transmitting node. Same format as the 'services' field above. Dash Core will attempt to provide accurate information. +| 16 | addr_recv IP address | char | Required | *Added in protocol version 106.*

The IPv6 address of the receiving node as perceived by the transmitting node in **big endian byte order**. IPv4 addresses can be provided as [IPv4-mapped IPv6 addresses](http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses). Dash Core will attempt to provide accurate information. +| 2 | addr_recv port | uint16_t | Required | *Added in protocol version 106.*

The port number of the receiving node as perceived by the transmitting node in **big endian byte order**. +| 8 | addr_trans services | uint64_t | Required | The services supported by the transmitting node. Should be identical to the 'services' field above. +| 16 | addr_trans IP address | char | Required | The IPv6 address of the transmitting node in **big endian byte order**. IPv4 addresses can be provided as [IPv4-mapped IPv6 addresses](http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses). Set to ::ffff:127.0.0.1 if unknown. +| 2 | addr_trans port | uint16_t | Required | The port number of the transmitting node in **big endian byte order**. +| 8 | nonce | uint64_t | Required | A random nonce which can help a node detect a connection to itself. If the nonce is 0, the nonce field is ignored. If the nonce is anything else, a node should terminate the connection on receipt of a [`version` message](../reference/p2p-network-control-messages.md#version) with a nonce it previously sent. +| *Varies* | user_agent bytes | compactSize uint | Required | Number of bytes in following user\_agent field. If 0x00, no user agent field is sent. +| *Varies* | user_agent | string | Required if user_agent bytes > 0 | *Renamed in protocol version 60000.*

User agent as defined by BIP14. Previously called subVer.

Dash Core limits the length to 256 characters. +| 4 | start_height | int32_t | Required | The height of the transmitting node's best block chain or, in the case of an SPV client, best block header chain. +| 1 | relay | bool | Optional | *Added in protocol version 70001 as described by BIP37.*

Transaction relay flag. If 0x00, no [`inv` messages](../reference/p2p-network-data-messages.md#inv) or [`tx` messages](../reference/p2p-network-data-messages.md#tx) announcing new transactions should be sent to this client until it sends a [`filterload` message](../reference/p2p-network-control-messages.md#filterload) or [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear). If the relay field is not present or is set to 0x01, this node wants [`inv` messages](../reference/p2p-network-data-messages.md#inv) and [`tx` messages](../reference/p2p-network-data-messages.md#tx) announcing new transactions. +| 32 | mnauth_
challenge | uint256 | Optional | *Added in protocol version 70214*

A challenge to be signed by the receiving masternode. The response is returned via a [`mnauth` message](../reference/p2p-network-masternode-messages.md#mnauth) following the [`verack` message](../reference/p2p-network-control-messages.md#verack). +| 1 | mn_connection | bool | Optional | If 0x00, the connection is from a non-masternode. If 0x01, the connection is from a masternode. + +The following service identifiers have been assigned. + +| Value | Name | Description +|-------|--------------|--------------- +| 0x00 | *Unnamed* | This node is not a full node. It may not be able to provide any data except for the transactions it originates. +| 0x01 | `NODE_NETWORK` | This is a full node and can be asked for full blocks. It should implement all protocol features available in its self-reported protocol version. +| 0x02 | `NODE_GETUTXO` | **Removed in Dash Core 20.0.0**
This node is capable of responding to the getutxo protocol request. +| 0x04 | `NODE_BLOOM` | This node is capable and willing to handle bloom-filtered connections. Dash Core nodes used to support this by default, without advertising this bit, but no longer do as of protocol version 70201 (= NO_BLOOM_VERSION) +| 0x08 | `NODE_XTHIN` | **Dash Core does not support this service**
This node supports Xtreme Thinblocks. +| 0x40 | `NODE_COMPACT_FILTERS` | This node supports basic block filter requests. See [BIP157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) and [BIP158](https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki) for details on how this is implemented. +| 0x400 | `NODE_NETWORK_LIMITED` | This is the same as `NODE_NETWORK` with the limitation of only serving the last 288 blocks. See [BIP159](https://github.com/bitcoin/bips/blob/master/bip-0159.mediawiki) for details on how this is implemented. *Not supported prior to Dash Core 0.16.0* + +The following annotated hexdump shows a [`version` message](../reference/p2p-network-control-messages.md#version). (The message header has been omitted and the actual IP addresses have been replaced with [RFC5737](http://tools.ietf.org/html/rfc5737) reserved IP addresses.) + +``` text +46120100 .................................... Protocol version: 70214 +0500000000000000 ............................ Services: NODE_NETWORK (1) + NODE_BLOOM (4) +9c10ad5c00000000 ............................ Epoch time: 1554845852 + +0100000000000000 ............................ Receiving node's services +00000000000000000000ffffc61b6409 ............ Receiving node's IPv6 address +270f ........................................ Receiving node's port number + +0500000000000000 ............................ Transmitting node's services +00000000000000000000ffffcb0071c0 ............ Transmitting node's IPv6 address +270f ........................................ Transmitting node's port number + +128035cbc97953f8 ............................ Nonce + +12 .......................................... Bytes in user agent string: 18 +2f4461736820436f72653a302e31322e312e352f..... User agent: /Dash Core:0.14.0/ + +851f0b00 .................................... Start height: 76944 +01 .......................................... Relay flag: true + +5dbb5d1baade6a9afa34db708f72c0dd +b5bd82b3656493484556689640a91357 ............ Masternode Auth. Challenge + +00 .......................................... Masternode connection (false) +``` diff --git a/docs/core/reference/p2p-network-data-messages.md b/docs/core/reference/p2p-network-data-messages.md new file mode 100644 index 000000000..08b488dce --- /dev/null +++ b/docs/core/reference/p2p-network-data-messages.md @@ -0,0 +1,982 @@ +```{eval-rst} +.. meta:: + :title: Data Messages + :description: Network messages related to transactions and blocks utilize inventories as unique identifiers, which have a simple 36-byte structure. +``` + +# Data Messages + +The following network messages all request or provide data related to transactions and blocks. + +![Overview Of P2P Protocol Data Request And Reply Messages](../../img/dev/en-p2p-data-messages.svg) + +Many of the data messages use [inventories](../resources/glossary.md#inventory) as unique identifiers for [transactions](../resources/glossary.md#transaction) and [blocks](../resources/glossary.md#block). Inventories have a simple 36-byte structure: + +| Bytes | Name | Data Type | Description +|-------|-----------------|-----------|------------- +| 4 | type identifier | uint32_t | The type of object which was hashed. See list of type identifiers below. +| 32 | hash | char[32] | SHA256(SHA256()) hash of the object in internal byte order. + +The currently-available type identifiers are: + +| Type Identifier | Name | Description +|-----------------|---------------------------------|------------ +| 1 | MSG_TX | The hash is a TXID. +| 2 | MSG_BLOCK | The hash is of a block header. +| 3 | MSG_FILTERED_BLOCK | The hash is of a block header; identical to `MSG_BLOCK`. When used in a [`getdata` message](../reference/p2p-network-data-messages.md#getdata), this indicates the response should be a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) rather than a [`block` message](../reference/p2p-network-data-messages.md#block) (but this only works if a bloom filter was previously configured). **Only for use in [`getdata` messages](../reference/p2p-network-data-messages.md#getdata).** +| 6 | MSG_SPORK | The hash is Spork ID. +| 16 | MSG_DSTX | The hash is CoinJoin Broadcast TX. +| 17 | MSG_GOVERNANCE_OBJECT | The hash is a Governance Object. +| 18 | MSG_GOVERNANCE_OBJECT_VOTE | The hash is a Governance Object Vote. +| 20 | MSG_CMPCT_BLOCK | The hash is of a block header; identical to `MSG_BLOCK`. When used in a [`getdata` message](../reference/p2p-network-data-messages.md#getdata), this indicates the response should be a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock). **Only for use in [`getdata` messages](../reference/p2p-network-data-messages.md#getdata).** +| 21 | MSG_QUORUM_FINAL_COMMITMENT | The hash is a long-living masternode quorum final commitment.
_Added in 0.13.0_ +| 23 | MSG_QUORUM_CONTRIB | The hash is a long-living masternode quorum contribution.
_Added in 0.14.0_ +| 24 | MSG_QUORUM_COMPLAINT | The hash is a long-living masternode quorum complaint.
_Added in 0.14.0_ +| 25 | MSG_QUORUM_JUSTIFICATION | The hash is a long-living masternode quorum justification.
_Added in 0.14.0_ +| 26 | MSG_QUORUM_PREMATURE_COMMITMENT | The hash is a long-living masternode quorum premature commitment.
_Added in 0.14.0_ +| 28 | MSG_QUORUM_RECOVERED_SIG | The hash is a long-living masternode quorum recovered signature.

**Note**: Only relayed to other masternodes in the same quorum and nodes that have sent a [`qwatch` message](../reference/p2p-network-quorum-messages.md#qwatch) as of Dash Core 0.17.0
_Added in 0.14.0_ +| 29 | MSG_CLSIG | The hash is a ChainLock signature.
_Added in 0.14.0_ +| 31 | MSG_ISDLOCK | The hash is an LLMQ-based deterministic InstantSend lock ([DIP22](https://github.com/dashpay/dips/blob/master/dip-0022.md)).
_Added in 18.0_ + +**Deprecated Type Identifiers** + +The following type identifiers have been deprecated recently. To see type identifiers removed longer ago, please see the [previous version of documentation](https://docs.dash.org/projects/core/en/19.0.0/docs/reference/p2p-network-data-messages.html). + +| Type Identifier | Name | Description +|-----------------|---------------------------------|------------ +| 4 | MSG_LEGACY_TXLOCK_REQUEST | **Deprecated in 20.0.0**
`MSG_TXLOCK_REQUEST` prior to Dash Core 0.15.0. The hash is an InstantSend transaction lock request. Transactions received this way are automatically converted to a standard [`tx` message](../reference/p2p-network-data-messages.md#tx) as of Dash Core 0.15.0. +| 5 | MSG_TXLOCK_VOTE | **Deprecated in 0.15.0**
The hash is an InstantSend transaction vote. +| 30 | MSG_ISLOCK | **Deprecated in 20.1.0**
The hash is an LLMQ-based InstantSend lock ([DIP10](https://github.com/dashpay/dips/blob/master/dip-0010.md)).
_Added in 0.14.0_ + +Type identifier zero and type identifiers greater than those shown in the table above are reserved for future implementations. Dash Core ignores all inventories with one of these unknown types. + +## block + +The [`block` message](../reference/p2p-network-data-messages.md#block) transmits a single [serialized block](../resources/glossary.md#serialized-block) in the format described in the [serialized blocks section](../reference/block-chain-serialized-blocks.md). See that section for an example hexdump. It can be sent for two different reasons: + +1. **GetData Response:** Nodes will always send it in response to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) that requests the block with an [inventory](../resources/glossary.md#inventory) type of `MSG_BLOCK` (provided the node has that block available for relay). + +2. **Unsolicited:** Some miners will send unsolicited [`block` messages](../reference/p2p-network-data-messages.md#block) broadcasting their newly-mined blocks to all of their [peers](../resources/glossary.md#peer). Many [mining](../resources/glossary.md#mining) pools do the same thing, although some may be misconfigured to send the block from multiple nodes, possibly sending the same block to some peers more than once. + +## blocktxn + +_Added in protocol version 70209 of Dash Core as described by BIP152_ + +The [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn) sends requested [block](../resources/glossary.md#block) [transactions](../resources/glossary.md#transaction) to a node which previously requested them with a [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn). It is defined as a message containing a serialized `BlockTransactions` message. + +Upon receipt of a properly-formatted requested [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn), [nodes](../resources/glossary.md#node) should: + +1. Attempt to reconstruct the full block by taking the prefilledtxn transactions from the original [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) and placing them in the marked positions +2. For each short transaction ID from the original [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock), in order, find the corresponding transaction (from either the [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn) or from other sources) +3. Place each short transaction ID in the first available position in the block +4. Once the block has been reconstructed, it shall be processed as normal. + +**Short transaction IDs are expected to occasionally collide. Nodes must not be penalized for such collisions.** + +The structure of `BlockTransactions` is defined below. + +| Bytes | Name | Data Type | Encoding | Description| +|----------|----------------------|----------------------|----------|------------| +| 32 | blockhash | Binary blob | The output from a double-SHA256 of the block header, as used elsewhere | The blockhash of the block which the transactions being provided are in +| 1 or 3 | transactions
_length | CompactSize | As used to encode array lengths elsewhere | The number of transactions provided +| _Varies_ | transactions | List of transactions | As encoded in [`tx` messages](../reference/p2p-network-data-messages.md#tx) in response to `getdata MSG_TX` | The transactions provided + +The following annotated hexdump shows a [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn). (The message header has been omitted.) + +``` text +182327cb727da7d60541da793831fd0ab0509e79c8cd +3d654cdf3a0100000000 ....................... Block Hash + +01 ......................................... Transactions Provided: 1 + +Transaction(s) +| Transaction 1 +| | 01000000 ................................ Transaction Version: 1 +| | 01 ...................................... Input count: 1 +| | +| | Transaction input #1 +| | | +| | | 0952617a516d956e2ecee71a6adc249f +| | | 4bb757adcc409452ab98c8e55c31e62a ..... Outpoint TXID +| | | 00000000 ............................. Outpoint index number: 0 +| | | +| | | 6b ................................... Bytes in sig. script: 107 +| | | 483045022100d10edf447252e1e69ff1 +| | | 77330bb2c889a50be02e00cc5d79c0d0 +| | | 79ae56518fc40220245d36905dc950fc +| | | d55694cfde8cde3109dc80b12aca3a6e +| | | 332033802ee36e1b01210272cc6e7660 +| | | 2648831d8e80fca8eb24369cd0f23ff0 +| | | 79cf20ae9d9beee05de6db ............... Secp256k1 signature +| | | +| | | ffffffff ............................. Sequence number: UINT32_MAX +| | +| | 02 ..................................... Number of outputs: 02 +| | +| | Transaction output #1 +| | | 0be0f50500000000 ..................... Duffs (0.99999755 Dash) +| | | +| | | 19 ................................... Bytes in pubkey script: 25 +| | | | 76 ................................. OP_DUP +| | | | a9 ................................. OP_HASH160 +| | | | 14 ................................. Push 20 bytes as data +| | | | | 923d91ed359f650eec6ea8b9030b340d +| | | | | ea63d590 ......................... PubKey hash +| | | | 88 ................................. OP_EQUALVERIFY +| | | | ac ................................. OP_CHECKSIG +| | +| | [...] .................................. 1 more tx output omitted +| | +| | 00000000 ............................... locktime: 0 (a block height) +``` + +## cfcheckpt + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`cfcheckpt` message](../reference/p2p-network-data-messages.md#cfcheckpt) is sent in response to the [`getcfcheckpt` message](../reference/p2p-network-data-messages.md#getcfcheckpt). The filter headers included are the set of all filter headers on the requested chain where the height is a positive multiple of 1,000. + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested. Should match the field in the [`getcfcheckpt` message](../reference/p2p-network-data-messages.md#getcfcheckpt) being responded to. +| 32 | stop_hash | uint256 | The hash of the last block in the requested range. Should match the field in the [`getcfcheckpt` message](../reference/p2p-network-data-messages.md#getcfcheckpt) being responded to. +| 1-3 | filter_headers
_length | CompactSize | The length of the following vector of filter headers +| `filter_headers`
`_length` * 32 | filter_hashes | [][32]byte | The filter headers at intervals of 1,000 + +## cfheaders + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`cfheaders` message](../reference/p2p-network-data-messages.md#cfheaders) is sent in response to the [`getcfheaders` message](../reference/p2p-network-data-messages.md#getcfheaders). Instead of including the filter headers themselves, the response includes one filter header and a sequence of filter hashes, from which the headers can be derived. This has the benefit that the client can verify the binding links between the headers. + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested. Should match the field in the [`getcfheaders` message](../reference/p2p-network-data-messages.md#getcfheaders) being responded to. +| 32 | stop_hash | uint256 | The hash of the last block in the requested range. Should match the field in the [`getcfheaders` message](../reference/p2p-network-data-messages.md#getcfheaders) being responded to. +| 32 | previous_filter
_header | uint256 | The filter header preceding the first block in the requested range +| 1-3 | filter_hashes
_length | CompactSize | The length of the following vector of filter hashes. Must not be > 2000. +| `filter_hashes`
`_length` * 32 | filter_hashes | [][32]byte | The filter hashes for each block in the requested range + +## cfilter + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`cfilter` message](../reference/p2p-network-data-messages.md#cfilter) is sent in response to the [`getcfilters` message](../reference/p2p-network-data-messages.md#getcfilters), one for each block in the requested range. + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested. Should match the field in the [`getcfilters` message](../reference/p2p-network-data-messages.md#getcfilters) being responded to. +| 32 | block_hash | uint256 | Block hash of the block for which the filter is being returned. Must correspond to a block that is an ancestor of the request's `stop_hash` with a height >= `start_height`. +| 1-5 | num_filter_bytes | CompactSize | A variable length integer representing the size of the filter in the following field +| `num_filter_bytes` | filter_bytes | []bytes | The serialized compact filter for this block + +## cmpctblock + +_Added in protocol version 70209 of Dash Core as described by BIP152_ + +The [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) is a reply to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) which requested a [block](../resources/glossary.md#block) using the [inventory](../resources/glossary.md#inventory) type `MSG_CMPCT_BLOCK`. If the requested block was recently announced and is close to the tip of the best chain of the receiver and after having sent the requesting [peer](../resources/glossary.md#peer) a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct), nodes respond with a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) containing data for the block. + +**If the requested block is too old, the node responds with a _full non-compact block_** + +Upon receipt of a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock), after sending a [`sendcmpct` message](../reference/p2p-network-control-messages.md#sendcmpct), nodes should calculate the short transaction ID for each [unconfirmed transaction](../resources/glossary.md#unconfirmed-transaction) they have available (i.e. in their mempool) and compare each to each short transaction ID in the [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock). After finding already-available transactions, nodes which do not have all transactions available to reconstruct the full block should request the missing transactions using a [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn). + +A node must not send a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) unless they are able to respond to a [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn) which requests every transaction in the block. A node must not send a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) without having validated that the [header](../resources/glossary.md#header) properly commits to each transaction in the block, and properly builds on top of the existing, fully-validated chain with a valid proof-of-work either as a part of the current most-work valid chain, or building directly on top of it. A node may send a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) before validating that each transaction in the block validly spends existing UTXO set entries. + +The [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) contains a vector of `PrefilledTransaction` whose structure is defined below. A `PrefilledTransaction` is used in `HeaderAndShortIDs` to provide a list of a few transactions explicitly. + +| Bytes | Name | Data Type | Encoding | Description| +|----------|----------------------|----------------------|----------|------------| +| 1 or 3 | index | CompactSize | Compact Size, differentially encoded since the last PrefilledTransaction in a list | The index into the block at which this transaction is +| _Varies_ | tx | Transaction | As encoded in [`tx` messages](../reference/p2p-network-data-messages.md#tx) sent in response to `getdata MSG_TX` | Transaction which is in the block at index `index` + +The [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) is compromised of a serialized `HeaderAndShortIDs` structure which is defined below. A `HeaderAndShortIDs` structure is used to relay a block header, the short transactions IDs used for matching already-available transactions, and a select few transactions which we expect a peer may be missing. + +| Bytes | Name | Data Type | Encoding | Description| +|----------|----------------------|----------------------|----------|------------| +| 80 | header | Block header | First 80 bytes of the block as defined by the encoding used by [`block` messages](../reference/p2p-network-data-messages.md#block) | The header of the block being provided +| 8 | nonce | uint64_t | Little Endian | A nonce for use in short transaction ID calculations +| 1 or 3 | shortids_
length | CompactSize | As used to encode array lengths elsewhere | The number of short transaction IDs in `shortids` (i.e. block tx count - `prefilledtxn`
`_length`) +| _Varies_ | shortids | List of 6-byte integers | Little Endian | The short transaction IDs calculated from the transactions which were not provided explicitly in `prefilledtxn` +| 1 or 3 | prefilledtxn
_length | CompactSize | As used to encode array lengths elsewhere | The number of prefilled transactions in `prefilledtxn` (i.e. block tx count - `shortids`
`_length`) +| _Varies_ | prefilledtxn | List of Prefilled
Transactions | As defined by `Prefilled`
`Transaction` definition below | Used to provide the coinbase transaction and a select few which we expect a peer may be missing + +### **Short Transaction ID calculation** + +Short transaction IDs are used to represent a transaction without sending a full 256-bit hash. They are calculated as follows, + +* A single-SHA256 hashing the [block header](../resources/glossary.md#block-header) with the nonce appended (in little-endian) +* Running SipHash-2-4 with the input being the transaction ID and the keys (k0/k1) set to the first two little-endian 64-bit integers from the above hash, respectively. +* Dropping the 2 most significant bytes from the SipHash output to make it 6 bytes. + +The following annotated hexdump shows a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock). (The message header has been omitted.) + +``` text +00000020981178a4342cec6316296b2ad84c9b7cdf9f +2688e5d0fe1a0003cd0000000000f64870f52a3d0125 +1336c9464961216732b25fbf288a51f25a0e81bffb20 +e9600194d85a64a50d1cc02b0181 ................ Block Header + +3151b67e5b418b9d ............................ Nonce + +01 .......................................... Short IDs Length: 1 +483edcd3c799 ................................ Short IDs + +01 .......................................... Prefilled Transaction Length: 1 + +Prefilled Transactions +| 00 ........................................ Index: 0 +| +| Transaction 1 (Coinbase) +| | 01000000 ................................ Transaction Version: 1 +| | 01 ...................................... Input count: 1 +| | +| | Transaction input #1 +| | | +| | | 00000000000000000000000000000000 +| | | 00000000000000000000000000000000 ..... Outpoint TXID +| | | ffffffff ............................. Outpoint index number: UINT32_MAX +| | | +| | | 13 ................................... Bytes in sig. script: 19 +| | | 03daaf010e2f5032506f6f6c2d74444153482f Secp256k1 signature +| | | +| | | ffffffff ............................. Sequence number: UINT32_MAX +| | +| | 04 ..................................... Number of outputs: 04 +| | +| | Transaction output #1 +| | | ffe5654200000000 ..................... Duffs (11.13974271 Dash) +| | | +| | | 19 ................................... Bytes in pubkey script: 25 +| | | | 76 ................................. OP_DUP +| | | | a9 ................................. OP_HASH160 +| | | | 14 ................................. Push 20 bytes as data +| | | | | b885cb21ad12e593c1a46d814df47ccb +| | | | | 450a7d84 ......................... PubKey hash +| | | | 88 ................................. OP_EQUALVERIFY +| | | | ac ................................. OP_CHECKSIG +| | +| | [...] .................................. 3 more tx outputs omitted +| | +| | 00000000 ............................... locktime: 0 (a block height) +``` + +## getblocks + +The [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) requests an [`inv` message](../reference/p2p-network-data-messages.md#inv) that provides [block header](../resources/glossary.md#block-header) hashes starting from a particular point in the [block chain](../resources/glossary.md#block-chain). It allows a [peer](../resources/glossary.md#peer) which has been disconnected or started for the first time to get the data it needs to request the blocks it hasn't seen. + +Peers which have been disconnected may have [stale blocks](../resources/glossary.md#stale-block) in their locally-stored block chain, so the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) allows the requesting peer to provide the receiving peer with multiple [header](../resources/glossary.md#header) hashes at heights on their local chain. This allows the receiving peer to find, within that list, the last header hash they had in common and reply with all subsequent header hashes. + +**Note:** the receiving peer itself may respond with an [`inv` message](../reference/p2p-network-data-messages.md#inv) containing header hashes of stale blocks. It is up to the requesting peer to poll all of its peers to find the best block chain. + +If the receiving peer does not find a common header hash within the list, it will assume the last common block was the [genesis block](../resources/glossary.md#genesis-block) (block zero), so it will reply with in [`inv` message](../reference/p2p-network-data-messages.md#inv) containing header hashes starting with block one (the first block after the genesis block). + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 4 | version | uint32_t | The protocol version number; the same as sent in the [`version` message](../reference/p2p-network-control-messages.md#version). +| _Varies_ | hash count | compactSize uint | The number of header hashes provided not including the stop hash. There is no limit except that the byte size of the entire message must be below the [`MAX_SIZE`](https://github.com/dashpay/dash/blob/v0.15.x/src/serialize.h#L29) limit; typically from 1 to 200 hashes are sent. +| _Varies_ | block header hashes | char[32] | One or more block header hashes (32 bytes each) in internal byte order. Hashes should be provided in reverse order of block height, so highest-height hashes are listed first and lowest-height hashes are listed last. +| 32 | stop hash | char[32] | The header hash of the last header hash being requested; set to all zeroes to request an [`inv` message](../reference/p2p-network-data-messages.md#inv) with all subsequent header hashes (a maximum of 500 will be sent as a reply to this message; if you need more than 500, you will need to send another [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) with a higher-height header hash as the first entry in block header hash field). + +The following annotated hexdump shows a [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks). (The message header has been omitted.) + +``` text +71110100 ........................... Protocol version: 70001 +02 ................................. Hash count: 2 + +d39f608a7775b537729884d4e6633bb2 +105e55a16a14d31b0000000000000000 ... Hash #1 + +5c3e6403d40837110a2e8afb602b1c01 +714bda7ce23bea0a0000000000000000 ... Hash #2 + +00000000000000000000000000000000 +00000000000000000000000000000000 ... Stop hash +``` + +## getblocktxn + +_Added in protocol version 70209 of Dash Core as described by BIP152_ + +The [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn) requests a [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn) for any transactions that it has not seen after a compact block is received. It is defined as a message containing a serialized `BlockTransactionsRequest` message. Upon receipt of a properly-formatted [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn), [nodes](../resources/glossary.md#node) which recently provided the sender of such a message with a [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock) for the block hash identified in this message must respond with either an appropriate [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn), or a full block message. + +A [`blocktxn` message](../reference/p2p-network-data-messages.md#blocktxn) response must contain exactly and only each transaction which is present in the appropriate block at the index specified in the [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn) indexes list, in the order requested. + +The structure of `BlockTransactionsRequest` is defined below. + +| Bytes | Name | Data Type | Description| +|----------|-----------------|----------------------|----------|------| +| 32 | blockhash | Binary blob | The output from a double-SHA256 of the block header, as used elsewhere | The blockhash of the block which the transactions being requested are in +| _Varies_ | indexes_length | CompactSize uint | As used to encode array lengths elsewhere | The number of transactions requested +| _Varies_ | indexes | CompactSize uint[] | Differentially encoded | Vector of compactSize containing the indexes of the transactions being requested in the block. + +The following annotated hexdump shows a [`getblocktxn` message](../reference/p2p-network-data-messages.md#getblocktxn). (The message header has been omitted.) + +``` text +182327cb727da7d60541da793831fd0a +b0509e79c8cd3d654cdf3a0100000000 ... Block Hash + +01 ................................. Index length: 1 +01 ................................. Index: 1 +``` + +## getcfcheckpt + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`getcfcheckpt` message](../reference/p2p-network-data-messages.md#getcfcheckpt) requests verifiable filter headers for a range of blocks. The response to this message is a [`cfcheckpt` message](../reference/p2p-network-data-messages.md#cfcheckpt). + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested +| 32 | stop_hash | uint256 | The hash of the last block in the requested range + +## getcfheaders + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`getcfheaders` message](../reference/p2p-network-data-messages.md#getcfheaders) requests verifiable filter headers for a range of blocks. The response to this message is a [`cfheaders` message](../reference/p2p-network-data-messages.md#cfheaders). + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested +| 4 | start_height | uint32_t | The height of the first block in the requested range +| 32 | stop_hash | uint256 | The hash of the last block in the requested range. Must be >= `start_height` and the difference between them must be less than 2000. + +## getcfilters + +*Added in protocol version 70223 of Dash Core as described by [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki).* + +The [`getcfilters` message](../reference/p2p-network-data-messages.md#getcfilters) requests compact filters of a particular type for a particular range of blocks. The response to this message is a [`cfilter` message](../reference/p2p-network-data-messages.md#cfilter). + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 1 | filter_type | uint8_t | Filter type for which headers are requested +| 4 | start_height | uint32_t | The height of the first block in the requested range +| 32 | stop_hash | uint256 | The hash of the last block in the requested range + +## getdata + +The [`getdata` message](../reference/p2p-network-data-messages.md#getdata) requests one or more data objects from another [node](../resources/glossary.md#node). The objects are requested by an inventory, which the requesting node typically previously received by way of an [`inv` message](../reference/p2p-network-data-messages.md#inv). + +The response to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) can be a [`tx` message](../reference/p2p-network-data-messages.md#tx), [`block` message](../reference/p2p-network-data-messages.md#block), [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock), [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx), [`govobj` message](../reference/p2p-network-governance-messages.md#govobj), [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote), [`notfound` message](../reference/p2p-network-data-messages.md#notfound), [`cmpctblock` message](../reference/p2p-network-data-messages.md#cmpctblock), or any other messages that are exchanged by way of [`inv` messages](../reference/p2p-network-data-messages.md#inv). + +This message cannot be used to request arbitrary data, such as historic transactions no longer in the memory pool or relay set. Full nodes may not even be able to provide older [blocks](../resources/glossary.md#block) if they've pruned old transactions from their block database. For this reason, the [`getdata` message](../reference/p2p-network-data-messages.md#getdata) should usually only be used to request data from a node which previously advertised it had that data by sending an [`inv` message](../reference/p2p-network-data-messages.md#inv). + +The format and maximum size limitations of the [`getdata` message](../reference/p2p-network-data-messages.md#getdata) are identical to the [`inv` message](../reference/p2p-network-data-messages.md#inv); only the message header differs. + +## getheaders + +_Added in protocol version 70077._ + +The [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) requests a [`headers` message](../reference/p2p-network-data-messages.md#headers) that provides block headers starting from a particular point in the [block chain](../resources/glossary.md#block-chain). It allows a [peer](../resources/glossary.md#peer) which has been disconnected or started for the first time to get the [headers](../resources/glossary.md#header) it hasn’t seen yet. + +The [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) is nearly identical to the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks), with one minor difference: the `inv` reply to the [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) will include no more than 500 [block header](../resources/glossary.md#block-header) hashes; the `headers` reply to the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) will include as many as 2,000 block headers. + +| Bytes | Name | Data Type | Description +|----------|----------------------|------------------|---------------- +| 4 | version | uint32_t | The protocol version number; the same as sent in the [`version` message](../reference/p2p-network-control-messages.md#version). +| _Varies_ | hash count | compactSize uint | The number of header hashes provided not including the stop hash. +| _Varies_ | block header hashes | char[32] | One or more block header hashes (32 bytes each) in internal byte order. Hashes should be provided in reverse order of block height, so highest-height hashes are listed first and lowest-height hashes are listed last. +| 32 | stop hash | char[32] | The header hash of the last header hash being requested; set to all zeroes to request as many blocks as possible (2000). + +## getheaders2 + +_Added in protocol version 70223 of Dash Core._ + +The [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders2) requests a [`headers2` message](../reference/p2p-network-data-messages.md#headers2) that provides block headers starting from a particular point in the [block chain](../resources/glossary.md#block-chain). It allows a [peer](../resources/glossary.md#peer) which has been disconnected or started for the first time to get the [headers](../resources/glossary.md#header) it hasn’t seen yet. + +The [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders2) contains the same fields as the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders). + +## getmnlistd + +_Added in protocol version 70213_ + +The [`getmnlistd` message](../reference/p2p-network-data-messages.md#getmnlistd) requests a [`mnlistdiff` message](../reference/p2p-network-data-messages.md#mnlistdiff) that provides either: + + 1. A full [masternode](../resources/glossary.md#masternode) list (if `baseBlockHash` is all-zero) + 2. 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](../reference/p2p-network-data-messages.md#getmnlistd). (The message header has been omitted.) + +``` text +000001ee5108348a2c59396da29dc576 +9b2a9bb303d7577aee9cd95136c49b9b ........... Base block hash + +0000030f51f12e7069a7aa5f1bc9085d +db3fe368976296fd3b6d73fdaf898cc0 ........... Block hash +``` + +## getqrinfo + +_Added in protocol version 70222 of Dash Core._ + +The `getqrinfo` message requests a [`qrinfo` message](../reference/p2p-network-data-messages.md#qrinfo) that provides the information required to verify quorum details for quorums formed using the quorum rotation process. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | baseBlockHashesNb | uint32 | Required | Number of masternode lists the light client already knows (up to 4) +| Varies | baseBlockHashes | uint256[] | Required | Array of base block hashes for the masternode lists the light client already knows +| 32 | blockRequestHash | uint256 | Required | Hash of the block for which the masternode list diff is requested +| 1 | extraShare | bool | Optional | Flag to indicate if an extra share is requested | + +The following annotated hexdump shows a [`getqrinfo` message](../reference/p2p-network-data-messages.md#getqrinfo). (The message header has been omitted.) + +``` text +05 ................................. Number of base block hashes: 5 + + +cb6f9b4f2145f2e3fcf270737ad34d7e +51cdb9e98f2580927c52b35f62010000 ... Base block hash 1 +8cfa868eb5adfdfb6ae333b790980f2d +0737c64ccd716ce6b63969f481010000 ... Base block hash 2 +41e452b5187bc71a1e92c42c8e38f04b +8c83b12415f7a73b292f5c79c9000000 ... Base block hash 3 +0387850f96fb9888bb445cce15b56603 +019df551c246e237ff3a6107e8020000 ... Base block hash 4 +7ab87c8f16f60fdba20102d348a0af08 +2a6590759c6535aa48941e807e020000 ... Base block hash 5 + +d7b9d67da4a3016c62fcc37157032126 +46d11c2b3c533ccf9bb56f7540000000 ... Block request hash + +00 ................................. Extra share: false +``` + +## headers + +_Added in protocol version 31800 (of Bitcoin)._ + +The [`headers` message](../reference/p2p-network-data-messages.md#headers) sends block headers to a [node](../resources/glossary.md#node) which previously requested certain [headers](../resources/glossary.md#header) with a [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders). A headers message can be empty. + +| Bytes | Name | Data Type | Description +|----------|---------|------------------|----------------- +| _Varies_ | count | compactSize uint | Number of block headers up to a maximum of 2,000. Note: headers-first sync assumes the sending node will send the maximum number of headers whenever possible. +| _Varies_ | headers | block_header | Block headers: each 80-byte block header is in the format described in the [block headers section](../reference/block-chain-block-headers.md) with an additional 0x00 suffixed. This 0x00 is called the transaction count, but because the headers message doesn't include any transactions, the transaction count is always zero. + +The following annotated hexdump shows a [`headers` message](../reference/p2p-network-data-messages.md#headers). (The message header has been omitted.) + +``` text +01 ................................. Header count: 1 + +02000000 ........................... Block version: 2 +b6ff0b1b1680a2862a30ca44d346d9e8 +910d334beb48ca0c0000000000000000 ... Hash of previous block's header +9d10aa52ee949386ca9385695f04ede2 +70dda20810decd12bc9b048aaab31471 ... Merkle root +24d95a54 ........................... Unix time: 1415239972 +30c31b18 ........................... Target (bits) +fe9f0864 ........................... Nonce + +00 ................................. Transaction count (0x00) +``` + +## headers2 + +_Added in protocol version 70223 of Dash Core._ + +The [`headers2` message](../reference/p2p-network-data-messages.md#headers2) sends compressed block headers to a [node](../resources/glossary.md#node) which previously requested certain [headers](../resources/glossary.md#header) with a [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders) or indicated it wants to receive them by signaling with a [`sendheaders2` message](../reference/p2p-network-control-messages.md#sendheaders2). + +| Bytes | Name | Data Type | Description +|----------|---------|------------------|----------------- +| _Varies_ | count | compactSize uint | Number of block headers up to a maximum of 2,000. Note: headers-first sync assumes the sending node will send the maximum number of headers whenever possible. +| _Varies_ | headers | block_header2 | Block headers in the [`block_header2`](https://github.com/thephez/dips/blob/compressed-headers/compressed-headers.md#block_header2-data-type) format
**Note**: the first header will always be uncompressed. + +The following annotated hexdump shows a [`headers2` message](../reference/p2p-network-data-messages.md#headers2). (The message header has been omitted.) + +``` text +fdd007 ............................. Header count: 2000 (0x07d0) + +Header 1 (uncompressed) +| 38 ............................... Bitfield (0x00100110) +| 02000000 ......................... Block version +| 2cbcf83b62913d56f605c0e581a48872 +| 839428c92e5eb76cd7ad94bcaf0b0000 . Hash of previous block's header +| 7f11dcce14075520e8f74cc4ddf092b4 +| e26ebd23b8d8665a1ae5bfc41b58fdb4 . Merkle root +| c3a95e53 ......................... Unix time: 1398712771 +| ffff0f1e ......................... Target (bits) +| f37a0000 ......................... Nonce + +Header 2 (previous header and time compressed) +| 20 ............................... Bitfield (0x00100000) +| 02000000 ......................... Block version +| .................................. Hash of previous block's header (compressed) +| 4d29e4f9b2e05a9ac97dd5ae4128b3c0 +| 104bdc95aabaa566cc8eeb682e336d0d . Merkle root +| 0100 ............................. Unix time (compressed) +| f0ff0f1e ......................... Target (bits) +| 7b190000 ......................... Nonce + +Header 3 (block version, previous header, time, and bits compressed) +| 01 ............................... Bitfield (0x00000001) +| .................................. Block version (compressed) +| .................................. Hash of previous block's header (compressed) +| 58968247522cc488db01996de610d6f3 +| b8c348e748198dc528a305941211c71c . Merkle root +| 0200 ............................. Unix time (compressed) +| .................................. Target (bits) (compressed) +| 7b190000 ......................... Nonce + +... Remaining headers truncated +``` + +## inv + +The [`inv` message](../reference/p2p-network-data-messages.md#inv) (inventory message) transmits one or more [inventories](../resources/glossary.md#inventory) of objects known to the transmitting [peer](../resources/glossary.md#peer). It can be sent unsolicited to announce new [transactions](../resources/glossary.md#transaction) or [blocks](../resources/glossary.md#block), or it can be sent in reply to a [`getblocks` message](../reference/p2p-network-data-messages.md#getblocks) or [`mempool` message](../reference/p2p-network-data-messages.md#mempool). + +The receiving peer can compare the inventories from an [`inv` message](../reference/p2p-network-data-messages.md#inv) against the inventories it has already seen, and then use a follow-up message to request unseen objects. + +| Bytes | Name | Data Type | Description +|----------|-----------|-----------------------|----------------- +| _Varies_ | count | compactSize uint | The number of inventory entries. +| _Varies_ | inventory | inventory | One or more inventory entries up to a maximum of 50,000 entries. + +The following annotated hexdump shows an [`inv` message](../reference/p2p-network-data-messages.md#inv) with two inventory entries. (The message header has been omitted.) + +``` text +02 ................................. Count: 2 + +0f000000 ........................... Type: MSG_MASTERNODE_PING +dd6cc6c11211793b239c2e311f1496e2 +2281b200b35233eaae465d2aa3c9d537 ... Hash (mnp) + +05000000 ........................... Type: MSG_TXLOCK_VOTE +afc5b2f418f8c06c477a7d071240f5ee +ab17057f9ce4b50c2aef4fadf3729a2e ... Hash (txlvote) +``` + +## mempool + +_Added in protocol version 60002 (of Bitcoin)._ + +The [`mempool` message](../reference/p2p-network-data-messages.md#mempool) requests the [TXIDs](../resources/glossary.md#transaction-identifiers) of transactions that the receiving [node](../resources/glossary.md#node) has verified as valid but which have not yet appeared in a [block](../resources/glossary.md#block). That is, transactions which are in the receiving node's memory pool. The response to the [`mempool` message](../reference/p2p-network-data-messages.md#mempool) is one or more [`inv` messages](../reference/p2p-network-data-messages.md#inv) containing the TXIDs in the usual [inventory](../resources/glossary.md#inventory) format. + +Sending the [`mempool` message](../reference/p2p-network-data-messages.md#mempool) is mostly useful when a program first connects to the network. Full nodes can use it to quickly gather most or all of the unconfirmed transactions available on the network; this is especially useful for miners trying to gather transactions for their transaction fees. SPV clients can set a filter before sending a `mempool` to only receive transactions that match that filter; this allows a recently-started client to get most or all unconfirmed transactions related to its wallet. + +:::{note} +Dash Core 0.15.0 expanded the mempool message to include syncing of [InstantSend Lock](../reference/p2p-network-deprecated-messages.md#islock) inventories. Additionally, nodes now attempt to sync their mempool with peers at startup by default (limited to peers using protocol version 70216 or higher). This allows nodes to more quickly detect any double-spend attempts as well as show InstantSend lock status correctly for transactions received while offline. + +Dash Core 0.17.0 expanded the mempool message to include syncing of [ChainLock](../reference/p2p-network-instantsend-messages.md#clsig) inventories. This allows nodes to more quickly show ChainLock status correctly after being offline. +::: + +The `inv` response to the [`mempool` message](../reference/p2p-network-data-messages.md#mempool) is, at best, one node's view of the network---not a complete list of every [unconfirmed transaction](../resources/glossary.md#unconfirmed-transaction) on the network. Here are some additional reasons the list might not be complete: + +* The [`mempool` message](../reference/p2p-network-data-messages.md#mempool) is not currently fully compatible with the [`filterload` message](../reference/p2p-network-control-messages.md#filterload)'s `BLOOM_UPDATE_ALL` and `BLOOM_UPDATE_P2PUBKEY_ONLY` flags. Mempool transactions are not sorted like in-block transactions, so a transaction (tx2) spending an [output](../resources/glossary.md#output) can appear before the transaction (tx1) containing that output, which means the automatic filter update mechanism won't operate until the second-appearing transaction (tx1) is seen---missing the first-appearing transaction (tx2). It has been proposed in [Bitcoin Core issue #2381](https://github.com/bitcoin/bitcoin/issues/2381) that the transactions should be sorted before being processed by the filter. + +There is no payload in a [`mempool` message](../reference/p2p-network-data-messages.md#mempool). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. + +## merkleblock + +_Added in protocol version 70001 as described by BIP37._ + +The [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) is a reply to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) which requested a [block](../resources/glossary.md#block) using the inventory type `MSG_MERKLEBLOCK`. It is only part of the reply: if any matching transactions are found, they will be sent separately as [`tx` messages](../reference/p2p-network-data-messages.md#tx). As of Dash Core 18.0.0 [`isdlock` messages](../reference/p2p-network-instantsend-messages.md#isdlock) for matching transactions are sent if present. + +:::{note} +The `isdlock` messages are currently dropped once a ChainLock is present so in most cases they will not actually be provided in response to a merkleblock request. Future updates may modify this behavior. +::: + +If a filter has been previously set with the [`filterload` message](../reference/p2p-network-control-messages.md#filterload), the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) will contain the [TXIDs](../resources/glossary.md#transaction-identifiers) of any transactions in the requested block that matched the filter, as well as any parts of the block's [merkle tree](../resources/glossary.md#merkle-tree) necessary to connect those transactions to the block header's [merkle root](../resources/glossary.md#merkle-root). The message also contains a complete copy of the [block header](../resources/glossary.md#block-header) to allow the client to hash it and confirm its [proof of work](../resources/glossary.md#proof-of-work). + +| Bytes | Name | Data Type | Description +|----------|--------------------|------------------|---------------- +| 80 | block header | block_header | The block header in the format described in the [block header section](../reference/block-chain-block-headers.md). +| 4 | transaction count | uint32_t | The number of transactions in the block (including ones that don't match the filter). +| _Varies_ | hash count | compactSize uint | The number of hashes in the following field. +| _Varies_ | hashes | char[32] | One or more hashes of both transactions and merkle nodes in internal byte order. Each hash is 32 bytes. +| _Varies_ | flag byte count | compactSize uint | The number of flag bytes in the following field. +| _Varies_ | flags | byte[] | A sequence of bits packed eight in a byte with the least significant bit first. May be padded to the nearest byte boundary but must not contain any more bits than that. Used to assign the hashes to particular nodes in the merkle tree as described below. + +The annotated hexdump below shows a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) which corresponds to the examples below. (The message header has been omitted.) + +``` text +01000000 ........................... Block version: 1 +82bb869cf3a793432a66e826e05a6fc3 +7469f8efb7421dc88067010000000000 ... Hash of previous block's header +7f16c5962e8bd963659c793ce370d95f +093bc7e367117b3c30c1f8fdd0d97287 ... Merkle root +76381b4d ........................... Time: 1293629558 +4c86041b ........................... nBits: 0x04864c * 256**(0x1b-3) +554b8529 ........................... Nonce + +07000000 ........................... Transaction count: 7 +04 ................................. Hash count: 4 + +3612262624047ee87660be1a707519a4 +43b1c1ce3d248cbfc6c15870f6c5daa2 ... Hash #1 +019f5b01d4195ecbc9398fbf3c3b1fa9 +bb3183301d7a1fb3bd174fcfa40a2b65 ... Hash #2 +41ed70551dd7e841883ab8f0b16bf041 +76b7d1480e4f0af9f3d4c3595768d068 ... Hash #3 +20d2a7bc994987302e5b1ac80fc425fe +25f8b63169ea78e68fbaaefa59379bbf ... Hash #4 + +01 ................................. Flag bytes: 1 +1d ................................. Flags: 1 0 1 1 1 0 0 0 +``` + +Note: when fully decoded, the above [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) provided the TXID for a single transaction that matched the filter. In the [network](../resources/glossary.md#network) traffic dump this output was taken from, the full transaction belonging to that TXID was sent immediately after the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) as a [`tx` message](../reference/p2p-network-data-messages.md#tx). + +### Parsing A MerkleBlock Message + +As seen in the annotated hexdump above, the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) provides three special data types: a transaction count, a list of hashes, and a list of one-bit flags. + +You can use the transaction count to construct an empty [merkle tree](../resources/glossary.md#merkle-tree). We'll call each entry in the tree a node; on the bottom are TXID nodes---the hashes for these nodes are [TXIDs](../resources/glossary.md#transaction-identifiers); the remaining nodes (including the [merkle root](../resources/glossary.md#merkle-root)) are non-TXID nodes---they may actually have the same hash as a TXID, but we treat them differently. + +![Example Of Parsing A MerkleBlock Message](../../img/dev/animated-en-merkleblock-parsing.gif) + +Keep the hashes and flags in the order they appear in the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock). When we say "next flag" or "next hash", we mean the next flag or hash on the list, even if it's the first one we've used so far. + +Start with the merkle root node and the first flag. The table below describes how to evaluate a flag based on whether the node being processed is a TXID node or a non-TXID node. Once you apply a flag to a node, never apply another flag to that same node or reuse that same flag again. + +| Flag | TXID Node | Non-TXID Node +|-------|------------------------------------------------------------------------------------------|---- +| **0** | Use the next hash as this node's TXID, but this transaction didn't match the filter. | Use the next hash as this node's hash. Don't process any descendant nodes. +| **1** | Use the next hash as this node's TXID, and mark this transaction as matching the filter. | The hash needs to be computed. Process the left child node to get its hash; process the right child node to get its hash; then concatenate the two hashes as 64 raw bytes and hash them to get this node's hash. + +Any time you begin processing a node for the first time, evaluate the next flag. Never use a flag at any other time. + +When processing a child node, you may need to process its children (the grandchildren of the original node) or further-descended nodes before returning to the parent node. This is expected---keep processing depth first until you reach a TXID node or a non-TXID node with a flag of 0. + +After you process a TXID node or a non-TXID node with a flag of 0, stop processing flags and begin to ascend the tree. As you ascend, compute the hash of any nodes for which you now have both child hashes or for which you now have the sole child hash. See the [merkle tree section](../reference/block-chain-block-headers.md#merkle-trees) for hashing instructions. If you reach a node where only the left hash is known, descend into its right child (if present) and further descendants as necessary. + +However, if you find a node whose left and right children both have the same hash, fail. This is related to CVE-2012-2459. + +Continue descending and ascending until you have enough information to obtain the hash of the merkle root node. If you run out of flags or hashes before that condition is reached, fail. Then perform the following checks (order doesn't matter): + +* Fail if there are unused hashes in the hashes list. + +* Fail if there are unused flag bits---except for the minimum number of bits necessary to pad up to the next full byte. + +* Fail if the hash of the merkle root node is not identical to the merkle root in the [block header](../resources/glossary.md#block-header). + +* Fail if the block header is invalid. Remember to ensure that the hash of the header is less than or equal to the [target threshold](../resources/glossary.md#target) encoded by the nBits header field. Your program should also, of course, attempt to ensure the header belongs to the best block chain and that the user knows how many confirmations this block has. + +For a detailed example of parsing a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock), please see the corresponding [merkle block examples section](../examples/p2p-network-parsing-a-merkleblock.md). + +### Creating A MerkleBlock Message + +It's easier to understand how to create a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) after you understand how to parse an already-created message, so we recommend you read the parsing section above first. + +Create a complete merkle tree with [TXIDs](../resources/glossary.md#transaction-identifiers) on the bottom row and all the other hashes calculated up to the [merkle root](../resources/glossary.md#merkle-root) on the top row. For each transaction that matches the filter, track its TXID node and all of its ancestor nodes. + +![Example Of Creating A MerkleBlock Message](../../img/dev/animated-en-merkleblock-creation.gif) + +Start processing the tree with the [merkle root](../resources/glossary.md#merkle-root) node. The table below describes how to process both TXID nodes and non-TXID nodes based on whether the node is a match, a match ancestor, or neither a match nor a match ancestor. + +| | TXID Node | Non-TXID Node +|--------------------------------------|------------------------------------------------------------------------|---- +| **Neither Match Nor Match Ancestor** | Append a 0 to the flag list; append this node's TXID to the hash list. | Append a 0 to the flag list; append this node's hash to the hash list. Do not descend into its child nodes. +| **Match Or Match Ancestor** | Append a 1 to the flag list; append this node's TXID to the hash list. | Append a 1 to the flag list; process the left child node. Then, if the node has a right child, process the right child. Do not append a hash to the hash list for this node. + +Any time you begin processing a node for the first time, a flag should be appended to the flag list. Never put a flag on the list at any other time, except when processing is complete to pad out the flag list to a byte boundary. + +When processing a child node, you may need to process its children (the grandchildren of the original node) or further-descended nodes before returning to the parent node. This is expected---keep processing depth first until you reach a TXID node or a node which is neither a TXID nor a match ancestor. + +After you process a TXID node or a node which is neither a TXID nor a match ancestor, stop processing and begin to ascend the tree until you find a node with a right child you haven't processed yet. Descend into that right child and process it. + +After you fully process the merkle root node according to the instructions in the table above, processing is complete. Pad your flag list to a byte boundary and construct the [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock) using the template near the beginning of this subsection. + +## mnlistdiff + +_Added in protocol version 70213_ + +The [`mnlistdiff` message](../reference/p2p-network-data-messages.md#mnlistdiff) is a reply to a [`getmnlistd` message](../reference/p2p-network-data-messages.md#getmnlistd) which requested either a full [masternode](../resources/glossary.md#masternode) list or a diff for a range of [blocks](../resources/glossary.md#block). + +| Bytes | Name | Data
type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 2 | version | uint16_t | Required | **_Updated in protocol version 70229_**
Version of the message (currently `1`).
In protocol versions 70225 through 70228 this field was located between the `cbTx` and `deletedMNsCount` fields. | +| 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 | merkleHashes
Count | compactSize uint | Required | Number of Merkle hashes +| variable | merkleHashes | vector | Required | Merkle hashes in depth-first order +| 1-9 | merkleFlags
Count | 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` +| 1-9 | deletedMNsCount | compactSize uint | Required | Number of ProRegTx hashes which were deleted after baseBlockHash +| variable | deletedMNs | vector | Required | A list of ProRegTx hashes for masternode which were deleted after `baseBlockHash` +| 1-9 | mnCount | compactSize uint | Required | Number of SML entries which were added or updated since baseBlockHash +| variable | mnList | vector | Required | The list of Simplified Masternode List (SML) entries which were added or updated since `baseBlockHash` +| 1-9 | deletedQuorums
Count | compactSize uint | Required | _Added in protocol version 70214_

Number of LLMQs which were deleted from the active set after `baseBlockHash` | +| variable | deletedQuorums | (uint8_t+uint256)[] | Required | _Added in protocol version 70214_

A list of LLMQ type and quorum hashes for LLMQs which were deleted after `baseBlockHash` | +| 1-9 | newQuorumsCount | compactSize uint | Required | _Added in protocol version 70214_

Number of new LLMQs which were added to the active set since `baseBlockHash` | +| variable | newQuorums | qfcommit[] | Required | _Added in protocol version 70214_

The list of LLMQ commitments for the LLMQs which were added since `baseBlockHash` | +| 1-9 | quorumsCLSigsCount | compactSize uint | Required | _Added in protocol version 70230_

Number of `quorumsCLSigs` elements | +| variable | quorumsCLSigs | quorumsCLSigsObject[] | Required | _Added in protocol version 70230_

ChainLock signature used to calculate members per quorum indexes (in `newQuorums`) | + +Simplified Masternode List (SML) Entry + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | nVersion | uint_16 | **_Added in protocol version 70228_**
The version of the simplified masternode list +| 32 | proRegTxHash | uint256 | The hash of the ProRegTx that identifies the masternode +| 32 | confirmedHash | uint256 | The hash of the block at which the masternode got confirmed +| 16 | ipAddress | byte[] | IPv6 address in network byte order. Only IPv4 mapped addresses are allowed (to be extended in the future) +| 2 | port | uint_16 | Port (network byte order) +| 48 | pubKeyOperator | BLSPubKey | The operator public key
**Note**: serialization varies based on `nVersion`:
- 1 - legacy BLS scheme
- 2 - basic BLS scheme +| 20 |keyIDVoting | CKeyID | The public key hash used for voting. +| 1 | isValid | bool | True if a masternode is not PoSe-banned +| 0 or 2 | type | uint_16 | Masternode type:
0 - regular masternode
1 - Evolution masternode
**Note**: Only present after the Dash v19.0.0 hard fork. | +| 0 or 2 | platformHTTPPort | uint_16 | TCP port of Platform HTTP/API interface (network byte order).
**Note**: Only present when mnlistdiff `version` is 2 and `type` is 1. | +0 or 20 | platformNodeID | byte[] | Dash Platform P2P node ID, derived from P2P public key.
**Note**: Only present when mnlistdiff `version` is 2 and `type` is 1. | + +The content of `quorumsCLSigsObject`: + +| Bytes | Name | Data type | Description | +| - | - | - | - | +| 96 | signature | BLSSig | ChainLock signature | +| 1-9 | indexSetCount | compactSize uint | Number of quorum indexes using the same `signature` for their member calculation | +| uint16_t[] | indexSet | variable | Quorum indexes corresponding in `newQuorums` using `signature` for their member calculation | + +The following annotated hexdump shows a Dash Core v20.0 [`mnlistdiff` +message](../reference/p2p-network-data-messages.md#mnlistdiff). (The message header has been +omitted.) + +``` text Dash v20.0.0 mnlistdiff +0100 ....................................... Message version (1) + +de524e1b726ad0d574a15206c24db7cd +6f4d293b3f1c65f3b11523a988020000 ........... Base block hash + +4d25794f4e7601e349077d52138c12d3 +7761061e83b38426763646d269000000 ........... Block hash + +0b000000 ................................... Transactions: 11 + +05 ......................................... Merkle hash count: 5 + +a7d9e339ce9f4671c0d16cbfea4acaa5 +43cf96f52145b18b447f386cbf7abd4f ........... Merkle hash 1 +c71dd34648a0b7040f33b39823f90a96 +80f1108d1f07fde1f385d5a91ee1e487 ........... Merkle hash 2 +20ec215cf0420a0c5d3e894dc8c49d64 +49ab46f1be37d2c7d4a2fed84706d33d ........... Merkle hash 3 +51b0c2dbf57f45eb5d6a1341c6ceb199 +d4cbf6a63d892a69364a4d254c120f20 ........... Merkle hash 4 +72c3210f840aa0d827d63d98456dabf4 +2906d0715214735871178b12af8a6eda ........... Merkle hash 5 + + +02 ......................................... Merkle flag count: 2 +1f ......................................... Flags: 0 0 0 1 1 1 1 1 +00 ......................................... Flags: 0 0 0 0 0 0 0 0 + +[...]....................................... Coinbase Tx (Not shown) + +00 ......................................... Deleted masternodes: 0 + +00 ......................................... Masternode list entries: 0 + +03 ......................................... Deleted quorums: 3 + +Deleted quorums +| 01 ....................................... Quorum type (1) +| e8d70272cb891e97e8302c41e6d72ca0 +| c0743624b6797d85bebbc5d311000000 ......... Quorum hash +| +| 04 ....................................... Quorum type (4) +| 16c6383a1fc5a765bd93674c5b9b47cf +| e199589c4258e7b259464e4fea000000 ......... Quorum hash +| +| 06 ....................................... Quorum type (6) +| e8d70272cb891e97e8302c41e6d72ca0 +| c0743624b6797d85bebbc5d311000000 ......... Quorum hash + +03 ......................................... New quorums: 3 + +New quorums +| Quorum 1 +| | 0300 ................................... Version (3) +| | +| | 01 ..................................... Quorum type (1) +| | 05beb3edd9207ede3a42a15bbd04d597 +| | 744f6f9db9b9a68a025c7e5637000000........ Quorum hash +| | +| | 32 ..................................... Signers (50) +| | ffffffffffff03 ......................... Signers bitvector +| | +| | 32 ..................................... Valid members (50) +| | ffffffffffff03 ......................... Valid members bitvector +| | +| | 91e6dfd0d8f33e4306afe0483d7649cc +| | 68b5346f5c658206269083d49d2f1db7 +| | 8eedd22eecf748404a1fe12e24f074e1 ....... Quorum public key (BLS) +| | +| | bc7da59621015e70e31310982e66acfe +| | 25468daede7142234e7f3bf3b3297b21 ....... Quorum verification vector hash +| | +| | Quorum threshold signature (BLS) +| | 99f4d8af79cf99ba49c8c9295cbc0827 +| | b2b6611a905dc347eec9ecbe6ec6ec64 +| | c167ca252f2fc0ff772394c696c58f0c +| | 0e00c4f556ab528e07d06d2e57391fd1 +| | 0c57e0521e43f8dfcfc8448665d41eba +| | 7c103b915506476672b531b9ceca266f ....... BLS signature +| | +| | Aggregated signatures from all commitments (BLS) +| | 8f7bb2a10d4cbf6fe7c6cfc1ec52817f +| | 97f025ba9c4c52ac4cfa02ba1c28f3aa +| | fb83c2f4b246f730b5e4aac36e9479d5 +| | 0d72db9055dbdc9e2c27dee6f876be66 +| | 928abbdf636d1405c59a5e35d4775049 +| | 97f0e3b5acd2c53448deaaf61fed9343 ....... BLS signature +| +| [...] .................................... Remaining quorums truncated + +01 ......................................... ChainLock signature count +ChainLock signature object +| ae1ccf19235d06ae370f3538796525c1 +| d8e404252b0a91109c031d60f7d0c740 +| 7e5678b1ea4792ff32fffdafb061bf1d +| 0c7a53afa399e203719e73cee1c0640d +| ca24fb16f6950f7aba1b655f7fa195d8 +| 0476e65b987bc51689d7946680b04dcf ......... ChainLock signature +| +| 03 ....................................... Index set count (3) +| +| Index set +| | 0000 ................................... Quorum index (0) +| | 0100 ................................... Quorum index (1) +| | 0200 ................................... Quorum index (2) +``` + +## notfound + +_Added in protocol version 70001._ + +The [`notfound` message](../reference/p2p-network-data-messages.md#notfound) is a reply to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) which requested an object the receiving [node](../resources/glossary.md#node) does not have available for relay. (Nodes are not expected to relay historic transactions which are no longer in the memory pool or relay set. Nodes may also have pruned spent transactions from older [blocks](../resources/glossary.md#block), making them unable to send those blocks.) + +The format and maximum size limitations of the [`notfound` message](../reference/p2p-network-data-messages.md#notfound) are identical to the [`inv` message](../reference/p2p-network-data-messages.md#inv); only the message header differs. + +## qrinfo + +_Added in protocol version 70222 of Dash Core._ + +The `qrinfo` message sends quorum rotation information to a node which previously requested it with a [`getqrinfo` message](../reference/p2p-network-data-messages.md#getqrinfo). + +Note: In the following fields, `c` refers to the quorum cycle length. This is synonymous with the DKG interval (`quorumDkgInterval`) as defined in [DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#parametersvariables-of-a-llmq-and-dkg). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| Varies | quorumSnapshot
AtHMinusC | CQuorumSnapshot | Required | Quorum snapshot for height `h-c` +| Varies | quorumSnapshot
AtHMinus2C | CQuorumSnapshot | Required | Quorum snapshot for height `h-2c` +| Varies | quorumSnapshot
AtHMinus3C | CQuorumSnapshot | Required | Quorum snapshot for height `h-3c` +| Varies | mnListDiffTip | CSimplifiedMNListDiff
(see [`mnlistdiff`](#mnlistdiff)) | Required | Masternode list diff at height at the tip. +| Varies | mnListDiffH | CSimplifiedMNListDiff
(see [`mnlistdiff`](#mnlistdiff)) | Required | Masternode list diff at height `h`. +| Varies | mnListDiff
AtHMinusC | CSimplifiedMNListDiff
(see [`mnlistdiff`](#mnlistdiff)) | Required | Masternode list diff at height `h-c` +| Varies | mnListDiff
AtHMinus2C | CSimplifiedMNListDiff
(see [`mnlistdiff`](#mnlistdiff)) | Required | Masternode list diff at height `h-2c` +| Varies | mnListDiff
AtHMinus3C | CSimplifiedMNListDiff
(see [`mnlistdiff`](#mnlistdiff)) | Required | Masternode list diff at height `h-3c` +| 1 | extraShare | bool | Required | Flag to indicate if an extra share is requested | +| Varies | quorumSnapshot
AtHMinus4C | CQuorumSnapshot | Optional | Returned only if `extraShare` is on. See below for sub-message contents. | +| Varies | mnListDiff
AtHMinus4C | CSimplifiedMNListDiff | Optional | Returned only if `extraShare` is on. As in DIP-4. +| 1-9 | lastQuorumHashPer
IndexSize | compactSize uint | Required | Number of elements in `lastCommitmentPerIndex` +| 32 * `lastQuorum`
`HashPer`
`IndexSize` | lastCommitment
PerIndex | uint256_t[] | Required | Contains the most recent commitment for each quorumIndex. Ordered by quorumIndex. +| 1-9 | quorumSnapshot
ListSize | compactSize uint | Required | Number of elements in `quorumSnapshotList` +| Varies | quorumSnapshot
List | CQuorumSnapshot[] | Required | The snapshots required to reconstruct the quorums built at `h` in heightsLists. Ordered from oldest to newest +| 1-9 | mnListDiff
ListSize | compactSize uint | Required | Number of elements in `mnListDiffList` +| Varies | mnListDiffList | CSimplifiedMNListDiff[] | Required | The MNLISTDIFFs required to calculate older quorums. Ordered from oldest to newest + +**CQuorumSnapshot** + +Note: All fields are required + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | --------- | -------- | +| 4 | mnSkipListMode | int32_t | Mode of the skip list +| 1-9 | activeQuorum
MembersSize | compactSize uint | Number of elements in `activeQuorumMembers` +| (`activeQuorum`
`MembersSize`) + 7)/8 | activeQuorumMembers | cbitset | The bitset of nodes already in quarters at the start of cycle at height n +| 1-9 | mnSkipListSize | compactSize uint | Number of elements in mnSkipList +| 4 * `mnSkipListSize` | mnSkipList | int32_t[] | Skiplist at height n + +The following annotated hexdump shows a [`qrinfo` message](../reference/p2p-network-data-messages.md#qrinfo). (The message header has been omitted.) + +``` text +Quorum snapshot (h-c) +| 01000000 ................................. Skiplist mode: 1 +| 1f ....................................... Active quorum members: 31 +| bbffff7f ................................. Active quorum members bitset +| +| 01 ....................................... Skip list size: 1 +| +| Skip list +| | 0b000000 ............................... Masternode 11 + +Quorum snapshot (h-2c) +| 01000000 ................................. Skiplist mode: 1 +| 1f ....................................... Active quorum members: 31 +| f3ff6f7b ................................. Active quorum members bitset +| +| 06 ....................................... Skip list size: 6 +| +| Skip list +| | 05000000 ............................... Masternode 5 +| | 03000000 ............................... Masternode 3 +| | 04000000 ............................... Masternode 4 +| | 06000000 ............................... Masternode 6 +| | 07000000 ............................... Masternode 7 +| | 08000000 ............................... Masternode 8 + +Quorum snapshot (h-3c) ..................... Not shown for brevity + +MnListDiff (Tip) +| e173b01943fe7b8d2bf5a13c034eafed +| d2708a1a0f9e5104b86439382e050000 ......... Base block hash +| 847b42ae4509c82e8c8ba599f23f15c1 +| e34c899a09e4ebf440f6e2ef4b000000 ......... Block hash +| 01000000 ................................. Transactions: 1 +| 01 ....................................... Merkle hash count: 1 +| c44c59fd87c816506d3890aaf0c8f7df +| bad10f4a9b3e2b43bc1e9c832e81b381 ......... Merkle hash 1 +| 01 ....................................... Merkle flag count: 1 +| 01 ....................................... Flags: 0 0 0 0 0 0 0 1 +| +| [...]..................................... Coinbase Tx (Not shown) + +MnListDiff (h) ............................. Not shown for brevity +MnListDiff (h-c) ........................... Not shown for brevity +MnListDiff (h-2c) .......................... Not shown for brevity +MnListDiff (h-3c) .......................... Not shown for brevity + +01 ....................................... Extra share: true + +Quorum snapshot (h-4c) +| 01000000 ................................. Skiplist mode: 1 +| 1f ....................................... Active quorum members: 31 +| ff7fdd5f ................................. Active quorum members bitset +| +| 01 ....................................... Skip list size: 1 +| +| Skip list +| | 07000000 ............................... Masternode 7 + +MnListDiff (h-4c) + +Last quorum hash per index +| 04 ....................................... Quorum hashes: 4 +| c2e276c518b3f8484b237e300094e222 +| 388a095f486c822585a67b1520010000 ......... Quorum hash 1 +| bb4f0c5a3efb229bd5a4e4e45ca2228e +| b11f05c3a6e8fdf9d7d4f499b7010000 ......... Quorum hash 2 +| aca22eb2c63daa5304cb9cbe6089afe3 +| 99e335f73306735718355ad3d9000000 ......... Quorum hash 3 +| 45bf29bada522857d6e3b2371e1fefc7 +| c01fcef0b6578e7062fd571760010000 ......... Quorum hash 4 + +00 ......................................... Quorum snapshot list size: 0 +00 ......................................... Masternode list diff list size: 0 +``` + +## tx + +The [`tx` message](../reference/p2p-network-data-messages.md#tx) transmits a single transaction in the [raw transaction](../resources/glossary.md#raw-transaction) format. It can be sent in a variety of situations; + +* **Transaction Response:** Dash Core will send it in response to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) that requests the transaction with an [inventory](../resources/glossary.md#inventory) type of `MSG_TX`. + +* **MerkleBlock Response:** Dash Core will send it in response to a [`getdata` message](../reference/p2p-network-data-messages.md#getdata) that requests a [merkle block](../resources/glossary.md#merkle-block) with an [inventory](../resources/glossary.md#inventory) type of `MSG_MERKLEBLOCK`. (This is in addition to sending a [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock).) Each [`tx` message](../reference/p2p-network-data-messages.md#tx) in this case provides a matched transaction from that [block](../resources/glossary.md#block). + +For an example hexdump of the raw transaction format, see the [raw transaction section](../reference/transactions-raw-transaction-format.md). diff --git a/docs/core/reference/p2p-network-deprecated-messages.md b/docs/core/reference/p2p-network-deprecated-messages.md new file mode 100644 index 000000000..4178e4a9c --- /dev/null +++ b/docs/core/reference/p2p-network-deprecated-messages.md @@ -0,0 +1,119 @@ +# Deprecated Messages + +The following network messages have been recently deprecated and should no longer be used. To see +network messages removed longer ago, please see the [previous version of +documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/reference/p2p-network-deprecated-messages.html). + +## islock + +:::{deprecated} 20.1.0 +Dash protocol version 70231 removed support for non-deterministic InstantSend. The [`isdlock` message](../reference/p2p-network-instantsend-messages.md#isdlock) with expanded features replaced this message. +::: + +The [`islock` message](../reference/p2p-network-deprecated-messages.md#islock) is used to provide details of transactions that have been locked by LLMQ-based InstantSend. The message includes the details of all transaction [inputs](../resources/glossary.md#input) along with the transaction ID and the BLS [signature](../resources/glossary.md#signature) of the [LLMQ](../resources/glossary.md#long-living-masternode-quorum) that approved the transaction lock. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1-9 | inputsSize | compactSize uint | Number of inputs | +| 36 * `inputsSize`| inputs | COutPoint | Outpoints used in the transaction | +| 32 | txid | uint256 | TXID of the locked transaction | +| 96 | sig | byte[] | LLMQ BLS Signature | + +The following annotated hexdump shows a [`islock` message](../reference/p2p-network-deprecated-messages.md#islock). (The message header has been omitted.) + +``` text +02 ......................................... Number of inputs: 2 + +Input 1 +| 05f24f65a9d98ff543ba61f7f0ce9448 +| 79632bf2517540a5bd8bde2fe8e94617 ......... Previous outpoint TXID +| 00000000 ................................. Previous outpoint index: 0 + +Input 2 +| 05f24f65a9d98ff543ba61f7f0ce9448 +| 79632bf2517540a5bd8bde2fe8e94617 ......... Previous outpoint TXID +| 01000000 ................................. Previous outpoint index: 1 + +e2e1c797576d8b13c83e929684b9aacd +553c20a34e2d11e38bdcaaf8e1de1680 ........... TXID + +0f055c2064885d446f83d51b9bb09892 +7ea0375a0f6a3f3402abf158ece67e00 +81049b8a8f45d254b64574cef194ef31 +197e450fba1196d652f2e1421d3b80ae +f429c10eabd4ab9289e9a8f80f6989b7 +a11e5e7930deccc3e11a931fc9524f06 ........... LLMQ BLS Signature (96 bytes) +``` + +## reject + +:::{deprecated} 19.0.0 +::: + +*Added in protocol version 70002 as described by BIP61.* + +The [`reject` message](#reject) informs the receiving [node](../resources/glossary.md#node) that one of its previous messages has been rejected. + +| Bytes | Name | Data Type | Description +|----------|---------------|------------------|-------------- +| *Varies* | message bytes | compactSize uint | The number of bytes in the following message field. +| *Varies* | message | string | The type of message rejected as ASCII text *without null padding*. For example: "tx", "block", or "version". +| 1 | code | char | The reject message code. See the table below. +| *Varies* | reason bytes | compactSize uint | The number of bytes in the following reason field. May be 0x00 if a text reason isn't provided. +| *Varies* | reason | string | The reason for the rejection in ASCII text. This should not be displayed to the user; it is only for debugging purposes. +| *Varies* | extra data | *varies* | Optional additional data provided with the rejection. For example, most rejections of [`tx` messages](../reference/p2p-network-data-messages.md#tx) or [`block` messages](../reference/p2p-network-data-messages.md#block) include the hash of the rejected transaction or block header. See the code table below. + +The following table lists message reject codes. Codes are tied to the type of message they reply to; for example there is a 0x10 reject code for transactions and a 0x10 reject code for blocks. + +| Code | In Reply To | Extra Bytes | Extra Type | Description +|------|-------------------|-------------|------------|---------------- +| 0x01 | *any message* | 0 | N/A | Message could not be decoded. Be careful of [`reject` message](#reject) feedback loops where two peers each don't understand each other's [`reject` messages](#reject) and so keep sending them back and forth forever. +| 0x10 | [`block` message](../reference/p2p-network-data-messages.md#block) | 32 | char[32] | Block is invalid for some reason (invalid proof-of-work, invalid signature, etc). Extra data may include the rejected block's header hash. +| 0x10 | [`tx` message](../reference/p2p-network-data-messages.md#tx) | 32 | char[32] | Transaction is invalid for some reason (invalid signature, output value greater than input, etc.). Extra data may include the rejected transaction's TXID. +| 0x10 | `ix` message | 32 | char[32] | InstantSend transaction is invalid for some reason (invalid tx lock request, conflicting tx lock request, etc.). Extra data may include the rejected transaction's TXID. +| 0x11 | [`block` message](../reference/p2p-network-data-messages.md#block) | 32 | char[32] | The block uses a version that is no longer supported. Extra data may include the rejected block's header hash. +| 0x11 | [`version` message](../reference/p2p-network-control-messages.md#version) | 0 | N/A | Connecting node is using a protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | 0 | N/A | Connecting node is using a CoinJoin protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) | 0 | N/A | Connecting node is using a governance protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`govobj` message](../reference/p2p-network-governance-messages.md#govobj) | 0 | N/A | Connecting node is using a governance protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote) | 0 | N/A | Connecting node is using a governance protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | `mnget` message | 0 | N/A | Connecting node is using a masternode payment protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | `mnw` message | 0 | N/A | Connecting node is using a masternode payment protocol version that the rejecting node considers obsolete and unsupported. +| 0x11 | `txlvote` message | 0 | N/A | Connecting node is using an InstantSend protocol version that the rejecting node considers obsolete and unsupported. +| 0x12 | [`tx` message](../reference/p2p-network-data-messages.md#tx) | 32 | char[32] | Duplicate input spend (double spend): the rejected transaction spends the same input as a previously-received transaction. Extra data may include the rejected transaction's TXID. +| 0x12 | [`version` message](../reference/p2p-network-control-messages.md#version) | 0 | N/A | More than one [`version` message](../reference/p2p-network-control-messages.md#version) received in this connection. +| 0x40 | [`tx` message](../reference/p2p-network-data-messages.md#tx) | 32 | char[32] | The transaction will not be mined or relayed because the rejecting node considers it non-standard---a transaction type or version unknown by the server. Extra data may include the rejected transaction's TXID. +| 0x41 | [`tx` message](../reference/p2p-network-data-messages.md#tx) | 32 | char[32] | One or more output amounts are below the dust threshold. Extra data may include the rejected transaction's TXID. +| 0x42 | [`tx` message](../reference/p2p-network-data-messages.md#tx) | | char[32] | The transaction did not have a large enough fee or priority to be relayed or mined. Extra data may include the rejected transaction's TXID. +| 0x43 | [`block` message](../reference/p2p-network-data-messages.md#block) | 32 | char[32] | The block belongs to a block chain which is not the same block chain as provided by a compiled-in checkpoint. Extra data may include the rejected block's header hash. + +Reject Codes + +| Code | Description +|------|-------------- +| 0x01 | Malformed +| 0x10 | Invalid +| 0x11 | Obsolete +| 0x12 | Duplicate +| 0x40 | Non-standard +| 0x41 | Dust +| 0x42 | Insufficient fee +| 0x43 | Checkpoint + +The annotated hexdump below shows a [`reject` message](#reject). (The message header has been omitted.) + +``` text +02 ................................. Number of bytes in message: 2 +7478 ............................... Type of message rejected: tx +12 ................................. Reject code: 0x12 (duplicate) +15 ................................. Number of bytes in reason: 21 +6261642d74786e732d696e707574732d +7370656e74 ......................... Reason: bad-txns-inputs-spent +394715fcab51093be7bfca5a31005972 +947baf86a31017939575fb2354222821 ... TXID +``` diff --git a/docs/core/reference/p2p-network-governance-messages.md b/docs/core/reference/p2p-network-governance-messages.md new file mode 100644 index 000000000..799a7e8cb --- /dev/null +++ b/docs/core/reference/p2p-network-governance-messages.md @@ -0,0 +1,176 @@ +```{eval-rst} +.. meta:: + :title: Governance Messages + :description: The network messages in this section facilitate the implementation of Dash's built-in Governance features. +``` + +# Governance Messages + +The following [network](../resources/glossary.md#network) messages enable the Governance features built in to Dash. For additional details on the governance system, see this [Budget System page](https://docs.dash.org/en/stable/governance/index.html). + +![Overview Of P2P Protocol Governance Request And Reply Messages](../../img/dev/en-p2p-governance-messages.svg) + +For additional details, refer to the Developer Guide [Governance section](../guide/dash-features-governance.md). + +## govobj + +The [`govobj` message](../reference/p2p-network-governance-messages.md#govobj) contains a governance object that is generally a proposal, contract, or setting. [Masternodes](../resources/glossary.md#masternode) ignore this request if they are not fully synced. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 32 | nHashParent | uint256 | Required | Parent object (a hash of all zeros here indicates this is the root object, not a child object). +| 4 | nRevision | int | Required | Object revision in the system +| 8 | nTime | int64_t | Required | Time which this object was created +| 32 | nCollateralHash | uint256 | Required* | Hash of the collateral fee transaction for proposals.

Set to all zeros for Triggers. +| 0-16384 | strData | string | Required | Data field - can be used for anything (leading varint indicates size of data) +| 4 | nObjectType | int | Required | Type of governance object:
• `0` - Unknown
• `1` - Proposal
• `2` - Trigger +| 36 | masternode
OutPoint | outPoint | Required* | The unspent outpoint of the masternode (holding 1000 DASH) which is signing this object.

Set to all zeros for proposals since they can be created by non-masternodes. +| 97 | vchSig | char | Required* | BLS Signature of the masternode (Length (1 byte) + Signature (96 bytes))
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation

Not required for proposals - they will have a length of 0x00 and no Signature. + +Governance Object Types (defined by `src/governance-object.h`) + +| Type | Name | Description +|------|-------------------------|------------ +| 0 | `GOVERNANCE_OBJECT_UNKNOWN` | +| 1 | `GOVERNANCE_OBJECT_PROPOSAL` | Submitted proposal (requires a collateral transaction - 1 Dash) +| 2 | `GOVERNANCE_OBJECT_TRIGGER` | Masternode generated. Removed after activation/execution. Used for superblocks. + +The following annotated hexdump shows a [`govobj` message](../reference/p2p-network-governance-messages.md#govobj) for a Proposal object. Notice the presence of a non-zero collateral hash, a masternodeOutPoint that is an empty Outpoint (hash of all zeros), and no vchSig. (The message header has been omitted.) + +``` text +00000000000000000000000000000000 +00000000000000000000000000000000 ..... Parent Hash (0 = root) +01000000 ............................. Revision: 1 +c8dfd65900000000 ..................... Create timestamp: 2017-10-06 01:43:31 UTC +633611d2f3e7481325242f200c7f3485 +e3a9b4b6301e7f7d18d87d8231f3880b ..... Collateral Hash + +Data +| 3e02 ............................... Data length: 574 +| 356235623232373 ... 376435643564 ... Data (truncated) + +01000000 ............................. Object Type: GOVERNANCE_OBJECT_PROPOSAL (1) + +Masternode Unspent Outpoint +| 00000000000000000000000000000000 +| 00000000000000000000000000000000 ... Outpoint TXID +| ffffffff ........................... Outpoint index number: 0 + +00 ................................... Signature length: 0 + +| .................................... Masternode Signature (None required) +``` + +The following annotated hexdump shows a [`govobj` message](../reference/p2p-network-governance-messages.md#govobj) for a Trigger object. Notice the collateral hash of all zeros. (The message header has been omitted.) + +``` text +00000000000000000000000000000000 +00000000000000000000000000000000 ..... Parent Hash (0 = root) +01000000 ............................. Revision: 1 +911ea85900000000 ..................... Create timestamp: 2017-08-31 14:34:57 UTC +00000000000000000000000000000000 +00000000000000000000000000000000 ..... Collateral Hash (None required) + +Data +| ae11 ............................... Data length: 4526 +| fdae11356235623 ... 376435643564 ... Data (truncated) + +02000000 ............................. Object Type: GOVERNANCE_OBJECT_TRIGGER (2) + +Masternode Unspent Outpoint +| ffefbe4959085907bcd2ba29e357a441 +| fa7b6e26e25896d8127332bba2419e97 ... Outpoint TXID +| 00000000 ........................... Outpoint index number: 0 + +60 ................................... Signature length: 96 + +06516fa3b38d29fca6194e5d2c929666 +d59d2d105bbbc30a1e5d144e708a610a +2e0ab3c759988b13ff098ab3dbd4e01d +129827ef1e1996c211d6d5ecd5199f60 +cf028b1cdb2f7240e33981b16d1270e9 +d289fca20905fd453620238a505582fa ..... Masternode BLS Signature +``` + +## govobjvote + +The [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote) is used to indicate the voting status of a governance object. Voting status is comprised of the vote outcome (how the [masternode](../resources/glossary.md#masternode) voted) and the vote signal (the network support status). A sufficient number of yes votes results in the proposed funding being payed out in the next [superblock](../resources/glossary.md#superblock) (assuming their are sufficient funds available in the budget). + +The initial [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote) is created by a masternode to vote on a governance object (proposal, etc.). When the masternode votes, it broadcasts the [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote) to all its peers. + +When a [node](../resources/glossary.md#node) receives a valid, **new** [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote), it relays the message to all its connected [peers](../resources/glossary.md#peer) to propagate the vote. + +Additionally, nodes can request [`govobjvote` messages](../reference/p2p-network-governance-messages.md#govobjvote) for specific governance objects via a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync). Masternodes ignore requests for votes if they are not fully synced. + +:::{note} +Dash Core limits how frequently a masternode can vote on a governance object. +::: + +A masternode's vote will not be processed if it has been less than 60 minutes +since its last vote on that object. Additionally, invalid votes can result in +the node being banned. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 36 | masternode
OutPoint | outPoint | Required | The unspent outpoint of the masternode (holding 1000 DASH) which is voting +| 32 | nParentHash | uint256 | Required | Object (`govobj`) being voted on (proposal, contract, setting or final budget) +| 4 | nVoteOutcome | int | Required | None (0), Yes (1), No (2), Abstain (3) +| 4 | nVoteSignal | int | Required | None (0), Funding (1), Valid (2), Delete (3), Endorsed (4) +| 8 | nTime | int64_t | Required | Time the vote was created +| 97 | vchSig | char[] | Required | BLS Signature of the masternode (Length (1 byte) + Signature (96 bytes))
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +Governance Object Vote Signals (defined by `src/governance-object.h`) + +| Value | Name | Description +| :------: | ------- | ------------ +| 1 | Funding | Minimum network support has been reached for this object to be funded (doesn't mean it will for sure though) +| 2 | Valid | Minimum network support has been reached flagging this object as a valid and understood governance object (e.g, the serialized data is correct format, etc.) +| 3 | Delete | Minimum network support has been reached saying this object should be deleted from the system entirely +| 4 | Endorsed | Minimum network support has been reached flagging this object as endorsed by an elected representative body + +The following annotated hexdump shows a [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote). (The message header has been omitted.) + +``` text +Masternode Unspent Outpoint +| 9425afd65ccce1d655d4dd461b8523b8 +| 2577a8009c25604c65f3e78ea71d65df ... Outpoint TXID +| 01000000 ........................... Outpoint index number: 1 + +bc1bb26088161ff07dc09d873faa5573 +9a2fd53121d315b2942f3b9db36cb475...... Parent Hash (0 = root) +01000000 ............................. Vote Outcome: VOTE_OUTCOME_NONE (1) +03000000 ............................. Vote Signal: VOTE_SIGNAL_DELETE (3) +ec3d235c00000000 ..................... Vote Create Time: 2018-12-26 08:38:04 UTC + +60 ................................... Signature length: 96 +06516fa3b38d29fca6194e5d2c929666 +d59d2d105bbbc30a1e5d144e708a610a +2e0ab3c759988b13ff098ab3dbd4e01d +129827ef1e1996c211d6d5ecd5199f60 +cf028b1cdb2f7240e33981b16d1270e9 +d289fca20905fd453620238a505582fa ..... Masternode BLS Signature +``` + +## govsync + +The [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) is used to request syncing of governance objects (`govobj` message and [`govobjvote` message](../reference/p2p-network-governance-messages.md#govobjvote)) with peers. [Masternodes](../resources/glossary.md#masternode) ignore this request if they are not fully synced. + +This message responds in one of two ways depending on the request: + +1. Object Sync - When a masternode receives a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) with a hash of all zeros, it responds with a [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) for `govobj` objects. The masternode also sends an [`inv` message](../reference/p2p-network-data-messages.md#inv) (MSG_GOVERNANCE_OBJECT - 0x17) for all valid `govobj` governance objects. Do note that Dash limits how frequently object sync can be requested. Frequent requests will result in the node being banned. +*Governance object votes are excluded in this type of response.* + +2. Vote Sync - When a masternode receives a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) with a specific hash, it responds with an [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) for `govobjvote` objects. The masternode also sends a `govobjvote` inventory messages (MSG_GOVERNANCE_OBJECT_VOTE - 0x18) for the object requested. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 32 | nHash | uint256 | Required | Hash of governance object to request
Set to all zeros to request all objects (excludes votes) +| # | filter | CBloomFilter | Required | Can be set to all zeros.
Only supported since [protocol version 70206](../reference/p2p-network-protocol-versions.md) + +The following annotated hexdump shows a [`govsync` message](../reference/p2p-network-governance-messages.md#govsync). (The message header has been omitted.) + +``` text +2e46ea5418e097a3dbcccbee3cf2a911 +6fb94ba635153f276dcb2123efcb73ff ..... Hash +00000000000000000000 ................. Bloom Filter +``` diff --git a/docs/core/reference/p2p-network-instantsend-messages.md b/docs/core/reference/p2p-network-instantsend-messages.md new file mode 100644 index 000000000..3ae045e92 --- /dev/null +++ b/docs/core/reference/p2p-network-instantsend-messages.md @@ -0,0 +1,88 @@ +```{eval-rst} +.. meta:: + :title: InstantSend Messages + :description: The network messages in this section play a role in controlling Dash's InstantSend feature, utilizing the masternode network for secure and fast transactions. +``` + +# InstantSend Messages + +The following network messages all help control the InstantSend feature of Dash. InstantSend uses the masternode network to lock transaction inputs and enable secure, instantaneous transactions. For additional details, refer to the Developer Guide [InstantSend section](../guide/dash-features-instantsend.md). + +## clsig + +*Added in protocol version 70214 of Dash Core* + +The [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig) is used to indicate a successful ChainLock for the designated [block height](../resources/glossary.md#block-height). The Chainlock ensures that no other [blocks](../resources/glossary.md#block) can replace the one with the indicated block hash. This determination is made by agreement of a [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum) (LLMQ) which creates the BLS signature in the message. + +Once a [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig) is received, clients must reject any other blocks for the indicated block height as described in [DIP8 (ChainLocks)](https://github.com/dashpay/dips/blob/master/dip-0008.md). This increases security by preventing reorganization of a block with a ChainLock (and all blocks below it). + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 4 | nHeight | int32_t | Block height +| 32 | blockHash | uint256 | Block hash +| 96 | sig | CBLSSignature | LLMQ BLS signature
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +The following annotated hexdump shows a [`clsig` message](../reference/p2p-network-instantsend-messages.md#clsig). (The message header has been omitted.) + +``` text +c1310100 ................................... Block Height: 78273 + +03bb286a877135fad3b33ea9cce9a525 +e5edc0879411afaff513b30100000000 ........... Block Hash + +12a3331fd8d0008804edaaf94c57b491 +d36f38f1993d06dfff71df9ec83da463 +dcd5497d105932e609016dac075f02df +1259951e3bcebfcc26afc904f6cd92df +7ff9b8c6c2ac9dcc9cb1a7dc7ec03bcc +005574710c3aabc2f8670959cf8bc9b5 ........... LLMQ BLS Signature +``` + +## isdlock + +:::{note} +*Added in protocol version 70220 of Dash Core* +::: + +The [`isdlock` message](../reference/p2p-network-instantsend-messages.md#isdlock) is used to provide details of transactions that have been locked by InstantSend. The message includes all details present in the [`islock` message](../reference/p2p-network-deprecated-messages.md#islock) along with additional version and cycle information introduced by [DIP22](https://github.com/dashpay/dips/blob/master/dip-0022.md). This enables nodes to determine what quorum signed the message and validate the signature in the future after the quorum is no longer active. Additional details about the change are available in [DIP22 - Making InstantSend Deterministic using Quorum Cycles](https://github.com/dashpay/dips/blob/master/dip-0022.md). + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | version | uint8 | The version of the islock message | +| 1-9 | inputsSize | compactSize uint | Number of inputs | +| 36 * `inputsSize`| inputs | COutPoint | Outpoints used in the transaction | +| 32 | txid | uint256 | TXID of the locked transaction | +| 32 | cycleHash | uint256 | Block hash of first block of the cycle in which the quorum signing this islock is active | +| 96 | sig | byte[] | LLMQ BLS Signature
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation | + +The following annotated hexdump shows a [`isdlock` message](../reference/p2p-network-instantsend-messages.md#isdlock). (The message header has been omitted.) + +``` text +01 ......................................... Message version: 1 +11 ......................................... Number of inputs: 17 + +Input 1 +| d735fb8cb1b2c4f852e090824ed1b671 +| 93a6ed82dfb959487c80c9d520ce270b ......... Previous outpoint TXID +| 01000000 ................................. Previous outpoint index: 1 + +Input 2 +| c8ad33361d9dbc2f0a0e981987fa5c9c +| a3df83991dddccab6498ac40d2976423 ......... Previous outpoint TXID +| 01000000 ................................. Previous outpoint index: 1 + +| [...] .................................... 15 transaction inputs omitted + +f3fd4540b5240abfeba62b766754647a +32580ab3be974b0b63ac16d619675fee ........... TXID + +ea830004232454df5db2c96b3da3c741 +d7729b0a293c967f7647a2731e000000 ........... Cycle hash + +9853fbfbc3592a06200e41617d30713f +861586c7503972ecd09d00731f4fcd6c +712a03c37906a14475e0e903e3ea9185 +043673aa8e6ff402eaea7adbdf06d2ab +141fdd115a7162904e8a43c8f3efb67d +05870b1b00c88445f77fa9cb1cb16c01 ........... LLMQ BLS Signature (96 bytes) +``` diff --git a/docs/core/reference/p2p-network-masternode-messages.md b/docs/core/reference/p2p-network-masternode-messages.md new file mode 100644 index 000000000..da9258ce4 --- /dev/null +++ b/docs/core/reference/p2p-network-masternode-messages.md @@ -0,0 +1,69 @@ +```{eval-rst} +.. meta:: + :title: Masternode Messages + :description: The following network messages enable the masternode features built in to Dash. +``` + +# Masternode Messages + +The following network messages enable the [masternode](../resources/glossary.md#masternode) features built in to Dash. + +![Overview Of P2P Protocol Masternode Request And Reply Messages](../../img/dev/en-p2p-masternode-messages.svg) + +For additional details, refer to the Developer Guide [Masternode Sync](../guide/dash-features-masternode-sync.md) and [Masternode Payment](../guide/dash-features-masternode-payment.md) sections. + +## ssc + +The [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc) is used to track the sync status of masternode objects. This message is sent in response to sync requests for the list of governance objects (`govsync` message), and governance object votes (`govsync` message). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nItemID | int | Required | Masternode Sync Item ID +| 4 | nCount | int | Required | Number of items to sync + +Sync Item IDs + +| ID | Description | Response To +|------|--------------|--------------- +| 10 | MASTERNODE_SYNC_GOVOBJ | [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) +| 11 | MASTERNODE_SYNC_GOVOBJ_VOTE | [`govsync` message](../reference/p2p-network-governance-messages.md#govsync) with non-zero hash + +The following annotated hexdump shows a [`ssc` message](../reference/p2p-network-masternode-messages.md#ssc). (The message header has been omitted.) + +``` text +02000000 ................................... Item ID: MASTERNODE_SYNC_LIST (2) +bf110000 ................................... Count: 4543 +``` + +## mnauth + +*Added in protocol version 70214* + +The [`mnauth` message](../reference/p2p-network-masternode-messages.md#mnauth) is sent by a [masternode](../resources/glossary.md#masternode) immediately after sending a [`verack` message](../reference/p2p-network-control-messages.md#verack) to authenticate that the sender is a masternode. It is only sent when the sender is actually a masternode. + +The [`mnauth` message](../reference/p2p-network-masternode-messages.md#mnauth) signs a challenge that was previously sent via a [`version` message](../reference/p2p-network-control-messages.md#version). The challenge is signed differently depending on if the connection is inbound or outbound. + +:::{note} +As of protocol version 70218, when communicating with masternodes that have reported a version => `MIN_MASTERNODE_PROTO_VERSION`, the mnauth signature is created by signing a message incorporating both the `mnauth_challenge` and protocol `version` (from the [`version` message](../reference/p2p-network-control-messages.md#version)). Further details may be found in [Dash Core PR 3631](https://github.com/dashpay/dash/pull/3631). +::: + +This is primarily used as a DoS protection mechanism to allow persistent connections between masternodes to remain open even if inbound connection limits are reached. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 32 | proRegTxHash | uint256 | The hash of the ProRegTx that identifies the masternode +| 96 | sig | byte[] | BLS signature of the [`version` message's](../reference/p2p-network-control-messages.md#version) `mnauth_challenge`. Signed with the operator key of the masternode.
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +The following annotated hexdump shows a [`mnauth` message](../reference/p2p-network-masternode-messages.md#mnauth). (The message header has been omitted.) + +``` text +63cd3bf06404d78f80163afeb4b13e18 +7dc1c1d04997ef04f1a2ecb3166dd004 ........... ProRegTx Hash + +12f2706bc75e9cb14a9ebf1d93d177d5 +f266ad2eddc49ad463810cb976a3e4bb +abffc96819c5030fd5a7601af9c8ee50 +0feb066b38a48af1a31b7242bd814bab +91e2a887f963904f33af851ddc9167d5 +66d6d3bd6c07e99091edd8867d0dd56e ........... Masternode BLS Signature (96 bytes) +``` diff --git a/docs/core/reference/p2p-network-message-headers.md b/docs/core/reference/p2p-network-message-headers.md new file mode 100644 index 000000000..c79797dbb --- /dev/null +++ b/docs/core/reference/p2p-network-message-headers.md @@ -0,0 +1,27 @@ +```{eval-rst} +.. meta:: + :title: Message Headers + :description: All network protocol messages utilize a standardized container format, comprising a required message header and an optional payload. +``` + +# Message Headers + +All messages in the network protocol use the same container format, which provides a required multi-field [message header](../resources/glossary.md#message-header) and an optional payload. The message header format is: + +| Bytes | Name | Data Type | Description +| :-------: |--------------|-----------|------------- +| 4 | start string | char[4] | Magic bytes indicating the originating network; used to seek to next message when stream state is unknown. +| 12 | command name | char[12] | ASCII string which identifies what message type is contained in the payload. Followed by nulls (0x00) to pad out byte count; for example: `version\0\0\0\0\0`. +| 4 | payload size | uint32_t | Number of bytes in payload. The current maximum number of bytes ([`MAX_SIZE`](https://github.com/dashpay/dash/blob/v0.15.x/src/serialize.h#L29)) allowed in the payload by Dash Core is 32 MiB---messages with a payload size larger than this will be dropped or rejected. +| 4 | checksum | char[4] | *Added in protocol version 209.*

First 4 bytes of SHA256(SHA256(payload)) in internal byte order.

If payload is empty, as in `verack` and [`getaddr` messages](../reference/p2p-network-control-messages.md#getaddr), the checksum is always 0x5df6e0e2 (SHA256(SHA256())). + +## Example + +The following example is an annotated hex dump of a [mainnet](../resources/glossary.md#mainnet) message header from a [`verack` message](../reference/p2p-network-control-messages.md#verack) which has no payload. + +``` text +bf0c6bbd ................... Start string: Mainnet +76657261636b000000000000 ... Command name: verack + null padding +00000000 ................... Byte count: 0 +5df6e0e2 ................... Checksum: SHA256(SHA256()) +``` diff --git a/docs/core/reference/p2p-network-privatesend-messages.md b/docs/core/reference/p2p-network-privatesend-messages.md new file mode 100644 index 000000000..e6064e74c --- /dev/null +++ b/docs/core/reference/p2p-network-privatesend-messages.md @@ -0,0 +1,555 @@ +```{eval-rst} +.. meta:: + :title: CoinJoin Messages + :description: The network messages in this section all help control the CoinJoin features built into Dash and facilitated by the masternode network. +``` + +# CoinJoin Messages + +The following network messages all help control the CoinJoin features built into Dash and facilitated by the [masternode](../resources/glossary.md#masternode) network. + +Since the messages are all related to a single process, this diagram shows them sequentially numbered. The [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) (not shown) is sent by the masternode in conjunction with some responses. For additional details, refer to the Developer Guide [CoinJoin section](../guide/dash-features-coinjoin.md). + +![Overview Of P2P Protocol PrivateSend Request And Reply Messages](../../img/dev/en-p2p-privatesend-messages.svg) + +## dsa + +The [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) allows a [node](../resources/glossary.md#node) to join a CoinJoin pool. A collateral fee is required and may be forfeited if the client acts maliciously. The message operates in two ways: + +1. When sent to a masternode without a current CoinJoin queue, it initiates the start of a new queue + +2. When sent to a masternode with a current queue, it attempts to join the existing queue + +Dash Core attempts to join an existing queue first and only requests a new one if no existing ones are available. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nDenom | int | Required | Denomination that will be exclusively used when submitting inputs into the pool +| 216+ | txCollateral | [`tx` message](../reference/p2p-network-data-messages.md#tx) | Required | Collateral TX that will be charged if this client acts maliciously + +The following annotated hexdump shows a [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa). (The message header has been omitted.) Note that the 'Required inputs' bytes will only be preset if [Spork](../resources/glossary.md#spork) 6 is active and protocol version => 70209. + +``` text +02000000 ................................... Denomination: 1 Dash (2) + +Collateral Transaction +| Previous Output +| | +| | 010000000183bd1980c71c38f035db9b +| | 14d7f934f7d595181b3436e362899026 ....... Outpoint TXID +| | 19f3f7d3 ............................... Outpoint index number: 3556242201 +| +| 83 ....................................... Bytes in sig. script: 131 +| +| 000000006b483045022100f4d8fa0ae4132235fe +| cd540a62715ccfb1c9a97f8698d066656e30bb1e +| 1e06b90220301b4cc93f38950a69396ed89dfcc0 +| 8e72ec8e6e7169463592a0bf504946d98b812102 +| fa4b9c0f9e76e06d57c75cab9c8368a62a1ce8db +| 6eb0c25c3e0719ddd9ab549cffffffff01e09304 +| 00000000001976a914f895 ................... Secp256k1 signature: None +| +| 6a4eb0e5 ................................. Sequence number: 3853536874 +``` + +## dsc + +The [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc) indicates a CoinJoin session is complete. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nSessionID | int | Required | ID of the session +| 4 | nMessageID | int | Required | ID of the message describing the result of the session + +Reference the Message IDs table under the [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) for descriptions of the Message ID values. + +The following annotated hexdump shows a [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc). (The message header has been omitted.) + +``` text +d9070700 ............................. Session ID: 791686 +14000000 ............................. Message ID: MSG_SUCCESS (20) +``` + +## dsf + +The [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) is sent by the masternode as the final transaction in a CoinJoin session. The [masternode](../resources/glossary.md#masternode) expects [nodes](../resources/glossary.md#node) in the session to respond with a [`dss` message](../reference/p2p-network-privatesend-messages.md#dss). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nSessionID | int | Required | ID of the session +| # | txFinal | [`tx` message](../reference/p2p-network-data-messages.md#tx) | Required | Final transaction with unsigned inputs + +The following annotated hexdump shows a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf). (The message header has been omitted.) Transaction [inputs](../resources/glossary.md#input)/[outputs](../resources/glossary.md#output) are only shown for a single node (compare with the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) and [`dss` message](../reference/p2p-network-privatesend-messages.md#dss) hexdumps). + +``` text +86140c00 ............................. Session ID: 791686 + +Transaction Message +| 01000000 ................................. Version: 1 +| +| 0f ......................................... Number of inputs: 15 +| +| [...] ...................................... 5 transaction inputs omitted +| +| Transaction input #6 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 02000000 ................................. Outpoint index number: 0 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #7 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0f000000 ................................. Outpoint index number: 15 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #8 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0d000000 ................................. Outpoint index number: 13 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| +| [...] ...................................... 7 more transaction inputs omitted +| +| +| 0f ......................................... Number of outputs: 15 +| +| Transaction output #1 +| | e8e4f50500000000 ......................... Duffs (1.00001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | 14826d7ba05cf76588a5503c03951dc9 +| | | | 14c91b6c ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| +| [...] ...................................... 3 transaction outputs omitted +| +| +| Transaction output #5 +| | e8e4f50500000000 ......................... 100,001,000 Duffs (1.0001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | 426614716e94812d483bca32374f6ac8 +| | | | cd121b0d ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| +| [...] ...................................... 9 transaction outputs omitted +| +| +| Transaction output #15 +| | e8e4f50500000000 ......................... 100,001,000 Duffs (1.0001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | f01197177de2358928196a543b2bbd97 +| | | | 3c2ab002 ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| 00000000 ................................... locktime: 0 (a block height) +``` + +## dsi + +The [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) replies to a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) that has the Ready field set to 0x01. The [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) contains user [inputs](../resources/glossary.md#input) for processing along with the [outputs](../resources/glossary.md#output) and a collateral. Once the [masternode](../resources/glossary.md#masternode) receives [`dsi` messages](../reference/p2p-network-privatesend-messages.md#dsi) from all members of the pool, it responds with a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| ? | vecTxDSIn | CTxDSIn[] | Required | Vector of users inputs (CTxDSIn serialization is equal to CTxIn serialization) +| 216+ | txCollateral | [`tx` message](../reference/p2p-network-data-messages.md#tx) | Required | Collateral transaction which is used to prevent misbehavior and also to charge fees randomly +| ? | vecTxDSOut | CTxDSOut[] | Required | Vector of user outputs (CTxDSOut serialization is equal to CTxOut serialization) + +The following annotated hexdump shows a [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi). (The message header has been omitted.) + +``` text +User inputs +| 03 ......................................... Number of inputs: 3 +| +| Transaction input #1 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 02000000 ................................. Outpoint index number: 2 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #2 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0f000000 ................................. Outpoint index number: 15 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #3 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0d000000 ................................. Outpoint index number: 13 +| | +| | 00 ....................................... Bytes in sig. script: 0 +| | .......................................... Secp256k1 signature: None +| | +| | ffffffff ................................. Sequence number: UINT32_MAX + +Collateral Transaction +| 01000000 ................................... Version: 1 +| +| 01 ......................................... Number of inputs: 1 +| +| Previous Output +| | +| | 83bd1980c71c38f035db9b14d7f934f7 +| | d595181b3436e36289902619f3f7d383 ......... Outpoint TXID +| | 00000000 ................................. Outpoint index number: 0 +| | +| | 6b ....................................... Bytes in sig. script: 107 +| | +| | 483045022100f4d8fa0ae4132235fecd540a +| | 62715ccfb1c9a97f8698d066656e30bb1e1e +| | 06b90220301b4cc93f38950a69396ed89dfc +| | c08e72ec8e6e7169463592a0bf504946d98b +| | 812102fa4b9c0f9e76e06d57c75cab9c8368 +| | a62a1ce8db6eb0c25c3e0719ddd9ab549c ....... Secp256k1 signature +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| 01 ......................................... Number of outputs: 1 +| +| | e093040000000000 ......................... 300,000 Duffs (0.003 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | f8956a4eb0e53b05ee6b30edfd2770b5 +| | | | 26c1f1bb ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| 00000000 ................................... locktime: 0 (a block height) + +User outputs +| 03 ......................................... Number of outputs: 3 +| +| Transaction output #1 +| | e8e4f50500000000 ......................... 100,001,000 Duffs (1.0001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | 14826d7ba05cf76588a5503c03951dc9 +| | | | 14c91b6c ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| Transaction output #2 +| | e8e4f50500000000 ......................... 100,001,000 Duffs (1.0001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | f01197177de2358928196a543b2bbd97 +| | | | 3c2ab002 ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| Transaction output #3 +| | e8e4f50500000000 ......................... 100,001,000 Duffs (1.0001 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | 426614716e94812d483bca32374f6ac8 +| | | | cd121b0d ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +``` + +## dsq + +The [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) provides [nodes](../resources/glossary.md#node) with queue details and notifies them when to sign final transaction messages. + +If the message indicates the queue is not ready, the node verifies the message is valid. It also verifies that the [masternode](../resources/glossary.md#masternode) is not flooding the [network](../resources/glossary.md#network) with [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) in an attempt to dominate the queuing process. It then relays the message to its connected [peers](../resources/glossary.md#peer). + +If the message indicates the queue is ready, the node responds with a [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nDenom | int | Required | Denomination allowed in this session +| 32 | proTxHash | uint256 | Required | The ProRegTx hash of the masternode which is hosting this session
**Replaced `masternodeOutPoint` in Dash Core 19.2.0.** +| 8 | nTime | int64_t | Required | Time this [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) was created +| 1 | fReady | bool | Required | Indicates if the pool is ready to be executed +| 97 | vchSig | char[] | Required | BLS Signature of this message by masternode verifiable via pubKeyMasternode (Length (1 byte) + Signature (96 bytes))
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +Denominations (per [`src/coinjoin.cpp`](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.cpp#L316-L336)) + +| Value | Denomination +|------|-------------- +| 1 | 10 Dash +| 2 | 1 Dash +| 4 | 0.1 Dash +| 8 | 0.01 Dash +| 16 | 0.001 Dash + +The following annotated hexdump shows a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq). (The message header has been omitted.) Note that the 'Required [inputs](../resources/glossary.md#input)' bytes will only be preset if [Spork](../resources/glossary.md#spork) 6 is active and protocol version => 70209. + +``` text +01000000 ............................. Denomination: 10 Dash (1) + +d28018e798ccbd797d0b2fc33513d64d +60d55c92f4b35f46db169332dae95f4d ..... Protx Hash + +c93aa96500000000 ..................... Create Time: 2024-01-18 14:50:49 UTC + +00 ................................... Ready: 0 + +60 ................................... Signature length: 96 +a5d5ff37b8763059a464ec07a07f3e6a +1a53c6a327446badb054b507cf642e3f +956f0f758f80fd7a80416420c64ca015 +11a9bb25490279844aecdae745d3dca0 +12be868b6a15b25145d77bc8f5e2425b +e292e183a5a45310e12af6640ac621f1 ..... Masternode BLS Signature +``` + +## dss + +The [`dss` message](../reference/p2p-network-privatesend-messages.md#dss) replies to a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) sent by the [masternode](../resources/glossary.md#masternode) managing the session. The [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) provides the unsigned transaction [inputs](../resources/glossary.md#input) for all members of the pool. Each [node](../resources/glossary.md#node) verifies that the final transaction matches what is expected. They then sign any transaction inputs belonging to them and then relay them to the masternode via this [`dss` message](../reference/p2p-network-privatesend-messages.md#dss). + +Once the masternode receives and validates all [`dss` messages](../reference/p2p-network-privatesend-messages.md#dss), it issues a [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc). If a node does not respond to a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) with signed transaction inputs, it may forfeit the collateral it provided. This is to minimize malicious behavior. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| # | inputs | txIn[] | Required | Signed inputs for the session
**Note**: Inputs must be signed with the `SIGHASH_ALL \| SIGHASH_ANYONECANPAY` signature type + +The following annotated hexdump shows a [`dss` message](../reference/p2p-network-privatesend-messages.md#dss). (The message header has been omitted.) Note that these will be the same transaction inputs that were supplied (unsiged) in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi). + +``` text +User inputs +| 03 ......................................... Number of inputs: 3 +| +| Transaction input #1 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 02000000 ................................. Outpoint index number: 2 +| | +| | 6b ....................................... Bytes in sig. script: 107 +| | 483045022100b3a861dca83463aabf5e4a14a286 +| | 1b9c2e51e0dedd8a13552e118bf74eb4a68d0220 +| | 4a91c416768d27e6bdcfa45d28129841dbcc728b +| | f0bbec9701cfc4e743d23adf812102cc4876c9da +| | 84417dec37924e0479205ce02529bb0ba88631d3 +| | ccc9cfcdf00173 ........................... Secp256k1 signature +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #2 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0f000000 ................................. Outpoint index number: 15 +| | +| | 6a ....................................... Bytes in sig. script: 106 +| | 4730440220268f3b7799ca4ec132e511a4756019 +| | c56016f7771561dc0597d84e9b1fa9fc08022067 +| | 5199b9b3f9a7eba69b7bbb4aa2a413d955762f9d +| | 68be5a9c02c6772c8078fd812103258925f0dbbf +| | 9d5aa20a675459fa2e86c9f9061dee82a00dca73 +| | 9080f051d891 ............................. Secp256k1 signature +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| Transaction input #3 +| | +| | 36bdc3796c5630225f2c86c946e2221a +| | 9958378f5d08da380895c2656730b5c0 ......... Outpoint TXID +| | 0d000000 ................................. Outpoint index number: 13 +| | +| | 6a ....................................... Bytes in sig. script: 106 +| | 4730440220404bb067e0c94a2bd75c6798c1af8c +| | 95e8b92f5e437cff2bcb4660f24a34d06d02203a +| | b707bd371a84a9e7bd1fbe3b0c939fd23e0a9165 +| | de78809b9310372a4b3879812103a9a6c5204811 +| | a8cab04b595ed622a1fed6efd3b2d888fadd0c97 +| | 3737fcdf2bc7 ............................. Secp256k1 signature +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +``` + +## dssu + +The [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) provides a pool status update. + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| 4 | nMsgSessionID | int | Required | Session ID +| 4 | nMsgState | int | Required | Current state of processing +| 4 | nMsgStatusUpdate | int | Required | Update state and/or signal if entry was accepted or not +| 4 | nMsgMessageID | int | Required | ID of the typical masternode reply message + +**Pool State** + +| State | Description +|------|-------------- +| 0 | `POOL_STATE_IDLE` +| 1 | `POOL_STATE_QUEUE` +| 2 | `POOL_STATE_ACCEPTING_ENTRIES` +| 3 | `POOL_STATE_SIGNING` +| 4 | `POOL_STATE_ERROR` + +**Pool Status Update** + +| Status | Description +|------|-------------- +| 0 | `STATUS_REJECTED` +| 1 | `STATUS_ACCEPTED` + +**Message IDs** + +| Code | Description +|------|-------------- +| 0x00 | `ERR_ALREADY_HAVE` +| 0x01 | `ERR_DENOM` +| 0x02 | `ERR_ENTRIES_FULL` +| 0x03 | `ERR_EXISTING_TX` +| 0x04 | `ERR_FEES` +| 0x05 | `ERR_INVALID_COLLATERAL` +| 0x06 | `ERR_INVALID_INPUT` +| 0x07 | `ERR_INVALID_SCRIPT` +| 0x08 | `ERR_INVALID_TX` +| 0x09 | `ERR_MAXIMUM` +| 0x0A (10) | `ERR_MN_LIST` +| 0x0B (11) | `ERR_MODE` +| 0x0C (12) | `ERR_NON_STANDARD_PUBKEY` (Not used) +| 0x0D (13) | `ERR_NOT_A_MN` (Not used) +| 0x0E (14) | `ERR_QUEUE_FULL` +| 0x0F (15) | `ERR_RECENT` +| 0x10 (16) | `ERR_SESSION` +| 0x11 (17) | `ERR_MISSING_TX` +| 0x12 (18) | `ERR_VERSION` +| 0x13 (19) | `MSG_NOERR` +| 0x14 (20) | `MSG_SUCCESS` +| 0x15 (21) | `MSG_ENTRIES_ADDED` +| 0x16 (22) | `ERR_SIZE_MISMATCH` + +The following annotated hexdump shows a [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu). (The message header has been omitted.) + +``` text +86140c00 ............................. Session ID: 791686 +02000000 ............................. State: POOL_STATE_ACCEPTING_ENTRIES (2) +01000000 ............................. Status Update: STATUS_ACCEPTED (1) +13000000 ............................. Message ID: MSG_NOERR (0x13) +``` + +## dstx + +The [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) allows [masternodes](../resources/glossary.md#masternode) to broadcast subsidized transactions without fees (to provide security in processing). + +| Bytes | Name | Data type | Required | Description | +| ---------- | ----------- | --------- | -------- | -------- | +| # | tx | [`tx` message](../reference/p2p-network-data-messages.md#tx) | Required | The transaction +| 32 | proTxHash | uint256 | Required | The ProRegTx hash of the masternode which is signing the message
**Replaced `masternodeOutPoint` in Dash Core 19.2.0.** +| 97 | vchSig | char[] | Required | BLS Signature of this message by masternode verifiable via pubKeyMasternode (Length (1 byte) + Signature (96 bytes))
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation +| 8 | sigTime | int64_t | Require | Time this message was signed + +The following annotated hexdump shows a [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx). (The message header has been omitted.) + +``` text +Transaction Message +| 0200 ....................................... Version: 2 +| 0000 ....................................... Type: 0 (Classical Tx) +| +| 05 ......................................... Number of inputs: 5 +| +| Transaction input #1 +| | +| | 0adb782b2170018eada54534be880e70 +| | 74ed8307a566731119b1782362af43ad ......... Outpoint TXID +| | 05000000 ................................. Outpoint index number: 5 +| | +| | 6b ....................................... Bytes in sig. script: 107 +| | 483045022100b1243fcba562a0f1d7c4 +| | cc3b320645dfa96c6412f368ccdbc1b7 +| | acb6b0aa1db502201606c81b0d79f52f +| | 47bcb071b64c37f72dd1378efa67a2de +| | dd86c44d393668fa812102d6ff581270 +| | 632f5e972b0418ee871867b5c04b6eae +| | 3458ad135ad8f1daaa4fc2 ................... Secp256k1 signature +| | +| | ffffffff ................................. Sequence number: UINT32_MAX +| +| [...] ...................................... 4 more transaction inputs omitted +| +| +| 05 ......................................... Number of outputs: 5 +| +| Transaction output #1 +| | 10f19a3b00000000 ......................... Duffs (10.0001000 Dash) +| | +| | 19 ....................................... Bytes in pubkey script: 25 +| | | 76 ..................................... OP_DUP +| | | a9 ..................................... OP_HASH160 +| | | 14 ..................................... Push 20 bytes as data +| | | | 3eb7ae776b096231de9eca42dd57a677 +| | | | d3b05452 ............................. PubKey hash +| | | 88 ..................................... OP_EQUALVERIFY +| | | ac ..................................... OP_CHECKSIG +| +| [...] ...................................... 4 more transaction outputs omitted +| +| +| 00000000 ................................... locktime: 0 (a block height) + +d28018e798ccbd797d0b2fc33513d64d +60d55c92f4b35f46db169332dae95f4d ........... Protx Hash + +60 ......................................... Signature length: 96 + +94c8e427f448789f58cda17445e76c64 +d0efa7c089addcb378f9b8d04b72f499 +a4e8e616b5011886b9cffcce29e17fc1 +10ad8609c3ee1a3207b882e7ff58400f +42d6e6544108b349da2cc5e716a5f266 +4a2dc96b0f080effd5349f2ae06ac234 .......... Masternode Signature + +59b4235c00000000 .......................... Sig Time: 2018-12-26 17:03:21 UTC +``` diff --git a/docs/core/reference/p2p-network-protocol-versions.md b/docs/core/reference/p2p-network-protocol-versions.md new file mode 100644 index 000000000..0e9c938a1 --- /dev/null +++ b/docs/core/reference/p2p-network-protocol-versions.md @@ -0,0 +1,60 @@ +```{eval-rst} +.. meta:: + :title: Protocol Versions + :description: The table in this section lists some notable versions of the Dash P2P network protocol, with the most recent versions listed first. +``` + +# Protocol Versions + +## Dash Protocol Versions + +The table below lists some notable versions of the P2P network protocol, with the most recent versions listed first. + +As of Dash Core 21.1, the most recent protocol version is 70233. + +| Version | Initial Release | Major Changes +|---------|------------------------------------|-------------- +| 70233 | [Dash Core 21.1](https://github.com/dashpay/dash/blob/v21.1.0/doc/release-notes.md)
(Aug 2024) | • [Enhanced hard fork update](https://github.com/dashpay/dash/pull/6175) +| 70232 | [Dash Core 21.0](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md)
(Jul 2024) | • Masternode reward location reallocation
• Mainnet spork hardening
• Experimental descriptor wallet support +| 70231 | [Dash Core 20.1](https://github.com/dashpay/dash/blob/v20.1.0/doc/release-notes.md)
(Mar 2024) | • HD wallets by default
• Legacy InstantSend deprecated (`islock` p2p and inv messages) +| 70230 | [Dash Core 20.0](https://github.com/dashpay/dash/blob/v20.0.0/doc/release-notes.md)
(Nov 2023) | • [DIP 29](https://github.com/dashpay/dips/blob/master/dip-0028.md): ChainLock-based random beacon
• [Treasury expansion](https://www.dashcentral.org/p/TREASURY-REALLOCATION-60-20-20)
• Sentinel functionality integrated into Core
• Asset lock transactions
• [Coinbase transaction updates](https://github.com/dashpay/dips/blob/master/dip-0004.md) and changes to [DIP 4](https://github.com/dashpay/dips/blob/master/dip-0004.md) +| 70228 | [Dash Core 19.2.0](https://github.com/dashpay/dash/blob/v19.2.0/doc/release-notes.md)
(Jun 2023) | • Store protx version in simplified masternode list entries and use to serialize/deserialize masternode BLS operator keys +| 70227 | [Dash Core 19.0.0](https://github.com/dashpay/dash/blob/v19.0.0/doc/release-notes.md)
(Apr 2023) | • [DIP 28](https://github.com/dashpay/dips/blob/master/dip-0028.md): Evolution masternodes (4000 DASH collateral)
• Removed [`reject` message](../reference/p2p-network-deprecated-messages.md#reject) +| 70224 | Dash Core 18.2.0
(Jan 2023) | • None (CoinJoin bugfix only) +| 70223 (unchanged) | Dash Core 18.1.0
(Oct 2022) | • [BIP 70](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) support removed (Bitcoin backport)
• Account API removed (previously deprecated)
• Auto-loading wallets
+| 70223 | Dash Core 18.0.0
(Aug 2022) | • [DIP 22](https://github.com/dashpay/dips/blob/master/dip-0022.md): Deterministic InstantSend
• Governance proposal fee reduction
• Multi-wallet GUI support
• [DIP 24](https://github.com/dashpay/dips/blob/master/dip-0024.md): LLMQ Rotation
+| 70219 | Dash Core 0.17.0
(Q2 2021) | • [DIP 20](https://github.com/dashpay/dips/blob/master/dip-0020.md) Opcode [additions](../reference/transactions-opcodes.md#expanded-opcodes)
• Governance system improvements
• Add LLMQ for Dash Platform
• RPC updates to support Dash Platform
• Removal of [spork](../reference/p2p-network-control-messages.md#spork) 22
• Hard fork auto-recovery
• Non-HD to HD wallet upgrade option
• [DIP 21](https://github.com/dashpay/dips/blob/master/dip-0021.md) DKG data sharing/recovery +| 70218 | Dash Core 0.16.0
(Q3 2020) | • Block reward [reallocation](../reference/block-chain-serialized-blocks.md#block-reward-reallocation)
• Concentrated recovery for LLMQ signatures
• Wallet GUI refresh
• Expanded [PoSe](../guide/dash-features-proof-of-service.md) (masternode version checks)
• Removal of [sporks](../reference/p2p-network-control-messages.md#spork) 15, 16, and 20
• PrivateSend updates +| 70216 | Dash Core 0.15.0
(Q1 2020) | • Mempool sync (via [`mempool` message](../reference/p2p-network-data-messages.md#mempool))
• Updated [default P2P/RPC ports](../reference/p2p-network-constants-and-defaults.md) for RegTest and Devnet networks
• Removal of `alert` message
• Removal of legacy InstantSend
• Removal of [sporks](../reference/p2p-network-control-messages.md#spork) 5 and 12
• Deprecation of [sporks](../reference/p2p-network-control-messages.md#spork) 15, 16, and 20 +| 70215 | Dash Core 0.14.0.1
(May 2019) | • None (Governance bugfix only) +| 70214 | Dash Core 0.14.0.0
(May 2019) | • [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum)
• [ChainLocks](../resources/glossary.md#chainlock)
• PrivateSend improvements
• Experimental LLMQ InstantSend
• Bitcoin Core 0.15 backports +| 70213 | Dash Core 0.13.0.x
(Jan 2019) | • [Special Transactions](../resources/glossary.md#special-transactions)
• Deterministic Masternode List
• Coinbase Special Transaction
• Automatic InstantSend +| 70210 | Dash Core 0.12.3.x
(July 2018) | • Named Devnets
• New signature format / Spork 6 addition
• Bitcoin Core 0.13/0.14 backports
• [BIP90](https://github.com/bitcoin/bips/blob/master/bip-0090.mediawiki): Buried deployments
• [BIP147](https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki): NULLYDUMMY enforcement
• [BIP152](https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki) Compact Blocks
• Transaction version increased to 2
• Zero fee transactions removed
• Pruning in Lite Mode +| 70208 | Dash Core 0.12.2.x
(Nov 2017) | • [DIP1](https://github.com/dashpay/dips/blob/master/dip-0001.md) (2MB blocks)
• Fee reduction (10x)
• InstantSend fix
• PrivateSend improvements
• _Experimental_ HD wallet
• Local Masternode support removed +| 70206 | Dash Core 0.12.1.x
(Mar 2017) | • Switch to Bitcoin Core 0.12.1
• BIP-0065 (CheckLockTimeVerify)
• BIP-0112 (CheckSequenceVerify) +| 70103 | Dash Core 0.12.0.x
(Aug 2015) | • Switch to Bitcoin Core 0.10
• Decentralized budget system
• New IX implementation +| 70076 | Dash Core 0.11.2.x
(Mar 2015) | • Masternode enhancements
• Mining/relay policy enhancements
• BIP-66 - strict DER encoding for signatures +| 70066 | Dash Core 0.11.1.x
(Feb 2015) | • InstantX fully implemented
• [Spork](../resources/glossary.md#spork) fully implemented
• Masternode payment updates
• Rebrand to Dash (0.11.1.26) +| 70052 | Dash Core 0.11.0.x
(Jan 2015) | • Switch from fork of Litecoin 0.8 to Bitcoin 0.9.3
• Rebrand to Darkcoin Core +| 70051 | Dash Core 0.10.0.x
(Sep 2014) | • Release of the originally closed source implementation of DarkSend +| 70002 | Dash Core 0.9.0.x
(Mar 2014) | • Masternode implementation
• Rebrand to Darkcoin +| 70002 | Dash Core 0.8.7
(Jan 2014) | Initial release of Dash (branded XCoin) as a fork of Litecoin 0.8 + +## Bitcoin Protocol Versions + +Historical Bitcoin protocol versions for reference shown below since Dash is a [fork](../resources/glossary.md#fork) of Bitcoin Core. + +| Version | Initial Release | Major Changes +|---------|------------------------------------|-------------- +| 70012 | Bitcoin Core 0.12.0
(Feb 2016) | [BIP130](https://github.com/bitcoin/bips/blob/master/bip-0130.mediawiki):
• Added [`sendheaders` message](../reference/p2p-network-control-messages.md#sendheaders). +| 70011 | Bitcoin Core 0.12.0
(Feb 2016) | [BIP111](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki):
• `filter*` messages are disabled without NODE_BLOOM after and including this version. +| 70002 | Bitcoin Core 0.9.0
(Mar 2014) | • Send multiple [`inv` messages](../reference/p2p-network-data-messages.md#inv) in response to a [`mempool` message](../reference/p2p-network-data-messages.md#mempool) if necessary

[BIP61](https://github.com/bitcoin/bips/blob/master/bip-0061.mediawiki):
• Added [`reject` message](../reference/p2p-network-deprecated-messages.md#reject) +| 70001 | Bitcoin Core 0.8.0
(Feb 2013) | • Added [`notfound` message](../reference/p2p-network-data-messages.md#notfound).

[BIP37](https://github.com/bitcoin/bips/blob/master/bip-0137.mediawiki):
• Added [`filterload` message](../reference/p2p-network-control-messages.md#filterload).
• Added [`filteradd` message](../reference/p2p-network-control-messages.md#filteradd).
• Added [`filterclear` message](../reference/p2p-network-control-messages.md#filterclear).
• Added [`merkleblock` message](../reference/p2p-network-data-messages.md#merkleblock).
• Added relay field to [`version` message](../reference/p2p-network-control-messages.md#version)
• Added `MSG_FILTERED_BLOCK` inventory type to [`getdata` message](../reference/p2p-network-data-messages.md#getdata). +| 60002 | Bitcoin Core 0.7.0
(Sep 2012) | [BIP35](https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki):
• Added [`mempool` message](../reference/p2p-network-data-messages.md#mempool).
• Extended [`getdata` message](../reference/p2p-network-data-messages.md#getdata) to allow download of memory pool transactions +| 60001 | Bitcoin Core 0.6.1
(May 2012) | [BIP31](https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki):
• Added nonce field to [`ping` message](../reference/p2p-network-control-messages.md#ping)
• Added [`pong` message](../reference/p2p-network-control-messages.md#pong) +| 60000 | Bitcoin Core 0.6.0
(Mar 2012) | [BIP14](https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki):
• Separated protocol version from Bitcoin Core version +| 31800 | Bitcoin Core 0.3.18
(Dec 2010) | • Added [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) and [`headers` message](../reference/p2p-network-data-messages.md#headers). +| 31402 | Bitcoin Core 0.3.15
(Oct 2010) | • Added time field to [`addr` message](../reference/p2p-network-control-messages.md#addr). +| 311 | Bitcoin Core 0.3.11
(Aug 2010) | • Added `alert` message. +| 209 | Bitcoin Core 0.2.9
(May 2010) | • Added checksum field to message headers. +| 106 | Bitcoin Core 0.1.6
(Oct 2009) | • Added receive IP address fields to [`version` message](../reference/p2p-network-control-messages.md#version). diff --git a/docs/core/reference/p2p-network-quorum-messages.md b/docs/core/reference/p2p-network-quorum-messages.md new file mode 100644 index 000000000..8d6311cc9 --- /dev/null +++ b/docs/core/reference/p2p-network-quorum-messages.md @@ -0,0 +1,823 @@ +```{eval-rst} +.. meta:: + :title: Quorum Messages + :description: The network messages in this section enable the long-living masternode quorum (LLMQ) features built in to Dash. +``` + +# Quorum Messages + +The following network messages enable the long-living masternode quorum ([LLMQ](../resources/glossary.md#long-living-masternode-quorum)) features built in to Dash. + +## Distributed Key Generation + +The following network messages enable the creation of long living masternode quorums (LLMQs) as described in [DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md). + +With the exception of the [`qfcommit` message](../reference/p2p-network-quorum-messages.md#qfcommit), these messages are for intra-quorum communication only and are not propagated on the Dash network. + +### qcontrib + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qcontrib` message](../reference/p2p-network-quorum-messages.md#qcontrib) is used by each member of the DKG process to send key contributions to all other members. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 32 | proTxHash | uint256 | The [ProRegTx](../reference/transactions-special-transactions.md#proregtx) hash of the complaining member +| 1-9 | vvecSize | compactSize uint | The size of the verification vector +| 48 * `vvecSize` | vvec | BLSPubKey[] | The verification vector +| 48 | ephemeralPubKey | BLSPubKey | Ephemeral BLS public key used to encrypt secret key contributions
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation +| 32 | iv | uint256 | Initialization vector +| 1-9 | skCount | compactSize uint | Number of encrypted secret key contributions +| (1 + 32) * (`skCount`) | skContributions | byte[] | Secret key contributions encrypted to recipient masternodes’ BLS public operator key.

Each contribution consists of:
- Size: 1 byte
- Secret Key: 32 bytes +| 96 | sig | byte[] | BLS signature, signed with the operator key of the contributing masternode
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +More information can be found in the [Contribution phase section of DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#2-contribution-phase). + +The following annotated hexdump shows a [`qcontrib` message](../reference/p2p-network-quorum-messages.md#qcontrib). (The message header has been omitted.) + +``` text +01 ........................................ LLMQ Type: 1 (LLMQ_50_60) + +cb9a1552340175a8232437eb8ceceaea +4b90a0f75caff20ee12d230b00000000 ........... Quorum Hash + +cd1c97c52ccf163ee5dc264d411efc90 +b07729cd34d9d2e7c7b3ca4b2a4e77cf ........... ProRegTx Hash + +1e ......................................... Verification Vector Size: 30 + +Verification Vector (Truncated) +| 8da71ba5030e28c6c4de5e0eb1660d0f +| a9fd21ef4fef700a556f10286c9c34fb +| beb36fffb5b2a552a40d6c8e27aac338 +| [...] +| 99d8649d226261162bcb5a11617d1732 +| 553b8358d85b1d9e12a88eb3e979fb7c +| e49b5a21a82a74e9d06233199cb73db4 ......... Verification Vector (1440 bytes) + +8d664929b596cdc8eb835d652944d61b +7fd21fd60ba0288af4f9e3a10658c8a8 +56467082c728e2037791166705ada03a ........... Ephemeral BLS Public Key + +93037a05b65adad6f5d44edc43500bff +71605f0e5f90ab92e3e0b46461c1c64d ........... IV Seed + +32 ......................................... Contribution count: 50 +Contributions +| Secret Key Contribution #1 +| | 20 ..................................... Contribution Size: 32 bytes +| | | 31f3e8e5b2cc2063ee7fd1dd469dca12 +| | | 4bdf506ee46fe825d5537aa3ce838225 ..... Encrypted Secret Key contribution +| +| Secret Key Contribution #2 +| | 20 ..................................... Contribution Size: 32 bytes +| | | a6b3ff696ffc5e0c0a9b444c515edc48 +| | | 5a9ccea0268c2a445fac5e24feda51a9 ..... Encrypted Secret Key contribution +| +| [...] .................................... 47 contributions omitted +| +| Secret Key Contribution #50 +| | 20 ..................................... Contribution Size: 32 bytes +| | | 25f54cff411a577db9a416a60067f512 +| | | 0750c77720207eb1484c90767b72faf8 ..... Encrypted Secret Key contribution + +81f1003546f6735849c5691af93d324d +3a719fc4bb6d719907de3bce9833228e +648d03cd80666d70600fa8c936d30046 +07bd444af3e494fb2a21273fcfa51986 +3c4e139c67d2ffe0df07ac27ae63a0c8 +e000da1aeda5f98ec9e64b801681bfc1 ........... BLS signature (Operator Key) +``` + +### qcomplaint + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qcomplaint` message](../reference/p2p-network-quorum-messages.md#qcomplaint) is used to notify other members in the DKG process of any members that provided no contribution or an invalid secret key contribution. The notifications are divided into 2 fields: + +* `badMembers` - Sets a bit for each member that failed to provide a contribution +* `complaints` - Sets a bit for each member that provided an invalid contribution + +If a threshold number of quorum participants indicate a masternode didn't contribute, that masternode will be excluded from the quorum. Members that simply have a complaint against them are given an opportunity to respond (via a [`qjustify` message](../reference/p2p-network-quorum-messages.md#qjustify)) to attempt to prove to all participants that they did participate. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 32 | proTxHash | uint256 | The [ProRegTx](../reference/transactions-special-transactions.md#proregtx) hash of the complaining member +| 1-9 | badBitSize | compactSize uint | Number of bits in the bad members bitvector +| (`badBitSize` + 7) / 8 | badMembers | byte[] | The bad members bitvector +| 1-9 | complaintsBitSize | compactSize uint | Number of bits in the complaints bitvector +| (`complaints`
`BitSize` + 7) / 8 | complaints | byte[] | The complaints bitvector +| 96 | sig | byte[] | BLS signature, signed with the operator key of the contributing masternode
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +More information can be found in the [Complaining phase section of DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#3-complaining-phase). + +The following annotated hexdump shows a [`qcomplaint` message](../reference/p2p-network-quorum-messages.md#qcomplaint). (The message header has been omitted.) + +``` text +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +b34b2bcb3430f403663e37be9c63c88e +4ca1f12c41846064cf960a0800000000 ........... Quorum Hash + +b375607540bd9c6e4a5452d8c7a6a626 +ec715222a0650321487843c79cac67d5 ........... ProRegTx hash + +32 ......................................... Bad member bitvector size: 50 +08800200004000 ............................. Bad members + +32 ......................................... Complaints bitvector size: 50 +00020080040000 ............................. Complaints + +0639b0e8ccb667c161207ddc03183d4e +bb632eeb60f29e351963032a673abd61 +3fb3e847dff78699481193cf385f0e08 +0fdf518e26ef1e258b724408b1ee9d70 +511696092b6c2ebfad5e24154a7f859f +0efe3fcb8d7042da624f7298876cc98e ........... BLS signature (Operator Key) +``` + +### qdata + +*Added in protocol version 70219 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qdata` message](../reference/p2p-network-quorum-messages.md#qdata) is used to send quorum DKG data to a node that has requested it via a [`qgetdata` message](../reference/p2p-network-quorum-messages.md#qgetdata). The response will include one or more of the following depending on what was requested: + +* Quorum verification vector for the request quorum +* Encrypted contributions for the request Protx hash + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 byte | quorumType | uint8_t | Type of the quorum the data is about. +| 32 bytes | quorumHash | uint256 | Hash of the quorum the data is about. +| 2 bytes | dataMask | uint16 | This value should be equal to the `dataMask` value of the requesting QGETDATA. +| 32 bytes | protxHash | uint256 | This is the protx hash of the member which can decrypt the data in `data_0002`. Included if 0x0002 is set in dataMask. +| 1 byte | error | uint8 | See [Possible error codes](#possible-error-codes) +| Variable | data_0001 | BLSVerificationVector | Included if `0x0001` is set in the `dataMask` value of the requesting QGETDATA. +| Variable | data_0002 | ``>[]` | Included if `0x0002` is set in the `dataMask` value of the requesting QGETDATA. + +**Verification Vector** + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1-9 | vvecSize | compactSize uint | The size of the verification vector +| 48 * `vvecSize` | vvec | BLSPubKey[] | The verification vector + +**Encrypted Contributions** + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 48 | ephemeralPubKey | BLSPubKey | Ephemeral BLS public key used to encrypt secret key contributions +| 32 | ivSeed | uint256 | Seed used to create the AES initialization vectors +| 1-9 | dataSize | compactSize uint | The size of the data +| Variable | data | unsigned char[] | Encrypted data + +#### Possible Error Codes + +| Value | Name | Description | +| - | - | - | +| 0x00 | None | No error, this value will be represented if the QGETDATA request could be processed successfully. +| 0x01 | `QUORUM_TYPE_INVALID` | The quorum type provided in the `quorumType` field is invalid. +| 0x02 | `QUORUM_BLOCK_NOT_FOUND` | The hash provided in the `quorumHash` field wasn’t found in the active chain. +| 0x03 | `QUORUM_NOT_FOUND` | The quorum (combination of type and hash) wasn’t found in the active chain. +| 0x04 | `MASTERNODE_IS_NO_MEMBER` | The masternode with the protx-hash provided in the `protxHash` field is not a valid member of the requested quorum. +| 0x05 | `QUORUM_VERIFICATION_VECTOR_MISSING` | The quorum verification vector for the requested quorum is missing internally. +| 0x06 | `ENCRYPTED_CONTRIBUTIONS_MISSING` | The encrypted contributions for the requested member are missing for the requested quorum internally. + +The following annotated hexdump shows a [`qdata` message](../reference/p2p-network-quorum-messages.md#qdata). (The message header has been omitted.) + +``` text +04 ......................................... LLMQ Type: 4 (LLMQ_100_67) + +250ff2f885949154570edb272d3bf64e +5fc3d8d63c4705aac106cd57da000000 ........... Quorum Hash + +0100 ....................................... Data mask: 1 (Verification Vector) + +8d7d9e4d9a10b8d5a1d2035d5427f8bb +c7ccb13df0c0e950b4d1b737808c2c72 ........... ProRegTx hash + +00 ......................................... Error Code: 0 (None) + +Data (Verification Vectors) +| 43 ....................................... Verification vector size: 0x43 (67) +| +| 0c59f5450d17b2b21e7ddccc8f86eb96 +| 20c02af428fc1c2fefe4a04fb2803025 ......... Verification vector 1 +| +| 9dcfe843af100de279ed9e7eb50cdebf +| 8158abdc37872fac3269d70a7a9ea462 ......... Verification vector 2 +| +| Data truncated +| +| e8d3467d381a2069c3006db78a099ba3 +| a1064d8d6782b8be7de610b37308a715 ......... Verification vector 67 +``` + +### qgetdata + +*Added in protocol version 70219 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qgetdata` message](../reference/p2p-network-quorum-messages.md#qgetdata) is used to request DKG data from a masternode. The response to a `qgetdata` message is a [`qdata` message](../reference/p2p-network-quorum-messages.md#qdata). These messages allows an LLMQ member to recover its DKG data if needed with the help of other members of that LLMQ type. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 2 | dataMask | uint16_t | Specifies what data to request:
`1` - Quorum verification vector
`2` - Encrypted contributions for member defined by `proTxHash` (`proTxHash` must be specified if this option is used)
`3` - Both verification vector and encrypted contributions +| 32 | proTxHash | uint256 | The [ProRegTx](../reference/transactions-special-transactions.md#proregtx) hash the contributions will be requested for. Must be a member of the specified LLMQ. + +The following annotated hexdump shows a [`qgetdata` message](../reference/p2p-network-quorum-messages.md#qgetdata). (The message header has been omitted.) + +``` text +04 ......................................... LLMQ Type: 4 (LLMQ_100_67) + +250ff2f885949154570edb272d3bf64e +5fc3d8d63c4705aac106cd57da000000 ........... Quorum Hash + +0100 ....................................... Data mask: 1 + +8d7d9e4d9a10b8d5a1d2035d5427f8bb +c7ccb13df0c0e950b4d1b737808c2c72 ........... ProRegTx hash +``` + +### qjustify + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qjustify` message](../reference/p2p-network-quorum-messages.md#qjustify) is used to respond to complaints. This provides a way for [nodes](../resources/glossary.md#node) that have been complained about to offer proof of correct behavior. If a valid justification is not provided, all other nodes mark it as a bad. If a valid justification is provided, the complaining node is marked as bad instead (since it submitted a bad complaint). + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 32 | proTxHash | uint256 | The [ProRegTx](../reference/transactions-special-transactions.md#proregtx) hash of the complaining member +| 1-9 | skContributions
Count | compactSize uint | Number of unencrypted secret key contributions +| 36 * `skContributions`
`Count` | skContribution | SKContribution | Member index and secret key contribution for members justifying complaints +| 96 | sig | byte[] | BLS signature, signed with the operator key of the contributing masternode
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +An `SKContribution` consists of: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 4 | skContributionMember | uint32_t | Index of the member for which justification is provided +| 32 | skContributions | byte[] | Unencrypted secret key contribution for the member contained in skContributionMember + +More information can be found in the [Justification phase section of DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#4-justification-phase). + +The following annotated hexdump shows a [`qjustify` message](../reference/p2p-network-quorum-messages.md#qjustify). (The message header has been omitted.) + +``` text +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +b34b2bcb3430f403663e37be9c63c88e +4ca1f12c41846064cf960a0800000000 ........... Quorum Hash + +e7d909afba6848f3fdf98b2da31db07e +3fbee621d58c469dce96d6283bcd4b25 ........... ProRegTx hash + +05 ......................................... Contribution count: 5 + +Contribution #1 +| 16000000 ................................. Member Index: 22 +| +| 57b63ec5ae0a101f0d93bb60af70bf22 +| c21bd3a7705e1aecb9559d6b151d953f ......... Unencrypted secret key contribution + +Contribution #2 +| 17000000 ................................. Member Index: 22 +| +| 0ee1f0f0f2570589e81d2a4f8165b105 +| 28436a1a75cf3469fa81090f2d856150 ......... Unencrypted secret key contribution + +[...] ...................................... 3 more contributions omitted + +8d63d10e242ac97c6324e9a40d6e690e +4bb7fe0750b7d204f7e988a324720189 +68408d2d0621bbaba8380ad4aaf342ea +138ce9a59ed9ca82995c155609488dcc +5ac35f483b695a0624e5ab0745f7f9e2 +051edf1b3b1f0e1b1d55d185d25e0ed7 ........... BLS signature (Operator Key) +``` + +### qpcommit + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qpcommit` message](../reference/p2p-network-quorum-messages.md#qpcommit) is used to exchange premature commitment messages for verification and selection of the final commitment. + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 32 | proTxHash | uint256 | The [ProRegTx](../reference/transactions-special-transactions.md#proregtx) hash of the complaining member +| 1-9 | validMembersSize | compactSize uint | Bit size of the `validMembers` bitvector +| (`valid`
`MembersSize` + 7) / 8 | validMembers | byte[] | Bitset of valid members in this commitment +| 48 | quorumPublicKey | uint256 | The quorum public key
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation +| 32 | quorumVvecHash | byte[] | The hash of the quorum verification vector +| 96 | quorumSig | BLSSig | Threshold signature, signed with the threshold signature share of the committing member
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation +| 96 | sig | byte[] | BLS signature, signed with the operator key of the contributing masternode
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +More information can be found in the [Commitment phase section of DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#5-commitment-phase). + +The following annotated hexdump shows a [`qpcommit` message](../reference/p2p-network-quorum-messages.md#qpcommit). (The message header has been omitted.) + +``` text +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +cb9a1552340175a8232437eb8ceceaea +4b90a0f75caff20ee12d230b00000000 ........... Quorum Hash + +59c38b8d6a0664411f92a6326e8ef070 +7ecf185405252854ddb477d89127a32d ........... ProRegTx hash + +32 ......................................... Valid member bitvector size: 50 +ffffffffffff03 ............................. Valid members + +102809b8649209a15fceb3984014eb39 +70ca9bd2464b2f84353a3353f4d612eb +7ca6daaf723170cdbdad40c5cf44f87b ........... Quorum BLS Public Key + +17431ce7dfecb9bba4ccba5921514d24 +fe267c61078bdfe29d90774a3b766ad5 ........... Quorum Verification Vector Hash + +94f7417e0ed56ada7116cf4f1e400748 +deb2e2040babd540f21925b2eec8d4df +75d3e0fc3323d083db76f66ce6128a13 +0f1b2c4725076dae2283bbecbf2e1230 +72cc9cec244337008bf82a670ab9e2ee +6220dd736a1a70c9ca87867ca55f8665 ........... BLS Threshold signature + +85723fe503bba8ac814eab0f28f1fd07 +49927528c01b635d11d3f2843ce3f7e1 +6223c7e9a9e1f70916159c965acae8bf +09d16dc85267ec4081907adc966eae69 +b6a5077267fdc61cdb192faffa27bed9 +2883559bab2ab81cef6253452622b30c ........... BLS signature (Operator Key) +``` + +### qfcommit + +The [`qfcommit` message](../reference/p2p-network-quorum-messages.md#qfcommit) is used to finalize a [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum) setup by aggregating the information necessary to mine the on-chain [QcTx](../reference/transactions-special-transactions.md#qctx) special transaction. The message contains all the necessary information required to validate the long-living masternode quorum's signing results. + +It is possible to receive multiple valid final commitments for the same DKG session. These should only differ in the number of signers, which can be ignored as long as there are at least `quorumThreshold` number of signers. The set of valid members for these final commitments should always be the same, as each member only creates a single premature commitment. This means that only one set of valid members (and thus only one quorum verification vector and quorum [public key](../resources/glossary.md#public-key)) can gain a majority. If the threshold is not reached, there will be no valid final commitment. + +:::{note} +* Version 2 (Dash Core 18.0) - updated the `qfcommit` message to support a [new method](https://github.com/dashpay/dips/blob/master/dip-0024.md) of quorum creation for some quorum types. Note the addition of the `quorumIndex` field in version 2 messages. +* Versions 3/4 (Dash Core 19.0) - `quorumPublicKey`, `quorumSig`, and `sig` serialized using the basic BLS scheme (versions <3 use the legacy BLS scheme). + +See the *Version differences summary* table below for more information. +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 2 | version | uint16_t | Version of the final commitment message +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum identifier +| 2 | quorumIndex | uint16_t | **Added in version 2**

The quorum index +| 1-9 | signersSize | compactSize uint | Bit size of the signers bitvector +| (bitSize + 7) / 8 | signers | byte[] | Bitset representing the aggregated signers of this final commitment +| 1-9 | validMembersSize | compactSize uint | Bit size of the `validMembers` bitvector +| (bitSize + 7) / 8 | validMembers | byte[] | Bitset of valid members in this commitment +| 48 | quorumPublicKey | BLSPubKey | The quorum public key
**Note**: serialization varies based on `version`:
\* Version <3 - legacy BLS scheme
\* Version >= 3 - basic BLS scheme +| 32 | quorumVvecHash | uint256 | The hash of the quorum verification vector +| 96 | quorumSig | byte[] | Recovered threshold signature
**Note**: serialization varies based on `version`:
\* Version <3 - legacy BLS scheme
\* Version >= 3 - basic BLS scheme +| 96 | sig | byte[] | Aggregated BLS signatures from all included commitments
**Note**: serialization varies based on `version`:
\* Version <3 - legacy BLS scheme
\* Version >= 3 - basic BLS scheme + +**Version differences summary** + +| Version | Version Description | `quorumIndex` field | Status | +| :-: | - | :-: | - | +| 1 | Non-rotated quorum `qfcommit` serialized using legacy BLS scheme | Absent | Deprecated by the v19 hard fork | +| 2 | [Rotated quorum](https://github.com/dashpay/dips/blob/master/dip-0024.md) `qfcommit` serialized using legacy BLS scheme | Present | Deprecated by the v19 hard fork | +| 3 | Non-rotated quorum `qfcommit` serialized using basic BLS scheme | Absent | Used since the v19 hard fork | +| 4 | [Rotated quorum](https://github.com/dashpay/dips/blob/master/dip-0024.md) `qfcommit` serialized using basic BLS scheme | Present | Used since the v19 hard fork | + +More information can be found in the [Finalization phase section of DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md#6-finalization-phase). + +The following annotated hexdump shows a *version 3* [`qfcommit` message](../reference/p2p-network-quorum-messages.md#qfcommit). (The message header has been omitted.) + +``` text +0300 ....................................... Message Version: 3 +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +05beb3edd9207ede3a42a15bbd04d597 +744f6f9db9b9a68a025c7e5637000000 ........... Quorum Hash + +32 ......................................... Signer bitvector size: 50 +ffffffffffff03 ............................. Signers + +32 ......................................... Valid member bitvector size: 50 +ffffffffffff03 ............................. Valid members + +91e6dfd0d8f33e4306afe0483d7649cc +68b5346f5c658206269083d49d2f1db7 +8eedd22eecf748404a1fe12e24f074e1 ........... Quorum BLS Public Key + +bc7da59621015e70e31310982e66acfe +25468daede7142234e7f3bf3b3297b21 ........... Quorum Verification Vector Hash + +99f4d8af79cf99ba49c8c9295cbc0827 +b2b6611a905dc347eec9ecbe6ec6ec64 +c167ca252f2fc0ff772394c696c58f0c +0e00c4f556ab528e07d06d2e57391fd1 +0c57e0521e43f8dfcfc8448665d41eba +7c103b915506476672b531b9ceca266f ........... Quorum BLS Recovered Threshold Sig + +8f7bb2a10d4cbf6fe7c6cfc1ec52817f +97f025ba9c4c52ac4cfa02ba1c28f3aa +fb83c2f4b246f730b5e4aac36e9479d5 +0d72db9055dbdc9e2c27dee6f876be66 +928abbdf636d1405c59a5e35d4775049 +97f0e3b5acd2c53448deaaf61fed9343 ........... Quorum Aggregate BLS Sig +``` + +The following annotated hexdump shows the structure of a *version 4* [`qfcommit` +message](../reference/p2p-network-quorum-messages.md#qfcommit). (The message header has been +omitted.) Note that this is not an actual message from a real network so the BLS and signature data +cannot be verified. + +``` text +0400 ....................................... Message Version: 4 +65 ......................................... LLMQ Type: 101 (LLMQ_DEVNET) + +d3b0d23936c7c2f1d3fff8a8b92212af +511defff89d255e85a4ef8cdfb010000 ........... Quorum Hash + +0100 ....................................... Quorum Index (1) + +08 ......................................... Signer bitvector size: 8 +fb ......................................... Signers + +08 ......................................... Valid member bitvector size: 8 +fb ......................................... Valid members + +165b0f73242d61f89b4eb7d36e25fb01 +808d94c1a2e7c74cd7f6b3fc8e384642 +0da3459f6c0e5a4fc021f4ce9125a10c ........... Quorum BLS Public Key + +83846dbe1e0b71ce7011c321810fd7ba +00768b84bb4c0c6b2ad25dee02c34eed ........... Quorum Verification Vector Hash + +14710c202aaae8d3a825afc19a7ea1f9 +be2b567a0423d8cd8c72354e4daa02c4 +65d2e591218a6608722eb40eba322e2a +0090860548d3b8613a644ed71a4795e3 +37aae3251fe0e077ccaab7432c564e39 +cc427677fd92189c0b41d6f306581577 ........... Quorum BLS Recovered Threshold Sig + +9250b9a40b7e0f4773715540256ab99f +8854970a0fe3313997bac10cef0a5b9f +f33100bfba8f60342fd3a0cac17af370 +11a7594d8391b6ca1e3b987c5ed1e9d0 +7cb35789e1ab4c340902ae99bce94879 +5ee9bc60d59b3aad2eea15dea15d8093 ........... Quorum Aggregate BLS Sig +``` + +## Signing Sessions + +The following network messages enable the long living masternode quorum (LLMQ) message signing sessions described in [DIP7](https://github.com/dashpay/dips/blob/master/dip-0007.md). + +With the exception of the [`qsendrecsigs` message](../reference/p2p-network-quorum-messages.md#qsendrecsigs) and the [`qsigrec` message](../reference/p2p-network-quorum-messages.md#qsigrec), these messages are for intra-quorum communication only and are not propagated on the Dash network. + +### qbsigs + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qbsigs` message](../reference/p2p-network-quorum-messages.md#qbsigs) is used to send batched signature shares in response to a [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs). + +:::{note} +The number of messages that can be sent in a batch is limited to 400 (as defined by `MAX_MSGS_TOTAL_BATCHED_SIGS` in Dash Core). +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | batchCount | compactSize uint | Number of batched signature shares | +| Varies | msgs | CBatchedSigShares | Batches of signature shares | + +CBatchedSigShares: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | sessionId | varint | Signing session ID | +| Varies | shareCount | compactSize uint | Number of shares | +| shareCount * 98 | sigShares | | Index (2 bytes) and BLS Signature share (96 bytes) | + +The following annotated hexdump shows a [`qbsigs` message](../reference/p2p-network-quorum-messages.md#qbsigs). (The message header has been omitted.) + +``` text +02 ......................................... Number of signature share batches: 2 + +Signature Share Batch 1 +| 84d843 ................................... Session ID +| +| 01 ....................................... Share count: 1 +| +| Share +| | 2100 ................................... Index +| +| | 0fbd0c0981b79544c3e80d1a2eed13fe +| | f08c731b0156654675209812f9b2b8f3 +| | ec23868d26890a0e85e5cec4ad0e2d46 +| | 01293cf7e41841fda5865063e7354f36 +| | e8a5c13d2c2d265a778f41e807b3cc63 +| | 81e202ecf923c62bbb69ecc713bdf86d ....... BLS Signature share + +Signature Share Batch 2 +| 84d844 ................................... Session ID +| +| 01 ....................................... Share Count: 1 +| +| Share +| | 2100 ................................... Index +| | +| | 9570d97e41b78045b51fba3d4f1ea38d +| | 7a0e007535ce6beb1e03eff163b421fd +| | b8125142a12f92aa82770de7bb038207 +| | 13ccc72dd6d9bf91ecc2835da54a0afb +| | 0c0fa5d7a214a020ca650ca202ddff29 +| | c3cac4033098297d2aaee098db5bfe2f ....... BLS Signature share +``` + +### qgetsigs + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs) is used to request signature shares. The response to a [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs) is a [`qbsigs` message](../reference/p2p-network-quorum-messages.md#qbsigs). + +:::{note} +The number of inventories in a [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs) is limited to 200 (as defined by `MAX_MSGS_CNT_QGETSIGSHARES` in Dash Core). +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | count | compactSize uint | Number of signature shares requested | +| Varies | sessionId | varint | Signing session ID +| Varies | invSize | compactSize uint | Inventory size +| Varies | inv | CAutoBitSet | Quorum signature inventory | + +The following annotated hexdump shows a [`qgetsigs` message](../reference/p2p-network-quorum-messages.md#qgetsigs). (The message header has been omitted.) + +``` text +02 ......................................... Count: 2 + +Signature share request 1 +| 80db21 ................................... Session ID +| 32 ....................................... Inventory size: 50 +| 012900 ................................... Inventory + +Signature share request 2 +| 80db22 ................................... Session ID +| 32 ....................................... Inventory Size: 50 +| 012900 ................................... Inventory +``` + +### qsendrecsigs + +*Added in protocol version 70214 of Dash Core* + +The [`qsendrecsigs` message](../reference/p2p-network-quorum-messages.md#qsendrecsigs) is used to notify a [peer](../resources/glossary.md#peer) to send plain [LLMQ](../resources/glossary.md#long-living-masternode-quorum) recovered signatures (inventory type `MSG_QUORUM_RECOVERED_SIG`). Otherwise the peer would only announce/send the higher level messages produced when a recovered signature is found (e.g. InstantSend [`isdlock` messages](../reference/p2p-network-instantsend-messages.md#isdlock) or ChainLock [`clsig` messages](../reference/p2p-network-instantsend-messages.md#clsig)). + +:::{note} +SPV nodes should not send this message as they are usually only interested in the higher level messages. +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | fSendRecSigs | bool | 0 - Notify peer to not send plain LLMQ recovered signatures
1 - Notify peer to send plain LLMQ recovered signatures (default for Dash Core nodes) + +The following annotated hexdump shows a [`qsendrecsigs` message](../reference/p2p-network-quorum-messages.md#qsendrecsigs). (The message header has been omitted.) + +``` text +01 ................................. Request recovered signatures: Enabled (1) +``` + +### qsigrec + +*Added in protocol version 70214 of Dash Core* + +The [`qsigrec` message](../reference/p2p-network-quorum-messages.md#qsigrec) is used to provide recovered signatures and related quorum details to [nodes](../resources/glossary.md#node) that have requested this information via the [`qsendrecsigs` message](../reference/p2p-network-quorum-messages.md#qsendrecsigs). + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum hash +| 32 | id | uint256 | The signing request id +| 32 | msgHash | uint256 | The message hash +| 96 | sig | byte[] | The final recovered BLS threshold signature
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +More information can be found in the [Recovered threshold signatures section of DIP7](https://github.com/dashpay/dips/blob/master/dip-0007.md#recovered-threshold-signatures). + +The following annotated hexdump shows a [`qsigrec` message](../reference/p2p-network-quorum-messages.md#qsigrec). (The message header has been omitted.) + +**Note:** The following [`qsigrec` message](../reference/p2p-network-quorum-messages.md#qsigrec) corresponds to the example [`islock` message](../reference/p2p-network-deprecated-messages.md#islock) hexdump. The message hash below corresponds to the `islock` TXID field and the BLS signature matches the BLS signature of the `islock` example. + +``` text +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +7d0befca14fa9e594aa19deab138ef28 +23fe838c89ed9be6ddc63c0200000000 ........... Quorum Hash + +0f1937c60f35640d063eae8eb288af21 +a2ec0ec69b58b20c52f5d438eaabd54d ........... Signing Request ID + +e2e1c797576d8b13c83e929684b9aacd +553c20a34e2d11e38bdcaaf8e1de1680 ........... Message Hash + +0f055c2064885d446f83d51b9bb09892 +7ea0375a0f6a3f3402abf158ece67e00 +81049b8a8f45d254b64574cef194ef31 +197e450fba1196d652f2e1421d3b80ae +f429c10eabd4ab9289e9a8f80f6989b7 +a11e5e7930deccc3e11a931fc9524f06 ........... LLMQ BLS Signature (96 bytes) +``` + +### qsigsesann + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qsigsesann` message](../reference/p2p-network-quorum-messages.md#qsigsesann) is used to announce the sessionId for a signing session. The sessionId will be used for all P2P messages related to that session. + +:::{note} +The maximum number of inventories in a [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv) is limited to 200 (as defined by `MAX_MSGS_CNT_QSIGSHARESINV` in Dash Core). +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | count | compactSize uint | Number of session announcements | +| Varies | sessionId | varint | Signing session ID (must be less than the maximum uint32_t value) +| 1 | llmqType | uint8_t | The LLMQ type +| 32 | quorumHash | uint256 | The quorum identifier +| 32 | id | uint256 | The signing request id +| 32 | msgHash | uint256 | The message hash + +The following annotated hexdump shows a [`qsigsesann` message](../reference/p2p-network-quorum-messages.md#qsigsesann). (The message header has been omitted.) + +``` text +02 ......................................... Count: 2 + +Session Announcement 1 +| 84d843 ................................... Session ID +| +| 01 ....................................... LLMQ Type: 1 (LLMQ_50_60) +| +| a34d3ae6b33cb1199c3e5e1cb5a2a55c +| 91e69bb5df2bf80ba1cb0a0d00000000 ......... Quorum Hash +| +| 89bbc2e5741a9f706e8d33dee4132037 +| 8c33511768c5e3d6cdb2a1b7b731360b ......... Signing request ID +| +| d2b41a19237e370b4b091545b203bc0c +| 02ca7e0d5daebf12bb24b13064ed4149 ......... Message Hash + +Session Announcement 2 +| 84d844 ................................... Session ID +| +| 01 ....................................... LLMQ Type: 1 (LLMQ_50_60) +| +| a34d3ae6b33cb1199c3e5e1cb5a2a55c +| 91e69bb5df2bf80ba1cb0a0d00000000 ......... Quorum Hash +| +| 54f73deb42a8ed9b72b9c0535a72f54d +| 5789bbe0dbea2e184c3089f9e8f65c3e ......... Signing request ID +| +| af2e5d730cd37cd911b92db117b4ab99 +| 90a3c0300ce39177d0d31be5b47c2361 ......... Message Hash +``` + +### qsigshare + +*Added in protocol version 70217 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qsigshare` message](../reference/p2p-network-quorum-messages.md#qsigshare) (quorum signature share) announces one or more quorum signature shares known by the transmitting peer. + +:::{note} +The maximum number of inventories in a [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv) is limited to 200 (as defined by `MAX_MSGS_CNT_QSIGSHARESINV` in Dash Core). +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | count | compactSize uint | Number of sig share announcements | +| 1 | llmqType | uint8_t | The type of LLMQ +| 32 | quorumHash | uint256 | The quorum hash +| 32 | id | uint256 | The signing request id +| 32 | msgHash | uint256 | The message hash +| 96 | sigShare | byte[] | The final recovered BLS threshold signature
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation + +The following annotated hexdump shows a [`qsigshare` message](../reference/p2p-network-quorum-messages.md#qsigshare). (The message header has been omitted.) + +``` text +01 ......................................... Count: 1 + +01 ......................................... LLMQ Type: 1 (LLMQ_50_60) + +613bc036d2a2f8914a28dafd04c7d61e +238d1a10703769d166706d4178010000 ........... Quorum Hash + +0300 ....................................... Quorum Member + +ac520a15c20b7dd115103dd9ccabee71 +32a8bc8e1f258250f5fabdd1a2a0ef0e ........... Message ID + +69779b1c59a524738ed9bd6e66c3c5f9 +cd4b9bd93ebb83069eaab77dff30ca48 ........... Message Hash + +0671499594b4a811d29b009f647215f0 +32ac7ad90a76589ab91d20ac876daac1 +8e20ae1901be093ade77c8fbc54a7927 +11f397d025d3690ff48bfb476ab23ad0 +8b68a618a63bb0319cf286902307a5be +a277386b48a7ae627d075da826aab694 ......... Signature Share +``` + +### qsigsinv + +*Added in protocol version 70214 of Dash Core* + +:::{note} +This message is used for intra-quorum communication and is only sent to the [masternodes](../resources/glossary.md#masternode) in the LLMQ and [nodes](../resources/glossary.md#node) that are monitoring in Watch Mode for auditing/debugging purposes. +::: + +The [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv) (quorum signature inventory) announces one or more quorum signature share inventories known by the transmitting peer. + +Info callout + +:::{note} +The maximum number of inventories in a [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv) is limited to 200 (as defined by `MAX_MSGS_CNT_QSIGSHARESINV` in Dash Core). +::: + +| Bytes | Name | Data type | Description | +| --- | --- | --- | --- | +| Varies | count | compactSize uint | Number of session announcements | +| Varies | sessionId | varint | Signing session ID (must be less than the maximum uint32_t value) | +| Varies | invSize | compactSize uint | Inventory size +| Varies | inv | CAutoBitSet | Quorum signature inventory | + +The following annotated hexdump shows a [`qsigsinv` message](../reference/p2p-network-quorum-messages.md#qsigsinv). (The message header has been omitted.) + +``` text +02 ......................................... Count: 2 + +84d844 ..................................... Session ID +32 ......................................... Inventory size: 50 +011a040200 ................................. Inventory + +84d843 ..................................... Session ID +32 ......................................... Inventory size: 50 +011a0700 ................................... Inventory +``` + +## Debugging + +### qwatch + +*Added in protocol version 70214 of Dash Core* + +The [`qwatch` message](../reference/p2p-network-quorum-messages.md#qwatch) tells the receiving [peer](../resources/glossary.md#peer) to relay [LLMQ](../resources/glossary.md#long-living-masternode-quorum) [DKG messages](#distributed-key-generation) and [Signing session messages](#signing-sessions) (e.g., [`qcontrib`](../reference/p2p-network-quorum-messages.md#qcontrib)). + +This message is sent when a Dash Core node is started with the [`-watchquorums` option](../dashcore/wallet-arguments-and-commands-dashd.md#debuggingtesting-options) enabled. + +There is no payload in a [`qwatch` message](../reference/p2p-network-quorum-messages.md#qwatch). See the [message header section](../reference/p2p-network-message-headers.md) for an example of a message without a payload. diff --git a/docs/core/reference/p2p-network.md b/docs/core/reference/p2p-network.md new file mode 100644 index 000000000..f094fa0ec --- /dev/null +++ b/docs/core/reference/p2p-network.md @@ -0,0 +1,31 @@ +```{eval-rst} +.. meta:: + :title: P2P Networks + :description: This section provides an overview of the Dash P2P network protocol (not a specification). +``` + +# P2P Networks + +This section describes the Dash P2P network protocol (but it is not a specification). It does not describe the [BIP70 payment protocol](../resources/glossary.md#bip70-payment-protocol), the [GetBlockTemplate mining protocol](../guide/mining-block-prototypes.md#getblocktemplate-rpc), or any network protocol never implemented in an official version of Dash Core. + +All peer-to-peer communication occurs entirely over TCP. + +**Note**: Unless their description says otherwise, all multi-byte integers mentioned in this section are transmitted in little-endian order. + +Worldwide network + +```{toctree} +:maxdepth: 2 + +p2p-network-constants-and-defaults +p2p-network-protocol-versions +p2p-network-message-headers +p2p-network-control-messages +p2p-network-data-messages +p2p-network-governance-messages +p2p-network-instantsend-messages +p2p-network-masternode-messages +p2p-network-privatesend-messages +p2p-network-quorum-messages +p2p-network-deprecated-messages +``` diff --git a/docs/core/reference/transactions-address-conversion.md b/docs/core/reference/transactions-address-conversion.md new file mode 100644 index 000000000..ab0ef3cc4 --- /dev/null +++ b/docs/core/reference/transactions-address-conversion.md @@ -0,0 +1,57 @@ +```{eval-rst} +.. meta:: + :title: Address Conversion + :description: The hashes used in P2PKH and P2SH outputs are commonly encoded as Dash addresses. This is the procedure to encode those hashes and decode the addresses. +``` + +# Address Conversion + +The hashes used in P2PKH and [P2SH outputs](../resources/glossary.md#p2sh-output) are commonly encoded as Dash [addresses](../resources/glossary.md#address). This is the procedure to encode those hashes and decode the addresses. + +## Conversion Process + +First, get your hash. For P2PKH, you RIPEMD-160(SHA256()) hash a ECDSA [public key](../resources/glossary.md#public-key) derived from your 256-bit ECDSA [private key](../resources/glossary.md#private-key) (random data). For P2SH, you RIPEMD-160(SHA256()) hash a [redeem script](../resources/glossary.md#redeem-script) serialized in the format used in [raw transactions](../resources/glossary.md#raw-transaction) (described in a [following sub-section](../reference/transactions-raw-transaction-format.md)). Taking the resulting hash: + +1. Add an [address](../resources/glossary.md#address) version byte in front of the hash. The version bytes commonly used by Dash are: + + * 0x4c for [P2PKH addresses](../resources/glossary.md#p2pkh-address) on the main Dash network ([mainnet](../resources/glossary.md#mainnet)) + + * 0x8c for [P2PKH addresses](../resources/glossary.md#p2pkh-address) on the Dash testing network ([testnet](../resources/glossary.md#testnet)) + + * 0x10 for [P2SH addresses](../resources/glossary.md#p2sh-address) on [mainnet](../resources/glossary.md#mainnet) + + * 0x13 for [P2SH addresses](../resources/glossary.md#p2sh-address) on [testnet](../resources/glossary.md#testnet) + +2. Create a copy of the version and hash; then hash that twice with SHA256: `SHA256(SHA256(version . hash))` + +3. Extract the first four bytes from the double-hashed copy. These are used as a checksum to ensure the base hash gets transmitted correctly. + +4. Append the checksum to the version and hash, and encode it as a [base58](../resources/glossary.md#base58) string: `BASE58(version . hash . checksum)` + +## Example Code + +Dash's base58 encoding, called [Base58Check](../resources/glossary.md#base58check) may not match other implementations. Tier Nolan provided the following example encoding algorithm to the Bitcoin Wiki [Base58Check encoding](https://en.bitcoin.it/wiki/Base58Check_encoding) page under the [Creative Commons Attribution 3.0 license](https://creativecommons.org/licenses/by/3.0/): + +``` c +code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" +x = convert_bytes_to_big_integer(hash_result) + +output_string = "" + +while(x > 0) + { + (x, remainder) = divide(x, 58) + output_string.append(code_string[remainder]) + } + +repeat(number_of_leading_zero_bytes_in_hash) + { + output_string.append(code_string[0]); + } + +output_string.reverse(); +``` + +Dash's own code can be traced using the [base58 header file](https://github.com/dashpay/dash/blob/master/src/base58.h). + +To convert addresses back into hashes, reverse the base58 encoding, extract the checksum, repeat the steps to create the checksum and compare it against the extracted checksum, and then remove the version byte. diff --git a/docs/core/reference/transactions-compactsize-unsigned-integers.md b/docs/core/reference/transactions-compactsize-unsigned-integers.md new file mode 100644 index 000000000..c669e1485 --- /dev/null +++ b/docs/core/reference/transactions-compactsize-unsigned-integers.md @@ -0,0 +1,22 @@ +```{eval-rst} +.. meta:: + :title: CompactSize Unsigned Integers + :description: CompactSize unsigned integers are used in the raw transaction format and peer-to-peer network messages. +``` + +# CompactSize Unsigned Integers + +The [raw transaction](../resources/glossary.md#raw-transaction) format and several peer-to-peer network messages use a type of variable-length integer to indicate the number of bytes in a following piece of data. + +Dash Core code and this document refers to these variable length integers as compactSize. Many other documents refer to them as var_int or varInt, but this risks conflation with other variable-length integer encodings---such as the CVarInt class used in Dash Core for serializing data to disk. Because it's used in the transaction format, the format of compactSize unsigned integers is part of the [consensus rules](../resources/glossary.md#consensus-rules). + +For numbers from 0 to 252 (0xfc), compactSize unsigned integers look like regular unsigned integers. For other numbers up to 0xffffffffffffffff, a byte is prefixed to the number to indicate its length---but otherwise the numbers look like regular unsigned integers in little-endian order. + +| Value | Bytes Used | Format +|-----------------------------------------|------------|----------------------------------------- +| >= 0 && <= 0xfc (252) | 1 | uint8_t +| >= 0xfd (253) && <= 0xffff | 3 | 0xfd followed by the number as uint16_t +| >= 0x10000 && <= 0xffffffff | 5 | 0xfe followed by the number as uint32_t +| >= 0x100000000 && <= 0xffffffffffffffff | 9 | 0xff followed by the number as uint64_t + +For example, the number 515 is encoded as 0xfd0302. diff --git a/docs/core/reference/transactions-opcodes.md b/docs/core/reference/transactions-opcodes.md new file mode 100644 index 000000000..6adbc9aaf --- /dev/null +++ b/docs/core/reference/transactions-opcodes.md @@ -0,0 +1,111 @@ +```{eval-rst} +.. meta:: + :title: Opcodes + :description: Base Opcodes are used in the pubkey scripts of standard transactions. DIP 20 also reintroduced a number of these opcodes based on work done by Bitcoin Cash developers. +``` + +# Opcodes + +## Base Opcodes + +The [opcodes](../resources/glossary.md#opcode) used in the pubkey scripts of standard [transactions](../resources/glossary.md#transaction) are: + +* Various data pushing opcodes from 0x00 to 0x4e (1--78). These aren't typically shown in examples, but they must be used to push [signatures](../resources/glossary.md#signature) and [public keys](../resources/glossary.md#public-key) onto the stack. See the link below this list for a description. + +* `OP_TRUE`/`OP_1` (0x51) and `OP_2` through `OP_16` (0x52--0x60), which push the values 1 through 16 to the stack. + +* `OP_VERIFY` (0x69) consumes the topmost item on the stack. If that item is zero (false) it terminates the script in failure. + +* `OP_RETURN` (0x6a) terminates the script in failure when executed. + +* `OP_DUP` (0x76) pushes a copy of the topmost stack item on to the stack. + +* `OP_EQUAL` (0x87) consumes the top two items on the stack, compares them, and pushes true onto the stack if they are the same, false if not. + +* `OP_EQUALVERIFY` (0x88) runs `OP_EQUAL` and then `OP_VERIFY` in sequence. + +* `OP_HASH160` (0xa9) consumes the topmost item on the stack, computes the RIPEMD160(SHA256()) hash of that item, and pushes that hash onto the stack. + +**** + +* `OP_CHECKSIG` (0xac) consumes a signature and a full public key, and pushes true onto the stack if the transaction data specified by the [SIGHASH flag](../resources/glossary.md#sighash-flag) was converted into the signature using the same [ECDSA private key](../resources/glossary.md#ecdsa-private-key) that generated the public key. Otherwise, it pushes false onto the stack. + +* `OP_CHECKMULTISIG` (0xae) consumes the value (n) at the top of the stack, consumes that many of the next stack levels (public keys), consumes the value (m) now at the top of the stack, and consumes that many of the next values (signatures) plus one extra value. + + The "one extra value" it consumes is the result of an off-by-one error in the Bitcoin Core implementation. This value is not used, so signature scripts prefix the list of [secp256k1 signatures](../resources/glossary.md#secp256k1-signatures) with a single OP_0 (0x00). + + `OP_CHECKMULTISIG` compares the first signature against each public key until it finds an [ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) match. Starting with the subsequent public key, it compares the second signature against each remaining public key until it finds an ECDSA match. The process is repeated until all signatures have been checked or not enough public keys remain to produce a successful result. + + Because public keys are not checked again if they fail any signature comparison, signatures must be placed in the signature script using the same order as their corresponding public keys were placed in the [pubkey script](../resources/glossary.md#pubkey-script) or [redeem script](../resources/glossary.md#redeem-script). See the `OP_CHECKMULTISIG` warning below for more details. + +A complete list of Bitcoin opcodes can be found on the Bitcoin Wiki [Script Page](https://en.bitcoin.it/wiki/Script), with an authoritative list in the `opcodetype` enum of the Dash Core [script header file](https://github.com/dashpay/dash/blob/master/src/script/script.h). + +## Expanded Opcodes + +Several opcodes were disabled in the Bitcoin scripting system due to the discovery of a series of bugs in the early days of Bitcoin. [Dash Improvement Proposal 20](https://github.com/dashpay/dips/blob/master/dip-0020.md) reintroduced a number of these opcodes based on work done by Bitcoin Cash developers. Many of the disabled opcodes have been enabled and several of them re-designed to replace the original ones. The following opcodes were added/reactivated in Dash Core 0.17.0 as described in [DIP 20](https://github.com/dashpay/dips/blob/master/dip-0020.md). + +* `OP_CAT` (0x7e) concatenates two byte arrays. + +* `OP_SPLIT` (0x7f) Split byte array `x` at position `n`. *This opcode was disabled and named `OP_SUBSTR` prior to Dash Core 0.17.0*. + +* `OP_NUM2BIN` (0x80) Convert numeric `a` into byte array of length `b`. *This opcode was disabled and named `OP_LEFT` prior to Dash Core 0.17.0*. + +* `OP_BIN2NUM` (0x81) Convert byte array `x` into numeric. *This opcode was disabled and named `OP_RIGHT` prior to Dash Core 0.17.0*. + +* `OP_AND` (0x84) Boolean *AND* between each bit in the operands. + +* `OP_OR` (0x85) Boolean *OR* between each bit in the operands. + +* `OP_XOR` (0x86) Boolean *EXCLUSIVE OR* between each bit in the operands. + +* `OP_DIV` (0x96) Return the integer quotient of `a` and `b`. If the result would be a non-integer it is rounded towards zero. `a` and `b` are interpreted as numeric values. + +* `OP_MOD` (0x97) Returns the remainder after dividing `a` by `b`. The output will be represented using the least number of bytes required. `a` and `b` are interpreted as numeric values. + +* `OP_CHECKDATASIG` (0xba) Checks whether a signature is valid with respect to a message and a public key. It allows Script to validate arbitrary messages from outside the blockchain. + +* `OP_CHECKDATASIGVERIFY` (0xbb) `OP_CHECKDATASIGVERIFY` is equivalent to `OP_CHECKDATASIG` followed by `OP_VERIFY`. It leaves nothing on the stack and will cause the script to fail immediately if the signature check does not pass. + +## Signature Scripts + +### Signature Script Modification + +![Warning icon](../../img/icons/icon_warning.svg) **Signature script modification warning:** [Signature scripts](../resources/glossary.md#signature-script) are not signed, so anyone can modify them. This means signature scripts should only contain data and [data-pushing opcode](../resources/glossary.md#data-pushing-opcode) which can't be modified without causing the pubkey script to fail. Placing non-data-pushing opcodes in the signature script currently makes a transaction non-standard, and future consensus rules may forbid such transactions altogether. (Non-data-pushing opcodes are already forbidden in signature scripts when spending a [P2SH pubkey script](../resources/glossary.md#p2sh-pubkey-script).) + +### Multisig Signature Order + +![Warning icon](../../img/icons/icon_warning.svg) **`OP_CHECKMULTISIG` warning:** The [multisig](../resources/glossary.md#multisig) verification process described above requires that signatures in the signature script be provided in the same order as their corresponding public keys in the pubkey script or redeem script. For example, the following combined signature and pubkey script will produce the stack and comparisons shown: + +``` text +OP_0 OP_2 OP_3 + +Sig Stack Pubkey Stack (Actually a single stack) +--------- ------------ +B sig C pubkey +A sig B pubkey +OP_0 A pubkey + +1. B sig compared to C pubkey (no match) +2. B sig compared to B pubkey (match #1) +3. A sig compared to A pubkey (match #2) + +Success: two matches found +``` + +But reversing the order of the signatures with everything else the same will fail, as shown below: + +``` text +OP_0 OP_2 OP_3 + +Sig Stack Pubkey Stack (Actually a single stack) +--------- ------------ +A sig C pubkey +B sig B pubkey +OP_0 A pubkey + +1. A sig compared to C pubkey (no match) +2. A sig compared to B pubkey (no match) + +Failure, aborted: two signature matches required but none found so + far, and there's only one pubkey remaining +``` diff --git a/docs/core/reference/transactions-raw-transaction-format.md b/docs/core/reference/transactions-raw-transaction-format.md new file mode 100644 index 000000000..7f6753e55 --- /dev/null +++ b/docs/core/reference/transactions-raw-transaction-format.md @@ -0,0 +1,223 @@ +```{eval-rst} +.. meta:: + :title: Raw Transaction Format + :description: Dash transactions are broadcast in a serialized raw format, which is hashed to create the TXID and merkle root, complying with the consensus rules. +``` + +# Raw Transaction Format + +Dash transactions are broadcast between [peers](../resources/glossary.md#peer) in a serialized byte format, called [raw format](../resources/glossary.md#raw-format). It is this form of a transaction which is SHA256(SHA256()) hashed to create the [TXID](../resources/glossary.md#transaction-identifiers) and, ultimately, the [merkle root](../resources/glossary.md#merkle-root) of a [block](../resources/glossary.md#block) containing the transaction---making the transaction format part of the [consensus rules](../resources/glossary.md#consensus-rules). + +Dash Core and many other tools print and accept [raw transactions](../resources/glossary.md#raw-transaction) encoded as hex. + +Transactions prior to protocol version 70209 defaulted to version 1. Transaction version 2 was the default in protocol versions => 70209 and < 70213. Version 2 transactions have the same format, but the `lock_time` parameter was redefined by [BIP68](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki) to enable relative lock-times. (Note: transactions in the [block chain](../resources/glossary.md#block-chain) are allowed to list a higher version number to permit [soft forks](../resources/glossary.md#soft-fork), but they are treated as version 2 transactions by current software.) + +Dash Core 0.13.0 (protocol version 70213) introduced transaction version 3 as part of the [DIP2 - Special Transactions](https://github.com/dashpay/dips/blob/master/dip-0002.md) implementation. Details of the changes introduced by this feature and currently implemented [special transactions](../resources/glossary.md#special-transactions) can be found in the [Special Transactions section](../reference/transactions-special-transactions.md) below as well as in the [DIP](https://github.com/dashpay/dips/blob/master/dip-0002.md). + +A raw transaction has the following top-level format: + +| Bytes | Name | Data Type | Description +|----------|--------------|---------------------|------------- +| 2 | version | uint16_t | *Converted from 4 bytes to 2 bytes by DIP2 in v0.13.0*

Transaction version number; currently version 3. Programs creating transactions using newer consensus rules may use higher version numbers. +| 2 | type | uint16_t | *Added by DIP2 in v0.13.0. Uses 2 bytes that were previously part of `version`*

Transaction type number; 0 for classical transactions; Non-zero for DIP2 special transactions. +| *Varies* | tx_in count | compactSize uint | Number of inputs in this transaction. +| *Varies* | tx_in | txIn | Transaction inputs. See description of txIn below. +| *Varies* | tx_out count | compactSize uint | Number of outputs in this transaction. +| *Varies* | tx_out | txOut | Transaction outputs. See description of txOut below. +| 4 | lock_time | uint32_t | A time (Unix epoch time) or block number. See the [locktime parsing rules](../guide/transactions-locktime-and-sequence-number.md). +| *Varies* | extra_payload size | compactSize uint | *Added by DIP2 in v0.13.0*

Variable number of bytes of extra payload for DIP2-based special transactions +| *Varies* | extra_payload | blob | *Added by DIP2 in v0.13.0*

Special transaction payload. + +A transaction may have multiple [inputs](../resources/glossary.md#input) and [outputs](../resources/glossary.md#output), so the txIn and txOut structures may recur within a transaction. [CompactSize unsigned integers](../resources/glossary.md#compactsize) are a form of variable-length integers; they are described in the [CompactSize section](../reference/transactions-compactsize-unsigned-integers.md). + +## JSON-RPC Responses + +When retrieving transaction data via Dash Core RPCs (e.g. the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction)), the transaction data is returned in the following format. + +Version 1 and 2 Transaction Structure (prior to DIP2 activation in Dash Core v0.13.0): + +``` json +{ + "txid": "", + "size": "", + "version": 2, + "locktime": 0, + "vin": [ ], + "vout": [ ] +} +``` + +Version 3 Transaction Structure (Dash Core v0.13.0+ and activated [DIP2](https://github.com/dashpay/dips/blob/master/dip-0002.md)): + +``` json +{ + "txid": "", + "size": "", + "version": 3, + "type": "", + "locktime": 0, + "vin": [ ], + "vout": [ ], + "extraPayloadSize": "", + "extraPayload": "…" +} +``` + +For [special transactions](../resources/glossary.md#special-transactions) (those using the extraPayload fields), JSON-RPC responses contain a parsed JSON representation of the Transaction Payload. + +The sample transaction below shows the response for a quorum commitment special transaction: + +``` json +{ + "txid": "592a09d08348d970b4d9ba216246a23dac866717b460d3f369a86293b9839eea", + "size": 342, + "version": 3, + "type": 6, + "locktime": 0, + "vin": [ + ], + "vout": [ + ], + "extraPayloadSize": 329, + "extraPayload": "0100841b0000010001211cd3e4230b2bc47530e200447e998a38e960d4ed5f5251e26892130c000000320000000000000032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "qcTx": { + "version": 1, + "height": 7044, + "commitment": { + "version": 1, + "llmqType": 1, + "quorumHash": "0000000c139268e251525fedd460e9388a997e4400e23075c42b0b23e4d31c21", + "signersCount": 0, + "validMembersCount": 0, + "quorumPublicKey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + "instantlock": false +} +``` + +**** + +## TxIn: A Transaction Input (Non-Coinbase) + +Each non- [coinbase](../resources/glossary.md#coinbase) [input](../resources/glossary.md#input) spends an outpoint from a previous transaction. (Coinbase inputs are described separately after the example section below.) + +| Bytes | Name | Data Type | Description +|----------|------------------|----------------------|-------------- +| 36 | previous_output | [outpoint](../resources/glossary.md#outpoint) | The previous outpoint being spent. See description of outpoint below. +| *Varies* | script bytes | compactSize uint | The number of bytes in the signature script. Maximum is 10,000 bytes. +| *Varies* | signature script | char[] | A script-language script which satisfies the conditions placed in the outpoint's pubkey script. Should only contain data pushes; see the [signature script modification warning](../reference/transactions-opcodes.md#signature-script-modification). +| 4 | sequence | uint32_t | Sequence number. Default for Dash Core and almost all other programs is 0xffffffff. + +**** + +## Outpoint: The Specific Part Of A Specific Output + +Because a single transaction can include multiple [outputs](../resources/glossary.md#output), the [outpoint](../resources/glossary.md#outpoint) structure includes both a [TXID](../resources/glossary.md#transaction-identifiers) and an output index number to refer to specific output. + +| Bytes | Name | Data Type | Description +|-------|-------|-----------|-------------- +| 32 | hash | char[32] | The TXID of the transaction holding the output to spend. The TXID is a hash provided here in internal byte order. +| 4 | index | uint32_t | The output index number of the specific output to spend from the transaction. The first output is 0x00000000. + +**** + +## TxOut: A Transaction Output + +Each [output](../resources/glossary.md#output) spends a certain number of [duffs](../resources/glossary.md#duffs), placing them under control of anyone who can satisfy the provided [pubkey script](../resources/glossary.md#pubkey-script). + +| Bytes | Name | Data Type | Description +|----------|-----------------|------------------|-------------- +| 8 | value | int64_t | Number of duffs to spend. May be zero; the sum of all outputs may not exceed the sum of duffs previously spent to the outpoints provided in the input section. (Exception: coinbase transactions spend the block subsidy and collected transaction fees.) +| 1+ | pk_script bytes | compactSize uint | Number of bytes in the pubkey script. Maximum is 10,000 bytes. +| *Varies* | pk_script | char[] | Defines the conditions which must be satisfied to spend this output. + +**Example** + +The sample raw transaction itemized below is the one created in the [Simple Raw Transaction section](../examples/transaction-tutorial-simple-raw-transaction.md) of the Developer Examples. It spends a previous pay-to-pubkey output by paying to a new pay-to-pubkey-hash (P2PKH) output. + +``` text +01000000 ................................... Version + +01 ......................................... Number of inputs +| +| 7b1eabe0209b1fe794124575ef807057 +| c77ada2138ae4fa8d6c4de0398a14f3f ......... Outpoint TXID +| 00000000 ................................. Outpoint index number: 0 +| +| 49 ....................................... Bytes in sig. script: 73 +| | 48 ..................................... Push 72 bytes as data +| | | 30450221008949f0cb400094ad2b5eb3 +| | | 99d59d01c14d73d8fe6e96df1a7150de +| | | b388ab8935022079656090d7f6bac4c9 +| | | a94e0aad311a4268e082a725f8aeae05 +| | | 73fb12ff866a5f01 ..................... Secp256k1 signature +| +| ffffffff ................................. Sequence number: UINT32_MAX + +01 ......................................... Number of outputs +| f0ca052a01000000 ......................... Duffs (49.99990000 Dash) +| +| 19 ....................................... Bytes in pubkey script: 25 +| | 76 ..................................... OP_DUP +| | a9 ..................................... OP_HASH160 +| | 14 ..................................... Push 20 bytes as data +| | | cbc20a7664f2f69e5355aa427045bc15 +| | | e7c6c772 ............................. PubKey hash +| | 88 ..................................... OP_EQUALVERIFY +| | ac ..................................... OP_CHECKSIG + +00000000 ................................... locktime: 0 (a block height) +``` + +**** + +## Coinbase Input: The Input Of The First Transaction In A Block + +The first transaction in a [block](../resources/glossary.md#block), called the [coinbase transaction](../resources/glossary.md#coinbase-transaction), must have exactly one input, called a [coinbase](../resources/glossary.md#coinbase). The coinbase [input](../resources/glossary.md#input) currently has the following format. + +| Bytes | Name | Data Type | Description +|----------|--------------------|----------------------|-------------- +| 32 | hash (null) | char[32] | A 32-byte null, as a coinbase has no previous outpoint. +| 4 | index (UINT32_MAX) | uint32_t | 0xffffffff, as a coinbase has no previous outpoint. +| *Varies* | script bytes | compactSize uint | The number of bytes in the coinbase script, up to a maximum of 100 bytes. +| *Varies* (4) | height | script | The [block height](../resources/glossary.md#block-height) of this block as required by BIP34. Uses script language: starts with a data-pushing opcode that indicates how many bytes to push to the stack followed by the block height as a little-endian unsigned integer. This script must be as short as possible, otherwise it may be rejected.

The data-pushing opcode will be 0x03 and the total size four bytes until block 16,777,216 about 300 years from now. +| *Varies* | coinbase script | *None* | The [coinbase field](../resources/glossary.md#coinbase): Arbitrary data not exceeding 100 bytes minus the (4) height bytes. Miners commonly place an extra nonce in this field to update the block header merkle root during hashing. +| 4 | sequence | uint32_t | Sequence number. + +Although the coinbase script is arbitrary data, if it includes the bytes used by any signature-checking operations such as [`OP_CHECKSIG`](../reference/transactions-opcodes.md), those signature checks will be counted as signature operations (sigops) towards the block's sigop limit. To avoid this, you can prefix all data with the appropriate push operation. + +An itemized [coinbase transaction](../resources/glossary.md#coinbase-transaction): + +``` text +01000000 .............................. Version + +01 .................................... Number of inputs +| 00000000000000000000000000000000 +| 00000000000000000000000000000000 ... Previous outpoint TXID +| ffffffff ............................ Previous outpoint index +| +| 18 .................................. Bytes in coinbase: 24 +| | +| | 03 ................................ Bytes in height +| | | b8240b .......................... Height: 730296 +| | +| | 03b8240b049d29aa59080400077efa95 +| | 0000052f6d70682f .................. Arbitrary data +| 00000000 ............................ Sequence + +02 .................................... Output count +| Transaction Output 1 +| | f20cbe0a00000000 .................... Duffs (1.80227314 Dash) +| | 1976a9142cd46be3ceeacca983e0fea3 +| | b88f26b08a26c29b88ac ................ P2PKH script +| +| Transaction Output 2 +| | eb0cbe0a00000000 .................... Duffs (1.80227307 Dash) +| | 1976a914868180414905937a68fadeb0 +| | f33e64d102c9591a88ac ................ P2PKH script +| +| 00000000 ............................ Locktime +``` + +Note: currently the normal coinbase has 2 outputs (1 for the [miner](../resources/glossary.md#miner) and 1 for the selected [masternode](../resources/glossary.md#masternode)). Superblocks ([superblock example](https://chainz.cryptoid.info/dash/block.dws?731104.htm)) have multiple outputs depending on the number of proposals being funded. diff --git a/docs/core/reference/transactions-special-transactions.md b/docs/core/reference/transactions-special-transactions.md new file mode 100644 index 000000000..b716382cb --- /dev/null +++ b/docs/core/reference/transactions-special-transactions.md @@ -0,0 +1,1329 @@ +```{eval-rst} +.. _ref-txs-special-txs: +.. meta:: + :title: Special Transactions + :description: The Special Transactions framework provides Dash the flexibility to expand beyond the financial uses of classical transactions. +``` + +# Special Transactions + +The [Special Transactions](../resources/glossary.md#special-transactions) framework established by [DIP2](https://github.com/dashpay/dips/blob/master/dip-0002.md) enabled the implementation of new on-chain features and [consensus](../resources/glossary.md#consensus) mechanisms. These transactions provide the flexibility to expand beyond the financial uses of classical transactions. DIP2 transactions modified classical transactions by: + +1. Splitting the 32 bit `version` field into two 16 bit fields (`version` and `type`) +2. Adding support for a generic extra payload following the `lock_time` field. The maximum allowed size for a transaction version 3 extra payload is 10000 bytes (`MAX_TX_EXTRA_PAYLOAD`). + +Classical (financial) transactions have a `type` of 0 while special transactions have a `type` defined in the DIP describing them. A list of current special transaction types is maintained in the [DIP repository](https://github.com/dashpay/dips/blob/master/dip-0002/special-transactions.md). + +**Implemented Special Transactions** + +| Release | Tx Version | Tx Type | Payload JSON | Tx Purpose | Payload | Payload Size | +| ------- | ---------- | ------- | --------------------------- | ---------------------------------------- | ------- | ---------------- | +| 0.12.3 | 2 | - | n/a | n/a | n/a | | +| 0.13.0 | 3 | 0 | n/a | Standard (Classical) Transaction | n/a | n/a | +| 0.13.0 | 3 | 1 | [ProRegTx](#proregtx) | Masternode Registration | hex | compactSize uint | +| 0.13.0 | 3 | 2 | [ProUpServTx](#proupservtx) | Update Masternode Service | hex | compactSize uint | +| 0.13.0 | 3 | 3 | [ProUpRegTx](#proupregtx) | Update Masternode Operator | hex | compactSize uint | +| 0.13.0 | 3 | 4 | [ProUpRevTx](#prouprevtx) | Masternode Operator Revocation | hex | compactSize uint | +| 0.13.0 | 3 | 5 | [CbTx](#cbtx) | Masternode List Merkle Proof | hex | compactSize uint | +| 0.13.0 | 3 | 6 | [QcTx](#qctx) | Long-Living Masternode Quorum Commitment | hex | compactSize uint | +| 18.0.0 | 3 | 7 | [MnHfTx](#mnhftx) | Masternode hard fork signal | hex | compactSize uint | +| 21.0.0 | 3 | 8 | [AssetLockTx](#assetlocktx) | Asset Lock Transaction | hex | compactSize uint | +| 21.0.0 | 3 | 9 | [AssetUnlocktx](#assetunlocktx) | Asset Unlock Transaction | hex | compactSize uint | + +```{eval-rst} +.. _ref-txs-proregtx: +``` + +## ProRegTx + +*Added in protocol version 70213 of Dash Core as described by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md)* + +The [masternode](../resources/glossary.md#masternode) Registration (ProRegTx) special transaction is used to join the masternode list by proving ownership of the 1000 DASH necessary to create a masternode. + +A ProRegTx is created and sent using the [`protx` RPC](../api/remote-procedure-calls-evo.md#protx). The ProRegTx must either include an [output](../resources/glossary.md#output) with 1000 DASH (`protx register`) or refer to an existing unspent output holding 1000 DASH (`protx fund_register`). If the 1000 DASH is an output of the ProRegTx, the collateralOutpoint hash field should be null. + +The special transaction type is 1 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | Provider transaction version number. Currently set to 1. Updated to 2 after v19 hard fork. +| 2 | type | uint_16 | Masternode type. Default set to 0. +| 2 | mode | uint_16 | Masternode mode. Default set to 0. +| 36 | collateralOutpoint | COutpoint | The collateral outpoint.
**Note:** The hash will be null if the collateral is part of this transaction, otherwise it will reference an existing collateral. +| 16 | ipAddress | byte[] | IPv6 address in network byte order. Only IPv4 mapped addresses are allowed (to be extended in the future) +| 2 | port | uint_16 | Port (network byte order) +| 20 | KeyIdOwner | CKeyID | The public key hash used for owner related signing (ProTx updates, governance voting) +| 48 | PubKeyOperator | CBLSPublicKey | The BLS public key used for operational related signing (network messages, ProTx updates).
**Note**: serialization varies based on `version`:
- Version 1 - legacy BLS scheme
- Version 2 - basic BLS scheme +| 20 | KeyIdVoting | CKeyID | The public key hash used for voting. +| 2 | operatorReward | uint_16 | A value from 0 to 10000. +| 1-9 | scriptPayoutSize | compactSize uint | Size of the Payee Script. +| Variable | scriptPayout | Script | Payee script (p2pkh/p2sh) +| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs +| 0 or 20 | platformNodeID | byte[] | ***Added by ProRegTx version 2 in Dash Core 19.0.0***
Dash Platform P2P node ID, derived from P2P public key. Only present for masternode type 1. +| 0 or 2 | platformP2PPort | uint_16 | ***Added by ProRegTx version 2 in Dash Core 19.0.0***
TCP port of Dash Platform peer-to-peer communication between nodes (network byte order). Only present for masternode type 1. +| 0 or 2 | platformHTTPPort | uint_16 | ***Added by ProRegTx version 2 in Dash Core 19.0.0***
TCP port of Platform HTTP/API interface (network byte order). Only present for masternode type 1. +| 1-9 | payloadSigSize |compactSize uint | Size of the Signature +| Variable | payloadSig | vector | Signature of the hash of the ProTx fields. Signed with the key corresponding to the collateral outpoint in case the collateral is not part of the ProRegTx itself, empty otherwise. + +The following annotated hexdump shows a ProRegTx transaction referencing an existing collateral. (Parts of the classical transaction section have been omitted.) + +``` text Version 1 ProRegTx (existing collateral) +0300 ....................................... Version (3) +0100 ....................................... Type (1 - ProRegTx) + +[...] ...................................... Transaction inputs omitted +[...] ...................................... Transaction outputs omitted + +00000000 ................................... locktime: 0 (a block height) + +fd1201 ..................................... Extra payload size (274) + +ProRegTx Payload +| 0100 ..................................... Version (1) +| 0000 ..................................... Type (0) +| 0000 ..................................... Mode (0) +| +| 4859747b0eb19bb2dae5a12ef7b6a69b +| 03712bfeded1174de0b6ab1334ab2e8b ......... Outpoint TXID +| 01000000 ................................. Outpoint index number: 1 +| +| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51 +| 270f ..................................... Port: 9999 +| +| +| 1636e84d02310b0b458f3eb51d8ea8b2e684b7ce . Owner pubkey hash (ECDSA) +| 88d719278eef605d9c19037366910b59bc28d437 +| de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8 +| c22f4a914a6c5566 ......................... Operator public key (BLS) +| 1636e84d02310b0b458f3eb51d8ea8b2e684b7ce . Voting pubkey hash (ECDSA) +| +| f401 ..................................... Operator reward (500 -> 5%) +| +| Payout script +| 19 ....................................... Bytes in pubkey script: 25 +| | 76 ..................................... OP_DUP +| | a9 ..................................... OP_HASH160 +| | 14 ..................................... Push 20 bytes as data +| | | fc136008111fcc7a05be6cec66f97568 +| | | 727a9e51 ............................. PubKey hash +| | 88 ..................................... OP_EQUALVERIFY +| | ac ..................................... OP_CHECKSIG +| +| 0fcfb7d939078ba6a6b81ecf1dc2e05d +| e2776f49f7b503ac254798be6a672699 ......... Inputs hash +| +| Payload signature +| 41 ....................................... Signature Size (65) +| 200476f193b465764093014ba44bd4ff +| de2b3fc92794c4acda9cad6305ca172e +| 9e3d6b1cd6e30f86678dae8e6595e53d +| 2b30bc32141b6c0151eb58479121b3e6a4 ....... Signature +``` + +The following annotated hexdump shows a ProRegTx transaction creating a new collateral. + +**Note the presence of the output, a null Outpoint TXID and the absence of a signature (since it isn't referring to an existing collateral).** (Parts of the classical transaction section have been omitted.) + +``` text Version 1 ProRegTx +0300 ....................................... Version (3) +0100 ....................................... Type (1 - ProRegTx) + +[...] ...................................... Transaction inputs omitted + +02 ......................................... Number of outputs +| [...] .................................... 1 output omitted +| +| Masternode collateral output +| | 00e8764817000000 ....................... Duffs (1000 DASH) +| | 1976a9149e648c7e4b61482aa3 +| | 9bd10e0bf0b5268768005f88ac ............. Script + +00000000 ................................... locktime: 0 (a block height) + +d1 ......................................... Extra payload size (209) + +ProRegTx Payload +| 0100 ..................................... Version (1) +| 0000 ..................................... Type (0) +| 0000 ..................................... Mode (0) +| +| 00000000000000000000000000000000 +| 00000000000000000000000000000000 ......... Outpoint TXID +| 01000000 ................................. Outpoint index number: 1 +| +| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51 +| 270f ..................................... Port: 9999 +| +| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Owner pubkey hash (ECDSA) +| 0e02146e9c34cfbcb3f3037574a1abb35525e2ca +| 0c3c6901dbf82ac591e30218d1711223b7ca956e +| df39f3d984d06d51 ......................... Operator public key (BLS) +| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Voting pubkey hash (ECDSA) +| +| f401 ..................................... Operator reward (500 -> 5%) +| +| Payout script +| 19 ....................................... Bytes in pubkey script: 25 +| | 76 ..................................... OP_DUP +| | a9 ..................................... OP_HASH160 +| | 14 ..................................... Push 20 bytes as data +| | | 9e648c7e4b61482aa39bd10e0bf0b526 +| | | 8768005f ............................. PubKey hash +| | 88 ..................................... OP_EQUALVERIFY +| | ac ..................................... OP_CHECKSIG +| +| 57b115d681b9aff82824ff7e22af99d4 +| ac4b39ad7be7cb70b662e9011827d589 ......... Inputs hash +| +| Payload signature +| 00 ....................................... Signature Size (0) +| .......................................... Signature (Empty) +``` + +### Example ProRegTx + +```Text Raw Transaction hex +03000100013ea08d68bd3038b8ea3d92d43fa38047522896724b04f246827d74b703bd3f2801000000 +6a47304402201fe458e3dc2c6072848418fedd48fe79081be3c818301ce0a97de4c1dd5ee2da02206f +601d0de9540ac53ef7f9c59c92ef594237f8b23dad3b04b1005ff85fb61a5d0121022dce9621ff449f +e1a12648da526b93e0c2f8e43d14f8c1650f95272569d932a6feffffff011ec89a3b000000001976a9 +14955410003527bf2b360a7a390b9ff14b9106c63288ac00000000fd12010100000000005c71e5f46d +35196e33b45c5d59d3fd2dc84381942064cae21744fb717412c1ac0100000000000000000000000000 +ffff2f6fb5cf4e2199e9dff4cd5a0abc61b5287a0ba48c0553d6358890c0e9ec9dc5f08b1d4d021192 +0fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e03829dcf16f7a66 +b832d3b84dbab400a1e9eb7f30ac00001976a914955410003527bf2b360a7a390b9ff14b9106c63288 +ac835b69acdba709707c5cccdfcc342eacc87d6db0cc676896a01fe433a0620ae4411f5da2e5444c6a +1556c3d45798b9f95567b1625b3f0cbe69936a70e35ca76b381f0a5506de07274e5e24db8be77234ad +8fa023938f750a283b39b1bff17b2ad11f +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "b43dadbd485e4d1e1d202ea5180f0ad4e8e7f05e97a7e566a764ed714356bd1f", + "version": 3, + "type": 1, + "size": 468, + "locktime": 0, + "vin": [ + { + "txid": "283fbd03b7747d8246f2044b729628524780a33fd4923deab83830bd688da03e", + "vout": 1, + "scriptSig": { + "asm": "304402201fe458e3dc2c6072848418fedd48fe79081be3c818301ce0a97de4c1dd5ee2da02206f601d0de9540ac53ef7f9c59c92ef594237f8b23dad3b04b1005ff85fb61a5d[ALL] 022dce9621ff449fe1a12648da526b93e0c2f8e43d14f8c1650f95272569d932a6", + "hex": "47304402201fe458e3dc2c6072848418fedd48fe79081be3c818301ce0a97de4c1dd5ee2da02206f601d0de9540ac53ef7f9c59c92ef594237f8b23dad3b04b1005ff85fb61a5d0121022dce9621ff449fe1a12648da526b93e0c2f8e43d14f8c1650f95272569d932a6" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 9.99999518, + "valueSat": 999999518, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 955410003527bf2b360a7a390b9ff14b9106c632 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914955410003527bf2b360a7a390b9ff14b9106c63288ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yZw2EYuVkTNUzUqd7mfXRNhCMReonL99tu" + ] + } + } + ], + "extraPayloadSize": 274, + "extraPayload": "0100000000005c71e5f46d35196e33b45c5d59d3fd2dc84381942064cae21744fb717412c1ac0100000000000000000000000000ffff2f6fb5cf4e2199e9dff4cd5a0abc61b5287a0ba48c0553d6358890c0e9ec9dc5f08b1d4d0211920fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e03829dcf16f7a66b832d3b84dbab400a1e9eb7f30ac00001976a914955410003527bf2b360a7a390b9ff14b9106c63288ac835b69acdba709707c5cccdfcc342eacc87d6db0cc676896a01fe433a0620ae4411f5da2e5444c6a1556c3d45798b9f95567b1625b3f0cbe69936a70e35ca76b381f0a5506de07274e5e24db8be77234ad8fa023938f750a283b39b1bff17b2ad11f", + "proRegTx": { + "version": 1, + "type": 0, + "collateralHash": "acc1127471fb4417e2ca6420948143c82dfdd3595d5cb4336e19356df4e5715c", + "collateralIndex": 1, + "service": "47.111.181.207:20001", + "ownerAddress": "yaMGQThTVPUf1LBqVqa1jMTtLW7ByVbN78", + "votingAddress": "yQ8oETtF1pRQfBP4iake2e5zyCCm85CAET", + "payoutAddress": "yZw2EYuVkTNUzUqd7mfXRNhCMReonL99tu", + "pubKeyOperator": "90c0e9ec9dc5f08b1d4d0211920fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e038", + "operatorReward": 0, + "inputsHash": "e40a62a033e41fa0966867ccb06d7dc8ac2e34ccdfcc5c7c7009a7dbac695b83" + }, + "hex": "03000100013ea08d68bd3038b8ea3d92d43fa38047522896724b04f246827d74b703bd3f28010000006a47304402201fe458e3dc2c6072848418fedd48fe79081be3c818301ce0a97de4c1dd5ee2da02206f601d0de9540ac53ef7f9c59c92ef594237f8b23dad3b04b1005ff85fb61a5d0121022dce9621ff449fe1a12648da526b93e0c2f8e43d14f8c1650f95272569d932a6feffffff011ec89a3b000000001976a914955410003527bf2b360a7a390b9ff14b9106c63288ac00000000fd12010100000000005c71e5f46d35196e33b45c5d59d3fd2dc84381942064cae21744fb717412c1ac0100000000000000000000000000ffff2f6fb5cf4e2199e9dff4cd5a0abc61b5287a0ba48c0553d6358890c0e9ec9dc5f08b1d4d0211920fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e03829dcf16f7a66b832d3b84dbab400a1e9eb7f30ac00001976a914955410003527bf2b360a7a390b9ff14b9106c63288ac835b69acdba709707c5cccdfcc342eacc87d6db0cc676896a01fe433a0620ae4411f5da2e5444c6a1556c3d45798b9f95567b1625b3f0cbe69936a70e35ca76b381f0a5506de07274e5e24db8be77234ad8fa023938f750a283b39b1bff17b2ad11f", + "blockhash": "0000000016e9bd30f97d98be7abc7934e24a064b1c8e7fefcb641694fe53e5d4", + "height": 247288, + "confirmations": 611337, + "time": 1578970980, + "blocktime": 1578970980, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} + +``` + +```{eval-rst} +.. _ref-txs-proupservtx: +``` + +## ProUpServTx + +*Added in protocol version 70213 of Dash Core as described by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md)* + +The [masternode](../resources/glossary.md#masternode) Provider Update Service (ProUpServTx) special transaction is used to update the IP Address and port of a masternode. If a non-zero operatorReward was set in the initial [ProRegTx](#proregtx), the operator may also set the scriptOperatorPayout field in the ProUpServTx. + +A ProUpServTx is only valid for masternodes in the registered masternodes subset. When processed, it updates the metadata of the masternode entry and revives the masternode if it was previously marked as PoSe-banned. + +A ProUpServTx is created and sent using the [`protx update_service` RPC](../api/remote-procedure-calls-evo.md#protx-update-service). + +The special transaction type used for ProUpServTx Transactions is 2 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | ProUpServTx version number. Currently set to 1. Updated to 2 after Dash Core 19.0.0 hard fork. +| 2 | type | uint_16 | ***Added by ProUpServTx version 2 in Dash Core 19.0.0***
Masternode type +| 32 | proTXHash | uint256 | The hash of the initial ProRegTx +| 16 | ipAddress | byte[] | IPv6 address in network byte order. Only IPv4 mapped addresses are allowed (to be extended in the future) +| 2 | port | uint_16 | Port (network byte order) +| 1-9 | scriptOperator
PayoutSize | compactSize uint | Size of the Operator Payee Script. +| Variable | scriptOperator
Payout | Script | Operator Payee script (p2pkh/p2sh) +| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs +| 0 or 20 | platformNodeID | byte[] | ***Added by ProUpServTx version 2 in Dash Core 19.0.0***
Dash Platform P2P node ID, derived from P2P public key. Only present for masternode type 1. +| 0 or 2 | platformP2PPort | uint_16 | ***Added by ProUpServTx version 2 in Dash Core 19.0.0***
TCP port of Dash Platform peer-to-peer communication between nodes (network byte order). Only present for masternode type 1. +| 0 or 2 | platformHTTPPort | uint_16 | ***Added by ProUpServTx version 2 in Dash Core 19.0.0***
TCP port of Platform HTTP/API interface (network byte order). Only present for masternode type 1. +| 1-9 | payloadSigSize |compactSize uint | Size of the Signature
**Note:** not present in BLS implementation +| 96 | payloadSig | vector | BLS Signature of the hash of the ProUpServTx fields. Signed by the Operator.
**Note**: serialization varies based on `version`:
- Version 1 - legacy BLS scheme
- Version 2 - basic BLS scheme + +The following annotated hexdump shows a ProUpServTx transaction. (Parts of the +classical transaction section have been omitted.) + +``` text Version 1 ProUpServTx +0300 ....................................... Version (3) +0200 ....................................... Type (2 - ProUpServTx) + +[...] ...................................... Transaction inputs omitted +[...] ...................................... Transaction outputs omitted + +00000000 ................................... locktime: 0 (a block height) + +b5 ......................................... Extra payload size (181) + +ProUpServTx Payload +| 0100 ..................................... Version (1) +| +| db60b8cecae691a3d078a2341d460b06 +| b2914f6b092f1906b5c815589399b0ff ......... ProRegTx Hash +| +| 00000000000000000000ffffc0000233 ......... IP Address: ::ffff:192.0.2.51 +| 270f ..................................... Port: 9999 +| +| 00 ....................................... Operator payout script size (0) +| .......................................... Operator payout script (Empty) +| +| a9569d037b0eacc8bca05c5829c95283 +| 4ac27d1c7e7df610500b7ba70fd46507 ......... Inputs hash +| +| Payload signature (BLS) +| 0267702ef85d186ef7fa32dc40c65f2f +| eca0a7465715eb7c30f81beb69e35ee4 +| 1f6ff7f292b82a9caebb5aa961b0f915 +| 02501becf629e93c0a01c76162d56a6c +| 65a9675c3ca9d5297f053e68f91393dd +| 789beed8ef7e8839695a334c2e1bd37c ......... BLS Signature (96 bytes) +``` + +### Example ProUpServTx + +```Text Raw Transaction hex +0300020001f88750ccc24410679d87ee63df5c8dfd901329aa1fe60a74c183d560eee5218d01000000 +6a473044022029090e49ba2e387e7b39df51fdd6ec1becdd568cdd0de79f5dca6084bee67738022058 +3bb62418aa986d927b4487d6a7f0469c4bc54a0e7baa0c484e8c140c37b3d301210345184cc81d6cd9 +8eef548206f23a1467c27fea65582d519daa0f7a88a6c45666feffffff01e7edd23b000000001976a9 +147f95c0f808aff27883260bfaf9cfe2b84519a6b288ac00000000b702000000ff92ce2d64657cc3d4 +d9d82547efca2206ec1d9f5dcf2776624bc0a58b12ed3b00000000000000000000ffffae22e9734e1f +0026ad5ada35511fc5b9d762b14b22510325ef8b82d21d59567f8e1c3c9e0c955ab99a62829e6317b1 +943d97f66191b1c6714146540788e2d26a1007498dce455603f55aebacf1a38131048abf7d5a05d00e +9e93c1e91cc8cad239b4301b328f5fe1bcbae829ccd6a3f461e712873a188224829fc4b5fc01fa0fb2 +9014b947d8f7 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json +{ + "txid": "f1d23a149955d48ef7bf81ce0a58d4f47ae28399ed3e4ef3c1f90a55a6a9e082", + "version": 3, + "type": 2, + "size": 375, + "locktime": 0, + "vin": [ + { + "txid": "8d21e5ee60d583c1740ae61faa291390fd8d5cdf63ee879d671044c2cc5087f8", + "vout": 1, + "scriptSig": { + "asm": "3044022029090e49ba2e387e7b39df51fdd6ec1becdd568cdd0de79f5dca6084bee677380220583bb62418aa986d927b4487d6a7f0469c4bc54a0e7baa0c484e8c140c37b3d3[ALL] 0345184cc81d6cd98eef548206f23a1467c27fea65582d519daa0f7a88a6c45666", + "hex": "473044022029090e49ba2e387e7b39df51fdd6ec1becdd568cdd0de79f5dca6084bee677380220583bb62418aa986d927b4487d6a7f0469c4bc54a0e7baa0c484e8c140c37b3d301210345184cc81d6cd98eef548206f23a1467c27fea65582d519daa0f7a88a6c45666" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 10.03679207, + "valueSat": 1003679207, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 7f95c0f808aff27883260bfaf9cfe2b84519a6b2 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9147f95c0f808aff27883260bfaf9cfe2b84519a6b288ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yXx44e8DiK4rCaYmJUMHSp3zGTFFvFaWLg" + ] + } + } + ], + "extraPayloadSize": 183, + "extraPayload": "02000000ff92ce2d64657cc3d4d9d82547efca2206ec1d9f5dcf2776624bc0a58b12ed3b00000000000000000000ffffae22e9734e1f0026ad5ada35511fc5b9d762b14b22510325ef8b82d21d59567f8e1c3c9e0c955ab99a62829e6317b1943d97f66191b1c6714146540788e2d26a1007498dce455603f55aebacf1a38131048abf7d5a05d00e9e93c1e91cc8cad239b4301b328f5fe1bcbae829ccd6a3f461e712873a188224829fc4b5fc01fa0fb29014b947d8f7", + "proUpServTx": { + "version": 2, + "type": 0, + "proTxHash": "3bed128ba5c04b627627cf5d9f1dec0622caef4725d8d9d4c37c65642dce92ff", + "service": "174.34.233.115:19999", + "inputsHash": "5a950c9e3c1c8e7f56591dd2828bef250351224bb162d7b9c51f5135da5aad26" + }, + "hex": "0300020001f88750ccc24410679d87ee63df5c8dfd901329aa1fe60a74c183d560eee5218d010000006a473044022029090e49ba2e387e7b39df51fdd6ec1becdd568cdd0de79f5dca6084bee677380220583bb62418aa986d927b4487d6a7f0469c4bc54a0e7baa0c484e8c140c37b3d301210345184cc81d6cd98eef548206f23a1467c27fea65582d519daa0f7a88a6c45666feffffff01e7edd23b000000001976a9147f95c0f808aff27883260bfaf9cfe2b84519a6b288ac00000000b702000000ff92ce2d64657cc3d4d9d82547efca2206ec1d9f5dcf2776624bc0a58b12ed3b00000000000000000000ffffae22e9734e1f0026ad5ada35511fc5b9d762b14b22510325ef8b82d21d59567f8e1c3c9e0c955ab99a62829e6317b1943d97f66191b1c6714146540788e2d26a1007498dce455603f55aebacf1a38131048abf7d5a05d00e9e93c1e91cc8cad239b4301b328f5fe1bcbae829ccd6a3f461e712873a188224829fc4b5fc01fa0fb29014b947d8f7", + "blockhash": "0000024ea047afdb72b301d3a6501e1027b101c7bc047e1377da0efbe7495bcf", + "height": 854855, + "confirmations": 3772, + "time": 1679598509, + "blocktime": 1679598509, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} +``` + +```{eval-rst} +.. _ref-txs-proupregtx: +``` + +## ProUpRegTx + +*Added in protocol version 70213 of Dash Core as described by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md)* + +The [masternode](../resources/glossary.md#masternode) Provider Update Registrar (ProUpRegTx) special transaction is used by a masternode owner to update masternode metadata (e.g. operator/voting key details or the payout script). + +A ProUpRegTx is created and sent using the [`protx update_registrar` RPC](../api/remote-procedure-calls-evo.md#protx-update-registrar). + +The special transaction type is 3 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | Provider update registrar transaction version number. Currently set to 1. Updated to 2 after Dash Core 19.0.0 hard fork. +| 32 | proTXHash | uint256 | The hash of the initial ProRegTx +| 2 | mode | uint_16 | Masternode mode. Default set to 0. +| 48 | PubKeyOperator | CBLSPublicKey | The BLS public key used for operational related signing (network messages, ProTx updates).
**Note**: serialization varies based on `version`:
- Version 1 - legacy BLS scheme
- Version 2 - basic BLS scheme +| 20 | KeyIdVoting | CKeyID | The public key hash used for voting. +| 1-9 | scriptPayoutSize | compactSize uint | Size of the Payee Script. +| Variable | scriptPayout | Script | Payee script (p2pkh/p2sh) +| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs +| 1-9 | payloadSigSize |compactSize uint | Size of the Signature +| Variable | payloadSig | vector | Signature of the hash of the ProTx fields. Signed with the key corresponding to the collateral outpoint in case the collateral is not part of the ProRegTx itself, empty otherwise. + +The following annotated hexdump shows a ProUpRegTx transaction referencing an +existing collateral. (Parts of the classical transaction section have been omitted.) + +``` text Version 1 ProUpRegTx +0300 ....................................... Version (3) +0300 ....................................... Type (3 - ProUpRegTx) + +[...] ...................................... Transaction inputs omitted +[...] ...................................... Transaction outputs omitted + +00000000 ................................... locktime: 0 (a block height) + +e4 ......................................... Extra payload size (228) + +ProRegTx Payload +| 0100 ..................................... Version (1) +| +| ddaf13bf1b02de39711de911e646c63e +| f089b6cee786a1b776086ae130331bba ......... ProRegTx Hash +| +| 0000 ..................................... Mode (0) +| +| 0e02146e9c34cfbcb3f3037574a1abb35525e2ca +| 0c3c6901dbf82ac591e30218d1711223b7ca956e +| df39f3d984d06d51 ......................... Operator public key (BLS) +| 757a2171bbf92517e358249f20c37a8ad2d7a5bc . Voting pubkey hash (ECDSA) +| +| Payout script +| 19 ....................................... Bytes in pubkey script: 25 +| | 76 ..................................... OP_DUP +| | a9 ..................................... OP_HASH160 +| | 14 ..................................... Push 20 bytes as data +| | | 9e648c7e4b61482aa39bd10e0bf0b526 +| | | 8768005f ............................. PubKey hash +| | 88 ..................................... OP_EQUALVERIFY +| | ac ..................................... OP_CHECKSIG +| +| 50b50b24193b2b16f0383125c1f4426e +| 883d256eeadee96d500f8c08b0e0f9e4 ......... Inputs hash +| +| Payload signature +| 41 ....................................... Signature Size (65) +| 1ffa8a27ae0301e414176d4c876cff2e +| 20b810683a68ab7dcea95de1f8f36441 +| 4c56368f189a3ef7a59b83bd77f22431 +| a73d347841a58768b94c771819dc2bbce3 ....... Signature +``` + +### Example ProUpRegTx + +```Text Raw Transaction hex +0300030001f9485c88c87c282dc4de6b826afbba91c49aaa5bc75a0c0110465988573b5fd501000000 +6a4730440220085ea9929647b789429fa07bc83cf2a1c457628bc686be1e3014fdc5c2f9cc22022037 +47c39ad3a09a58a4b6f4ab6e8a08529cc9bdca86fe74689b1013b72ec6f92f012102ea1bcf94f4a787 +a3a94f15ce0a954ea4131be49d0f545531c7df1720045b85fffeffffff0133edd23b000000001976a9 +14dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088ac00000000e4020099bf316f8cb867be68dc9b +d89bf2b8b984eae2fa9fa6ac19e862459cb7cf79390000a73d8c1e640d29e2257042a39bbbac8d867f +69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382f00e43355184a124cf6a37 +1433e3fb1d792bd5421976a914dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088acbe428d911be8 +7c670640d3cf73f1490b327be4b33a4fac8bcb70ca934199b4774120dc2d1ce8ea4188f04953528e11 +2fd1402ab7434cdc5cc9f245468d952e1fa6d83701f90fc8e74c10bc32fec5c7e2beda675ce8a3cb85 +9d25d8aa2cff5962ece6 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "ff5782f5537ef18b919b5ad0a2c605a72d83b4092434dcc8273e2d53ac0d0113", + "version": 3, + "type": 3, + "size": 420, + "locktime": 0, + "vin": [ + { + "txid": "d55f3b5788594610010c5ac75baa9ac491bafb6a826bdec42d287cc8885c48f9", + "vout": 1, + "scriptSig": { + "asm": "30440220085ea9929647b789429fa07bc83cf2a1c457628bc686be1e3014fdc5c2f9cc2202203747c39ad3a09a58a4b6f4ab6e8a08529cc9bdca86fe74689b1013b72ec6f92f[ALL] 02ea1bcf94f4a787a3a94f15ce0a954ea4131be49d0f545531c7df1720045b85ff", + "hex": "4730440220085ea9929647b789429fa07bc83cf2a1c457628bc686be1e3014fdc5c2f9cc2202203747c39ad3a09a58a4b6f4ab6e8a08529cc9bdca86fe74689b1013b72ec6f92f012102ea1bcf94f4a787a3a94f15ce0a954ea4131be49d0f545531c7df1720045b85ff" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 10.03679027, + "valueSat": 1003679027, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 dc82946c9cee9ab3e8fef5a5d641a57bdf1523c0 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "ygRPwFLoC8WeW3ujqrskqHZiQvKpTHF6qv" + ] + } + } + ], + "extraPayloadSize": 228, + "extraPayload": "020099bf316f8cb867be68dc9bd89bf2b8b984eae2fa9fa6ac19e862459cb7cf79390000a73d8c1e640d29e2257042a39bbbac8d867f69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382f00e43355184a124cf6a371433e3fb1d792bd5421976a914dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088acbe428d911be87c670640d3cf73f1490b327be4b33a4fac8bcb70ca934199b4774120dc2d1ce8ea4188f04953528e112fd1402ab7434cdc5cc9f245468d952e1fa6d83701f90fc8e74c10bc32fec5c7e2beda675ce8a3cb859d25d8aa2cff5962ece6", + "proUpRegTx": { + "version": 2, + "proTxHash": "3979cfb79c4562e819aca69ffae2ea84b9b8f29bd89bdc68be67b88c6f31bf99", + "votingAddress": "yiCk7DjwBbUGJuJofTA7eXU4hyybu123pD", + "payoutAddress": "ygRPwFLoC8WeW3ujqrskqHZiQvKpTHF6qv", + "pubKeyOperator": "a73d8c1e640d29e2257042a39bbbac8d867f69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382", + "inputsHash": "77b4994193ca70cb8bac4f3ab3e47b320b49f173cfd34006677ce81b918d42be" + }, + "hex": "0300030001f9485c88c87c282dc4de6b826afbba91c49aaa5bc75a0c0110465988573b5fd5010000006a4730440220085ea9929647b789429fa07bc83cf2a1c457628bc686be1e3014fdc5c2f9cc2202203747c39ad3a09a58a4b6f4ab6e8a08529cc9bdca86fe74689b1013b72ec6f92f012102ea1bcf94f4a787a3a94f15ce0a954ea4131be49d0f545531c7df1720045b85fffeffffff0133edd23b000000001976a914dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088ac00000000e4020099bf316f8cb867be68dc9bd89bf2b8b984eae2fa9fa6ac19e862459cb7cf79390000a73d8c1e640d29e2257042a39bbbac8d867f69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382f00e43355184a124cf6a371433e3fb1d792bd5421976a914dc82946c9cee9ab3e8fef5a5d641a57bdf1523c088acbe428d911be87c670640d3cf73f1490b327be4b33a4fac8bcb70ca934199b4774120dc2d1ce8ea4188f04953528e112fd1402ab7434cdc5cc9f245468d952e1fa6d83701f90fc8e74c10bc32fec5c7e2beda675ce8a3cb859d25d8aa2cff5962ece6", + "instantlock": true, + "instantlock_internal": true, + "chainlock": false +} + +``` + +```{eval-rst} +.. _ref-txs-prouprevtx: +``` + +## ProUpRevTx + +*Added in protocol version 70213 of Dash Core as described by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md)* + +The [masternode](../resources/glossary.md#masternode) Operator Revocation (ProUpRevTx) special transaction allows an operator to revoke their key in case of compromise or if they wish to terminate service. If a masternode's operator key is revoked, the masternode becomes ineligible for payment until the owner provides a new operator key (via a ProUpRegTx). + +A ProUpRevTx is created and sent using the [`protx revoke` RPC](../api/remote-procedure-calls-evo.md#protx-revoke). + +The special transaction type used for ProUpServTx Transactions is 4 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | ProUpRevTx version number. Currently set to 1. Updated to 2 after Dash Core 19.0.0 hard fork. +| 32 | proTXHash | uint256 | The hash of the initial ProRegTx +| 2 | reason | uint_16 | The reason for revoking the key.
`0` - Not specified
`1` - Termination of Service
`2` - Compromised Key
`3` - Change of key +| 32 | inputsHash | uint256 | Hash of all the outpoints of the transaction inputs +| 1-9 | payloadSigSize |compactSize uint | Size of the Signature
**Note:** not present in BLS implementation +| 96 | payloadSig | vector | BLS Signature of the hash of the ProUpServTx fields. Signed by the Operator.
**Note**: serialization varies based on `version`:
- Version 1 - legacy BLS scheme
- Version 2 - basic BLS scheme + +The following annotated hexdump shows a ProUpRevTx transaction. (Parts of the classical transaction section have been omitted.) + +``` text Version 1 ProUpRevTx +0300 ....................................... Version (3) +0400 ....................................... Type (4 - ProUpRevTx) + +[...] ...................................... Transaction inputs omitted +[...] ...................................... Transaction outputs omitted + +00000000 ................................... locktime: 0 (a block height) + +a4 ......................................... Extra payload size (164) + +ProUpRevTx Payload +| 0100 ..................................... Version (1) +| +| ddaf13bf1b02de39711de911e646c63e +| f089b6cee786a1b776086ae130331bba ......... ProRegTx Hash +| +| 0000 ..................................... Reason: 0 (Not specified) +| +| cb0dfe113c87f8e9cde2c5d18aae12fc +| 8d0617c42c34ca5c2f2f6ab4b1dae164 ......... Inputs hash +| +| Payload signature (BLS) +| 0adaef4bf1a904308f1b0efbdfaffc93 +| 864f9e047fd83415c831589180303711 +| 0f0d8adb312ab43ddd7f8086042d3f5b +| 09029a6a16c341c9d2a62789b495fef4 +| e068da711dac28106ff354db7249ae88 +| 05877d82ff7d1af00ae2d303dea5eb3b ......... BLS Signature (96 bytes) +``` + +### Example ProUpRevTx + +```text Raw transaction hex +03000400016f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce05916000000006b483045022100 +9b50474beacd48b37340eb5715a5ebd92239e54595147b5c55018bc29f26bde302203f312cdd8009f3f03b9bb9a00074 +361974a40f5f5fafaf16ba4378cb72adcc4201210250a5b41488dec3d4116ae5733d18d03326050aebc3958118d64773 +9ad1a5de24feffffff01b974ed6d000000001976a914f0ae84a7ea8a0efd48c155eeeaaed6eb64c2812188ac00000000a4 +01006f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce05916010082cf248cf6b8ac6a3cdc826eda +e582ead20421659ed891f9d4953a540616fb4f05279584b3339ed2ba95711ad28b18ee2878c4a904f76ea4d103e1d739 +f22ff7e3b9b3db7d0c4a7e120abb4952c3574a18de34fa29828f9fe3f52bd0b1fac17acd04f7751967d782045ab6550536 +53438f1dd1e14ba6adeb8351b78c9eb59bf4 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "6926d964bccfd4418e373f08cf41d3302f9616ee5d9bc40b18aa99fc18a3d4ea", + "version": 3, + "type": 4, + "size": 357, + "locktime": 0, + "vin": [ + { + "txid": "1659e06c825212c9b11325760a18f6ea06194ec4efd603f03d8704f23d818a6f", + "vout": 0, + "scriptSig": { + "asm": "30450221009b50474beacd48b37340eb5715a5ebd92239e54595147b5c55018bc29f26bde302203f312cdd8009f3f03b9bb9a00074361974a40f5f5fafaf16ba4378cb72adcc42[ALL] 0250a5b41488dec3d4116ae5733d18d03326050aebc3958118d647739ad1a5de24", + "hex": "4830450221009b50474beacd48b37340eb5715a5ebd92239e54595147b5c55018bc29f26bde302203f312cdd8009f3f03b9bb9a00074361974a40f5f5fafaf16ba4378cb72adcc4201210250a5b41488dec3d4116ae5733d18d03326050aebc3958118d647739ad1a5de24" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 18.44278457, + "valueSat": 1844278457, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 f0ae84a7ea8a0efd48c155eeeaaed6eb64c28121 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914f0ae84a7ea8a0efd48c155eeeaaed6eb64c2812188ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "yiG45yiCksvpd1iLU5o3Dsj8GYRsWvGchu" + ] + } + } + ], + "extraPayloadSize": 164, + "extraPayload": "01006f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce05916010082cf248cf6b8ac6a3cdc826edae582ead20421659ed891f9d4953a540616fb4f05279584b3339ed2ba95711ad28b18ee2878c4a904f76ea4d103e1d739f22ff7e3b9b3db7d0c4a7e120abb4952c3574a18de34fa29828f9fe3f52bd0b1fac17acd04f7751967d782045ab655053653438f1dd1e14ba6adeb8351b78c9eb59bf4", + "proUpRevTx": { + "version": 1, + "proTxHash": "1659e06c825212c9b11325760a18f6ea06194ec4efd603f03d8704f23d818a6f", + "reason": 1, + "inputsHash": "4ffb1606543a95d4f991d89e652104d2ea82e5da6e82dc3c6aacb8f68c24cf82" + }, + "hex": "03000400016f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce05916000000006b4830450221009b50474beacd48b37340eb5715a5ebd92239e54595147b5c55018bc29f26bde302203f312cdd8009f3f03b9bb9a00074361974a40f5f5fafaf16ba4378cb72adcc4201210250a5b41488dec3d4116ae5733d18d03326050aebc3958118d647739ad1a5de24feffffff01b974ed6d000000001976a914f0ae84a7ea8a0efd48c155eeeaaed6eb64c2812188ac00000000a401006f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce05916010082cf248cf6b8ac6a3cdc826edae582ead20421659ed891f9d4953a540616fb4f05279584b3339ed2ba95711ad28b18ee2878c4a904f76ea4d103e1d739f22ff7e3b9b3db7d0c4a7e120abb4952c3574a18de34fa29828f9fe3f52bd0b1fac17acd04f7751967d782045ab655053653438f1dd1e14ba6adeb8351b78c9eb59bf4", + "blockhash": "00000000052bba30e878367092bd76c287c184cf1ae48053860e2a8150b031a2", + "height": 13899, + "confirmations": 844713, + "time": 1546027092, + "blocktime": 1546027092, + "instantlock": false, + "instantlock_internal": false, + "chainlock": false +} +``` + +```{eval-rst} +.. _ref-txs-cbtx: +``` + +## CbTx + +*Added in protocol version 70213 of Dash Core as described by [DIP4](https://github.com/dashpay/dips/blob/master/dip-0004.md)* + +The Coinbase (CbTx) special transaction adds information to the [block](../resources/glossary.md#block) [coinbase transaction](../resources/glossary.md#coinbase-transaction) that enables verification of the deterministic masternode list without the full chain (e.g. from [SPV](../resources/glossary.md#simplified-payment-verification) clients). This allows light-clients to properly verify [InstantSend](../resources/glossary.md#instantsend) transactions and support additional deterministic masternode list functionality in the future. + +The special transaction type used for CbTx Transactions is 5 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | CbTx version number. Currently set to 2. +| 4 | height | uint32_t | Height of the block +| 32 | merkleRootMNList | uint256 | Merkle root of the masternode list +| 32 | merkleRootQuorums | uint256 | *Added by CbTx version 2 in v0.14.0*

Merkle root of currently active LLMQs +| 1-9 | bestCLHeightDiff | compactSize uint | ***Added by CbTx version 3 in v20.0.0***

Number of blocks between the current block and the last known block with a ChainLock +| 96 | bestCLSignature | CBLSSignature | ***Added by CbTx version 3 in Dash Core 20.0.0***
Best ChainLock signature known by the miner +| 8 | creditPoolBalance | int64_t | ***Added by CbTx version 3 in Dash Core v20.0.0***
Balance in the Platform credit pool + +Version History + +| CbTx
Version | First Supported
Protocol Version | Dash Core
Version | Notes | +| ---------- | ----------- | -------- | -------- | +| 1 | 70213 | 0.13.0 | Enabled by [DIP3](https://github.com/dashpay/dips/blob/master/dip-0003.md) activation +| 2 | 70214 | 0.14.0 | Enabled by [DIP8](https://github.com/dashpay/dips/blob/master/dip-0008.md) activation +| 3 | 70230 | 20.0.0 | Enabled by [DIP29](https://github.com/dashpay/dips/blob/master/dip-0029.md) activation + +The following annotated hexdump shows a CbTx transaction (v3). + +An itemized coinbase transaction: + +``` text +0300 ....................................... Version (3) +0500 ....................................... Type (5 - Coinbase) + +01 ......................................... Number of inputs +| 00000000000000000000000000000000 +| 00000000000000000000000000000000 ......... Previous outpoint TXID +| ffffffff ................................. Previous outpoint index +| +| 27 ....................................... Bytes in coinbase: 39 +| | +| | 03 ..................................... Bytes in height +| | | da5c1e ............................... Height: 1989850 +| | +| | 04d04580650800007588782d01000fe4 +| | b883e5bda9e7a59ee4bb99e9b1bc04f09f909f . Arbitrary data +| 88f581b8 ................................. Sequence + +02 ......................................... Output count +| Transaction Output +| | 53640f0300000000 ....................... Duffs (0.51340371 DASH) +| | 1976a9147c086eada12bdb10a265c16c +| | 08a7ae87366bd48188ac ................... Script +| +| Transaction Output 2 +| | f82c2e0900000000 ....................... Duffs (1.54021112 DASH) +| | 1976a91453dc8bffae84a3851ab9fe29 +| | 6417da85d5e7185888ac ................... P2PKH script + +a0f04c20 ................................... Locktime + +af ......................................... Extra payload size (175) + +Coinbase Transaction Payload +| 0300 ..................................... Version (3) +| +| da5c1e00 ................................. Block height: 1989850 +| +| 54e04067fa61cef61f1e91b0d52c21b2 +| 8cdc69cc9d0383f0bb88ba0129b973e2 ......... MN List merkle root +| +| f67e47d5580e70c7e77af8b1a6670669 +| c7424b896ab3d44d349a4988e9a8328d ......... Active LLMQ merkle root +| +| 00 ....................................... Best ChainLock height diff +| +| b22fef542f5c630e4f2a67ad56d30cf2 +| a3dac55848abcd2bac30bf780318792b +| cdf32f7729443846c9fdc57050a131cd +| 12c0e54a16f6265e900f459e3b9dd434 +| 21a0bc3f61efd49ce752e440e5131a8d +| 2758a280ad883b8eb902c49ee5b878b3 ......... ChainLock BLS signature +| +| 0000000000000000 ......................... Credit pool balance (0.0 DASH) +``` + +### Example CbTx + +```Text Raw Transaction hex +03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff +03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff +2703da5c1e04d04580650800007588782d01000fe4b883e5bda9e7a59ee4bb99e9b1bc04f09f909f88 +f581b80253640f03000000001976a9147c086eada12bdb10a265c16c08a7ae87366bd48188acf82c2e +09000000001976a91453dc8bffae84a3851ab9fe296417da85d5e7185888aca0f04c20af0300da5c1e +0054e04067fa61cef61f1e91b0d52c21b28cdc69cc9d0383f0bb88ba0129b973e2f67e47d5580e70c7 +e77af8b1a6670669c7424b896ab3d44d349a4988e9a8328d00b22fef542f5c630e4f2a67ad56d30cf2 +a3dac55848abcd2bac30bf780318792bcdf32f7729443846c9fdc57050a131cd12c0e54a16f6265e90 +0f459e3b9dd43421a0bc3f61efd49ce752e440e5131a8d2758a280ad883b8eb902c49ee5b878b30000 +000000000000 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "c550cae3f65d396a2f517a7220c7851cc3dc065e20141dadf9f19676348730f2", + "version": 3, + "type": 5, + "size": 334, + "locktime": 541913248, + "vin": [ + { + "coinbase": "03da5c1e04d04580650800007588782d01000fe4b883e5bda9e7a59ee4bb99e9b1bc04f09f909f", + "sequence": 3095524744 + } + ], + "vout": [ + { + "value": 0.51340371, + "valueSat": 51340371, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 7c086eada12bdb10a265c16c08a7ae87366bd481 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9147c086eada12bdb10a265c16c08a7ae87366bd48188ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "XmzfivrzYQ7B7oBMZKwPRdhjB1iNvX71XZ" + ] + } + }, + { + "value": 1.54021112, + "valueSat": 154021112, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 53dc8bffae84a3851ab9fe296417da85d5e71858 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91453dc8bffae84a3851ab9fe296417da85d5e7185888ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "XiLG83Jj8reHt7YH4H4JQ16q7c2q78KCSz" + ] + } + } + ], + "extraPayloadSize": 175, + "extraPayload": "0300da5c1e0054e04067fa61cef61f1e91b0d52c21b28cdc69cc9d0383f0bb88ba0129b973e2f67e47d5580e70c7e77af8b1a6670669c7424b896ab3d44d349a4988e9a8328d00b22fef542f5c630e4f2a67ad56d30cf2a3dac55848abcd2bac30bf780318792bcdf32f7729443846c9fdc57050a131cd12c0e54a16f6265e900f459e3b9dd43421a0bc3f61efd49ce752e440e5131a8d2758a280ad883b8eb902c49ee5b878b30000000000000000", + "cbTx": { + "version": 3, + "height": 1989850, + "merkleRootMNList": "e273b92901ba88bbf083039dcc69dc8cb2212cd5b0911e1ff6ce61fa6740e054", + "merkleRootQuorums": "8d32a8e988499a344dd4b36a894b42c7690667a6b1f87ae7c7700e58d5477ef6", + "bestCLHeightDiff": 0, + "bestCLSignature": "b22fef542f5c630e4f2a67ad56d30cf2a3dac55848abcd2bac30bf780318792bcdf32f7729443846c9fdc57050a131cd12c0e54a16f6265e900f459e3b9dd43421a0bc3f61efd49ce752e440e5131a8d2758a280ad883b8eb902c49ee5b878b3", + "creditPoolBalance": 0.00000000 + }, + "hex": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff2703da5c1e04d04580650800007588782d01000fe4b883e5bda9e7a59ee4bb99e9b1bc04f09f909f88f581b80253640f03000000001976a9147c086eada12bdb10a265c16c08a7ae87366bd48188acf82c2e09000000001976a91453dc8bffae84a3851ab9fe296417da85d5e7185888aca0f04c20af0300da5c1e0054e04067fa61cef61f1e91b0d52c21b28cdc69cc9d0383f0bb88ba0129b973e2f67e47d5580e70c7e77af8b1a6670669c7424b896ab3d44d349a4988e9a8328d00b22fef542f5c630e4f2a67ad56d30cf2a3dac55848abcd2bac30bf780318792bcdf32f7729443846c9fdc57050a131cd12c0e54a16f6265e900f459e3b9dd43421a0bc3f61efd49ce752e440e5131a8d2758a280ad883b8eb902c49ee5b878b30000000000000000", + "blockhash": "0000000000000025033c275e59b2b6beda724cf5ab49a96e001d080b68d00279", + "height": 1989850, + "confirmations": 135, + "time": 1702905296, + "blocktime": 1702905296, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} +``` + +```{eval-rst} +.. _ref-txs-qctx: +``` + +## QcTx + +*Added in protocol version 70213 of Dash Core as described by [DIP6](https://github.com/dashpay/dips/blob/master/dip-0006.md)* + +:::{note} +This special transaction has no inputs and no outputs and thus also pays no fee. +::: + +The Quorum Commitment (QcTx) special transaction adds the best final commitment from a [Long-Living Masternode Quorum](../resources/glossary.md#long-living-masternode-quorum) (LLMQ) Distributed Key Generation (DKG) session to the chain. + +Since this special transaction pays no fees, it is mandatory by [consensus rules](../resources/glossary.md#consensus-rules) to ensure that miners include it. Exactly one quorum commitment transaction MUST be included in every [block](../resources/glossary.md#block) while in the mining phase of the LLMQ process until a valid commitment is present in a block. + +If a DKG failed or a [miner](../resources/glossary.md#miner) did not receive a final commitment in-time, a null commitment has to be included in the special transaction payload. A null commitment must have the `signers` and `validMembers` bitsets set to the `quorumSize` and all bits set to zero. All other fields must be set to the null representation of the field’s types. + +The special transaction type used for Quorum Commitment Transactions is 6 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 2 | version | uint_16 | Quorum Commitment version number. Currently set to 1. Will change to 2 after Dash Core v18.0 hard fork. +| 4 | height | uint32_t | Height of the block +| Variable | commitment | qfcommit | The payload of the [`qfcommit` message](../reference/p2p-network-quorum-messages.md#qfcommit) + +The following annotated hexdump shows a QcTx transaction. + +An itemized quorum commitment transaction (v1): + +``` text +0300 ....................................... Version (3) +0600 ....................................... Type (6 - Quorum Commitment) + +00 ......................................... Number of inputs +00 ......................................... Number of outputs + +00000000 ................................... Locktime + +fd4901 ..................................... Extra payload size (329) + +Quorum Commitment Transaction Payload +| 0100 ..................................... Version (1) +| +| 934c0100 ................................. Block height: 85139 +| +| Payload from the qfcommit message +| | 0100 ................................... Version (1) +| | +| | 01 ..................................... LLMQ Type (1) +| | +| | 6b2fd2c61cea32d939ee7fe185c7abc5 +| | 01aa7001d973379f46b9200500000000 ....... Quorum hash +| | +| | 32 ..................................... Number of signers (50) +| | bfffffffffff03 ......................... Aggregrated signers bitvector +| | +| | 32 ..................................... Number of valid members (50) +| | bfffffffffff03 ......................... Valid members bitvector +| | +| | 9450e90f61a24a4205c92572666ed068 +| | 40f617ac11a26d650c88769675e81197 +| | 993858d8b695f120f0af7dd38c17a67e ....... Quorum public key (BLS) +| | +| | 912507814fe204c59e14720bc961c09f +| | f88a4fd1f15e9c2efd4e4f112720967d ....... Quorum verification vector hash +| | +| | Quorum threshold signature (BLS) +| | 0281c321090c2d2e59a0d3754dcfbc11 +| | d76c26a152b50885d826915af4d95a73 +| | 120d0e1ba7e96d89f40252e24109c323 +| | 0971dda1f554d331985ca570c76b9a1a +| | ec699ec132838ae097c767d65d0a51d7 +| | 017c62e062270b60b854ae912bc07437 ....... BLS Signatures (96 bytes) +| | +| | Aggregated signatures from all commitments (BLS) +| | 91f878a0ae620e2178bff06c3a3967d7 +| | 433d4b82e7879bb927dd5cb605423c84 +| | 0641fcddf3731da80d0515a172ff3666 +| | 0f4eac88ee8fd7779e32e4f0be704078 +| | df31601b87b95374cebb4b304afc543e +| | e0d4f461a2ba0e32a711197ca559dacf ....... BLS Signature (96 bytes) +``` + +### Example QcTx + +```Text Raw Transaction hex +03000600000000000000fd49010100d3710b000100016deffc783c55e385653fe687fb5ec594 +46e4c3a2146898ca297e02013300000032ffffffffffff0332ffffffffffff031636185ce736 +08e3077536f0621bea1fbc78449f96e40b1f67ca7b50a7638562c716bc9d4fdaa7002be06e6e +54c49369d91c78768678912d3ec71d2d11d92e42488772bd3cdcaa2ce15a016e9eb998048af4 +e3ce1100e5188d30c2769e811691f75e94b20fe4c3867b918483319b7f4c7b924599a621b876 +fbfa943cd38017bb1226e55beb1df752ddc74470e04f38e8e644d5a74c2783f939b72728bcc6 +c5b22b21ed8caf3bcfb90212a8ee6517afeb04ec5a9af7064c7df1f92b01b7cc71e7f76f6dbc +8e53cdd5d5f274566eece977e9431cc9bedf76a241ac95faea018e160bdf89270808acef4f63 +1fcd8a551d896581455a37a33f8ef6202145bc1561a404798dffd339b105b5716937e4086f04 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction) + +```json JSON Representation +{ + "txid": "82600f79f0f58299995775382af1e813bdbe593b270e4e891baec064307f2a54", + "version": 3, + "type": 6, + "size": 342, + "locktime": 0, + "vin": [ + ], + "vout": [ + ], + "extraPayloadSize": 329, + "extraPayload": "0100d3710b000100016deffc783c55e385653fe687fb5ec59446e4c3a2146898ca297e02013300000032ffffffffffff0332ffffffffffff031636185ce73608e3077536f0621bea1fbc78449f96e40b1f67ca7b50a7638562c716bc9d4fdaa7002be06e6e54c49369d91c78768678912d3ec71d2d11d92e42488772bd3cdcaa2ce15a016e9eb998048af4e3ce1100e5188d30c2769e811691f75e94b20fe4c3867b918483319b7f4c7b924599a621b876fbfa943cd38017bb1226e55beb1df752ddc74470e04f38e8e644d5a74c2783f939b72728bcc6c5b22b21ed8caf3bcfb90212a8ee6517afeb04ec5a9af7064c7df1f92b01b7cc71e7f76f6dbc8e53cdd5d5f274566eece977e9431cc9bedf76a241ac95faea018e160bdf89270808acef4f631fcd8a551d896581455a37a33f8ef6202145bc1561a404798dffd339b105b5716937e4086f04", + "qcTx": { + "version": 1, + "height": 750035, + "commitment": { + "version": 1, + "llmqType": 1, + "quorumHash": "0000003301027e29ca986814a2c3e44694c55efb87e63f6585e3553c78fcef6d", + "quorumIndex": 0, + "signersCount": 50, + "signers": "ffffffffffff03", + "validMembersCount": 50, + "validMembers": "ffffffffffff03", + "quorumPublicKey": "1636185ce73608e3077536f0621bea1fbc78449f96e40b1f67ca7b50a7638562c716bc9d4fdaa7002be06e6e54c49369", + "quorumVvecHash": "0498b99e6e015ae12caadc3cbd728748422ed9112d1dc73e2d91788676781cd9", + "quorumSig": "8af4e3ce1100e5188d30c2769e811691f75e94b20fe4c3867b918483319b7f4c7b924599a621b876fbfa943cd38017bb1226e55beb1df752ddc74470e04f38e8e644d5a74c2783f939b72728bcc6c5b22b21ed8caf3bcfb90212a8ee6517afeb", + "membersSig": "04ec5a9af7064c7df1f92b01b7cc71e7f76f6dbc8e53cdd5d5f274566eece977e9431cc9bedf76a241ac95faea018e160bdf89270808acef4f631fcd8a551d896581455a37a33f8ef6202145bc1561a404798dffd339b105b5716937e4086f04" + } + }, + "hex": "03000600000000000000fd49010100d3710b000100016deffc783c55e385653fe687fb5ec59446e4c3a2146898ca297e02013300000032ffffffffffff0332ffffffffffff031636185ce73608e3077536f0621bea1fbc78449f96e40b1f67ca7b50a7638562c716bc9d4fdaa7002be06e6e54c49369d91c78768678912d3ec71d2d11d92e42488772bd3cdcaa2ce15a016e9eb998048af4e3ce1100e5188d30c2769e811691f75e94b20fe4c3867b918483319b7f4c7b924599a621b876fbfa943cd38017bb1226e55beb1df752ddc74470e04f38e8e644d5a74c2783f939b72728bcc6c5b22b21ed8caf3bcfb90212a8ee6517afeb04ec5a9af7064c7df1f92b01b7cc71e7f76f6dbc8e53cdd5d5f274566eece977e9431cc9bedf76a241ac95faea018e160bdf89270808acef4f631fcd8a551d896581455a37a33f8ef6202145bc1561a404798dffd339b105b5716937e4086f04", + "blockhash": "000000adc9d8a9ff83e79d78efb30f70c73c1f22496bb5d86b775f1d79203fbe", + "height": 750035, + "confirmations": 108598, + "time": 1656194626, + "blocktime": 1656194626, + "instantlock": true, + "instantlock_internal": false, + "chainlock": true +} + +``` + +```{eval-rst} +.. _ref-txs-mnhftx: +``` + +## MnHfTx + +*Fully implemented in protocol version 70230 of Dash Core as described by [DIP23](https://github.com/dashpay/dips/blob/master/dip-0023.md)* + +:::{note} +This special transaction has no inputs and no outputs and thus also pays no fee +::: + +The Masternode Hard Fork Signal (MnHfTx) special transaction adds the masternode hard fork signal produced by an LLMQ_400_85 quorum to the chain. Since this special transaction pays no fees, it is mandatory by consensus rules to ensure that miners include it. This can be done by any miner in any block, but it should only be included once. + +The special transaction type used for Masternode Hard Fork Signal Transactions is 7 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +| ---------- | ----------- | -------- | -------- | +| 1 | version | uint_8 | Special transaction version number. Currently set to 1. Please note that this is *not* the same as the `versionBit` field of the `mnhfsignal` message. | +| 129 | commitment | mnhfsignal | The payload of the `mnhfsignal` message defined in [DIP23](https://github.com/dashpay/dips/blob/master/dip-0023.md#new-system) | + +The `mnhfsignal` message contains: + +| Bytes | Name | Data type | Description | +|-|-|-|-| +| 1 | versionBit | uint8_t | The version bit associated with the hard fork | +| 32 | quorumHash | uint256 | Hash of the quorum signing this message | +| 96 | sig | CBLSSig | BLS signature on `version` by a public key associated with the quorum referenced by `quorumHash` | + +The following annotated hexdump shows a MnHfTx transaction. (Parts of the classical transaction section have been omitted.) + +``` text +0300 ....................................... Version (3) +0700 ....................................... Type (7 - Masternode Hard Fork Signal) + +00 ......................................... Number of inputs (0) +00 ......................................... Number of outputs (0) +00000000 ................................... Locktime (0) +82 ......................................... Extra payload size (130) + +Masternode Hard Fork Payload +| 01 ....................................... MnHfTx version (1) +| +| Commitment Signal +| | 0a ..................................... Hard fork bit (10) +| | +| | 27b679cb0c70b6d93f22d1a690c1e99f +| | 72fb9fdb4be9987c1000000000000000 ....... Quorum hash +| | +| | a12bc6a3d43e76fd6ab5d48dff119988 +| | 11747bf51ffe722d9fda93ae892e4b18 +| | a716f58045c86459d0dafd38ae1f7f52 +| | 0519002983fc307e92fa606c3eb5ac8c +| | f6ca03a102889866d58c9207b483e0b9 +| | 75baee63c1202209293ff7393222f812 ....... BLS signature +``` + +### Example MnHfTx + +```Text Raw Transaction hex +0300070000000000000082010a27b679cb0c70b6d93f22d1a690c1e99f72fb9fdb4be9987c1000000000000000a12bc6a3d43e76fd6ab5d48dff11998811747bf51ffe722d9fda93ae892e4b18a716f58045c86459d0dafd38ae1f7f520519002983fc307e92fa606c3eb5ac8cf6ca03a102889866d58c9207b483e0b975baee63c1202209293ff7393222f812 +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "5acff2cce2486b897258746202017649c5bdd873ece9e6d0298e5cccf0f23275", + "version": 3, + "type": 7, + "size": 141, + "locktime": 0, + "vin": [ + ], + "vout": [ + ], + "extraPayloadSize": 130, + "extraPayload": "010a27b679cb0c70b6d93f22d1a690c1e99f72fb9fdb4be9987c1000000000000000a12bc6a3d43e76fd6ab5d48dff11998811747bf51ffe722d9fda93ae892e4b18a716f58045c86459d0dafd38ae1f7f520519002983fc307e92fa606c3eb5ac8cf6ca03a102889866d58c9207b483e0b975baee63c1202209293ff7393222f812", + "mnhfTx": { + "version": 1, + "signal": { + "versionBit": 10, + "quorumHash": "00000000000000107c98e94bdb9ffb729fe9c190a6d1223fd9b6700ccb79b627", + "sig": "a12bc6a3d43e76fd6ab5d48dff11998811747bf51ffe722d9fda93ae892e4b18a716f58045c86459d0dafd38ae1f7f520519002983fc307e92fa606c3eb5ac8cf6ca03a102889866d58c9207b483e0b975baee63c1202209293ff7393222f812" + } + }, + "fee": 0.00000000, + "hex": "0300070000000000000082010a27b679cb0c70b6d93f22d1a690c1e99f72fb9fdb4be9987c1000000000000000a12bc6a3d43e76fd6ab5d48dff11998811747bf51ffe722d9fda93ae892e4b18a716f58045c86459d0dafd38ae1f7f520519002983fc307e92fa606c3eb5ac8cf6ca03a102889866d58c9207b483e0b975baee63c1202209293ff7393222f812", + "instantlock": true, + "instantlock_internal": false +} +``` + +```{eval-rst} +.. _ref-txs-assetlocktx: +``` + +## AssetLockTx + +The Asset Lock transaction is a DIP2-based special transaction that gives Platform the information to assign credits to [identities](inv:platform:std#explanations-identity). + +The special transaction type used for asset lock transactions is 8 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +|-|-|-|-| +| 1 | version | uint8_t | Asset lock payload version number | +| 1 | count | uint8_t | Number of accounts funded by this asset lock | +| Variable | credit_outputs | vector | The hash of the public key used to claim credits on Dash Platform, as well as the amount of Dash in duffs transferred into credits for this hash | + +The following annotated hexdump shows an asset lock transaction. + +``` text +0300 ....................................... Version (3) +0800 ....................................... Type (8 - Asset Lock) + +01 ......................................... Number of inputs +| eecf4e8f1ffd3a3a4e5033d618231fd0 +| 5e5f08c1a727aac420f9a26db9bf39eb ......... Previous outpoint TXID +| 01000000 ................................. Previous outpoint index (1) +| +| 6a ....................................... Bytes in script: 106 +| +| 473044022026f169570532332f857cb6 +| 4a0b7d9c0837d6f031633e1d6c395d7c +| 03b799460302207eba4c4575a66803ce +| cf50b61ff5f2efc2bd4e61dff00d9d48 +| 47aa3d8b1a5e550121036cd0b73d304b +| acc80fa747d254fbc5f0bf944dd8c8b9 +| 25cd161bb499b790d08d03 ................... Signature script +| +| 00000000 ................................. Sequence + +02 ......................................... Number of outputs +| Transaction Output 1 +| | 317dd0be03000000 ....................... Duffs (160.86236465 DASH) +| | 23 ..................................... Bytes in script: 35 +| | 21022ca85dba11c4e5a6da3a00e73a08765 +| | 319a5d66c2f6434b288494337b0c9ed2dac .... Script +| +| Transaction Output 2 +| | 6df29c3b00000000 ....................... Duffs (10.00141421 DASH) +| | 02 ..................................... Bytes in script: 2 +| | 6a00 ................................... Script (OP_RETURN) + +00000000 ................................... Locktime + +46 ......................................... Extra payload size (70) + +Asset Lock Payload +| 01 ....................................... Version (1) +| +| 02 ....................................... Count: 2 +| +| Credit Output 1 +| | 00e1f50500000000 ....................... Duffs (100000000 DASH) +| | 1976a9147c75beb097957cc095 +| | 37b615dde9ea6807719cdf88ac ............. Script +| +| Credit Output 2 +| | 6d11a73500000000 ....................... Duffs (900141421 DASH) +| | 1976a9147c75beb097957cc095 +| | 37b615dde9ea6807719cdf88ac ............. Script +``` + +### Example Asset Lock Transaction + +```Text Raw Transaction hex +0300080001eecf4e8f1ffd3a3a4e5033d618231fd05e5f08c1a727aac420f9a26db9bf39eb0 +10000006a473044022026f169570532332f857cb64a0b7d9c0837d6f031633e1d6c395d7c03 +b799460302207eba4c4575a66803cecf50b61ff5f2efc2bd4e61dff00d9d4847aa3d8b1a5e5 +50121036cd0b73d304bacc80fa747d254fbc5f0bf944dd8c8b925cd161bb499b790d08d0000 +000002317dd0be030000002321022ca85dba11c4e5a6da3a00e73a08765319a5d66c2f6434b +288494337b0c9ed2dac6df29c3b00000000026a000000000046010200e1f505000000001976 +a9147c75beb097957cc09537b615dde9ea6807719cdf88ac6d11a735000000001976a9147c7 +5beb097957cc09537b615dde9ea6807719cdf88ac +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "fdb0e981c3febc6c2c032e6f51e6f063bfc6aaa9bd238985a442c93bd376fd57", + "version": 3, + "type": 8, + "size": 283, + "locktime": 0, + "vin": [ + { + "txid": "eb39bfb96da2f920c4aa27a7c1085f5ed01f2318d633504e3a3afd1f8f4ecfee", + "vout": 1, + "scriptSig": { + "asm": "3044022026f169570532332f857cb64a0b7d9c0837d6f031633e1d6c395d7c03b799460302207eba4c4575a66803cecf50b61ff5f2efc2bd4e61dff00d9d4847aa3d8b1a5e55[ALL] 036cd0b73d304bacc80fa747d254fbc5f0bf944dd8c8b925cd161bb499b790d08d", + "hex": "473044022026f169570532332f857cb64a0b7d9c0837d6f031633e1d6c395d7c03b799460302207eba4c4575a66803cecf50b61ff5f2efc2bd4e61dff00d9d4847aa3d8b1a5e550121036cd0b73d304bacc80fa747d254fbc5f0bf944dd8c8b925cd161bb499b790d08d" + }, + "sequence": 0 + } + ], + "vout": [ + { + "value": 160.86236465, + "valueSat": 16086236465, + "n": 0, + "scriptPubKey": { + "asm": "022ca85dba11c4e5a6da3a00e73a08765319a5d66c2f6434b288494337b0c9ed2d OP_CHECKSIG", + "hex": "21022ca85dba11c4e5a6da3a00e73a08765319a5d66c2f6434b288494337b0c9ed2dac", + "type": "pubkey" + } + }, + { + "value": 10.00141421, + "valueSat": 1000141421, + "n": 1, + "scriptPubKey": { + "asm": "OP_RETURN 0", + "hex": "6a00", + "type": "nulldata" + } + } + ], + "extraPayloadSize": 70, + "extraPayload": "010200e1f505000000001976a9147c75beb097957cc09537b615dde9ea6807719cdf88ac6d11a735000000001976a9147c75beb097957cc09537b615dde9ea6807719cdf88ac", + "assetLockTx": { + "version": 1, + "creditOutputs": [ + "CTxOut(nValue=1.00000000, scriptPubKey=76a9147c75beb097957cc09537b615)", + "CTxOut(nValue=9.00141421, scriptPubKey=76a9147c75beb097957cc09537b615)" + ] + } +} +``` + +```{eval-rst} +.. _ref-txs-assetunlocktx: +``` + +## AssetUnlockTx + +:::{note} +This special transaction has no inputs +::: + +The Asset Unlock transaction is a DIP2-based special transaction that enables Platform credits to be withdrawn back to Dash. + +The special transaction type used for asset unlock transactions is 9 and the extra payload consists of the following data: + +| Bytes | Name | Data type | Description | +|-|-|-|-| +| 1 | version | uint8_t | Asset unlock payload version number | +| 8 | index | uint64_t | The index of the transaction | +| 4 | fee | uint32_t | The transaction fee in duffs that should be awarded to the miner | +| 4 | requestedHeight | uint32_t | The payment chain block height known by platform at the moment of the withdrawal signing | +| 32 | quorumHash | uint256 | Hash of the quorum signing this message | +| 96 | quorumSig | CBLSSig | BLS signature for the entire transaction by a public key associated with the quorum referenced by `quorumHash` | + +The following annotated hexdump shows an asset unlock transaction. + +``` text +0300 ....................................... Version (3) +0900 ....................................... Type (9 - Asset Unlock) + +00 ......................................... Number of inputs + +01 ......................................... Number of outputs +| Transaction Output 1 +| | 90cff40500000000 ....................... Duffs (0.99930000 DASH) +| | 23 ..................................... Bytes in script: 35 +| | 2103d2c317552f5617f534065b9693fd4d7 +| | a8925daacdb9d44e908f9ffb0d285ea61ac .... Script + +00000000 ................................... Locktime + +91 ......................................... Extra payload size (145) + +Asset Unlock Payload +| 01 ....................................... Version (1) +| +| 6500000000000000 ......................... Index: 101 +| 70110100 ................................. Fee: 70000 +| db040000 ................................. Requested height: 1243 +| +| 6f0f4a04d9a37a8c7791e90428d596d0 +| caf5dc85292537ff92ffd361300c3101 ......... Quorum hash +| +| a533b35ae1d7685c6c795b7344963d48 +| 589d536a1c2b22e6a580b46439adaaf8 +| 51b4243b48be81d508ef3ff622bcba26 +| 030b5bf8aa404dd3b5876727f4112a9d +| af99f27d250059679ae5abd30bc3029d +| eeeb7267c1fa6204f6976a3a7a2512ea ......... Quorum Signature +``` + +### Example AssetUnlockTx + +```Text Raw Transaction hex +03000900000190cff40500000000232103d2c317552f5617f534065b9693fd4d7a8925daacd +b9d44e908f9ffb0d285ea61ac000000009101650000000000000070110100db0400006f0f4a +04d9a37a8c7791e90428d596d0caf5dc85292537ff92ffd361300c3101a533b35ae1d7685c6 +c795b7344963d48589d536a1c2b22e6a580b46439adaaf851b4243b48be81d508ef3ff622bc +ba26030b5bf8aa404dd3b5876727f4112a9daf99f27d250059679ae5abd30bc3029deeeb726 +7c1fa6204f6976a3a7a2512ea +``` + +The JSON representation of a raw transaction can be obtained with the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) or the [`decoderawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction). + +```json JSON Representation +{ + "txid": "fb1b419b2b909f2ddb7fabee91d8e1aa7bb8e7114c83712ff20ba1859ec57b30", + "version": 3, + "type": 9, + "size": 200, + "locktime": 0, + "vin": [ + ], + "vout": [ + { + "value": 0.99930000, + "valueSat": 99930000, + "n": 0, + "scriptPubKey": { + "asm": "03d2c317552f5617f534065b9693fd4d7a8925daacdb9d44e908f9ffb0d285ea61 OP_CHECKSIG", + "hex": "2103d2c317552f5617f534065b9693fd4d7a8925daacdb9d44e908f9ffb0d285ea61ac", + "type": "pubkey" + } + } + ], + "extraPayloadSize": 145, + "extraPayload": "01650000000000000070110100db0400006f0f4a04d9a37a8c7791e90428d596d0caf5dc85292537ff92ffd361300c3101a533b35ae1d7685c6c795b7344963d48589d536a1c2b22e6a580b46439adaaf851b4243b48be81d508ef3ff622bcba26030b5bf8aa404dd3b5876727f4112a9daf99f27d250059679ae5abd30bc3029deeeb7267c1fa6204f6976a3a7a2512ea", + "assetUnlockTx": { + "version": 1, + "index": 101, + "fee": 70000, + "requestedHeight": 1243, + "quorumHash": "01310c3061d3ff92ff37252985dcf5cad096d52804e991778c7aa3d9044a0f6f", + "quorumSig": "a533b35ae1d7685c6c795b7344963d48589d536a1c2b22e6a580b46439adaaf851b4243b48be81d508ef3ff622bcba26030b5bf8aa404dd3b5876727f4112a9daf99f27d250059679ae5abd30bc3029deeeb7267c1fa6204f6976a3a7a2512ea" + } +} +``` diff --git a/docs/core/reference/transactions.md b/docs/core/reference/transactions.md new file mode 100644 index 000000000..deba387f6 --- /dev/null +++ b/docs/core/reference/transactions.md @@ -0,0 +1,15 @@ +# Transactions + +The following subsections briefly document core transaction details. + + + +```{toctree} +:maxdepth: 2 + +transactions-opcodes +transactions-address-conversion +transactions-raw-transaction-format +transactions-special-transactions +transactions-compactsize-unsigned-integers +``` diff --git a/docs/core/reference/wallets.md b/docs/core/reference/wallets.md new file mode 100644 index 000000000..e78108d3f --- /dev/null +++ b/docs/core/reference/wallets.md @@ -0,0 +1,19 @@ +```{eval-rst} +.. meta:: + :title: Wallets + :description: Dash has two deterministic wallet formats – single chain wallets and hierarchical deterministic (HD) wallets. +``` + +# Wallets + +## Deterministic Wallet Formats + +### Type 1: Single Chain Wallets + +A Type 1 deterministic [wallet](../resources/glossary.md#wallet) is the simpler of the two, which can create a single series of keys from a single seed. A primary weakness is that if the seed is leaked, all funds are compromised, and wallet sharing is extremely limited. + +### Type 2: Hierarchical Deterministic (HD) Wallets + +![Overview Of Hierarchical Deterministic Key Derivation](../../img/dev/en-hd-overview.svg) + +For an overview of the [HD wallet](../resources/glossary.md#hd-wallet), please see the [developer guide section](../guide/wallets.md). For details, please see [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki). diff --git a/docs/core/resources/glossary.md b/docs/core/resources/glossary.md new file mode 100644 index 000000000..50c2f8b00 --- /dev/null +++ b/docs/core/resources/glossary.md @@ -0,0 +1,709 @@ +```{eval-rst} +.. _resources-glossary: +``` + +# Glossary + +## 51 percent attack + +The ability of someone controlling a majority of network hash rate to revise transaction history and prevent new transactions from confirming. + +## Address + +A 20-byte hash formatted using base58check to produce either a P2PKH or P2SH Dash address. Currently the most common way users exchange payment information. + +## Base58 + +The method used in Dash for converting 160-bit hashes into P2PKH and P2SH addresses. Also used in other parts of Dash, such as encoding private keys for backup in WIP format. Not the same as other base58 implementations. + +## Base58check + +The method used in Dash for converting 160-bit hashes into P2PKH and P2SH addresses. Also used in other parts of Dash, such as encoding private keys for backup in WIP format. Not the same as other base58 implementations. + +## BIP32 + +The Hierarchical Deterministic (HD) key creation and transfer protocol (BIP32), which allows creating child keys from parent keys in a hierarchy. Wallets using the HD protocol are called HD wallets. + +## BIP70 payment protocol + +The protocol defined in BIP70 (and other BIPs) which lets spenders get signed payment details from receivers. + +## Block + +One or more transactions prefaced by a block header and protected by proof of work. Blocks are the data stored on the block chain. + +## Block chain + +A chain of blocks with each block referencing the block that preceded it. The most-difficult-to-recreate chain is the best block chain. + +## Block header + +An 80-byte header belonging to a single block which is hashed repeatedly to create proof of work. + +## Block height + +The number of blocks preceding a particular block on a block chain. For example, the genesis block has a height of zero because zero block preceded it. + +## Block reward + +The amount that miners may claim as a reward for creating a block. Equal to the sum of the [block subsidy](#block-subsidy) (newly available duffs) plus the transactions fees paid by transactions included in the block. + +## Block subsidy + +The amount of new Dash created in each block. It comprises the non-fee part of the [block reward](#block-reward). + +## Block size limit + +The maximum size in bytes that the consensus rules allow a block to be. The current block size limit is 2000000 bytes. + +## Blocks-first sync + +Synchronizing the block chain by downloading each block from a peer and then validating it. + +## blocktransactions + +A P2P Networking data structure used to provide some of the transactions in a block as requested. + +## blocktransactionsrequest + +A P2P Networking data structure used to list transaction indexes in a block being requested by a peer. + +## Bloom filter + +A filter used primarily by SPV clients to request only matching transactions and merkle blocks from full nodes. + +## Chain code + +In HD wallets, 256 bits of entropy added to the public and private keys to help them generate secure child keys; the master chain code is usually derived from a seed along with the master private key + +## ChainLock + +ChainLocks are a feature enabling near instant consensus on the valid chain. ChainLocks use Long-Living Masternode Quorums to sign mined blocks. This mitigates 51 percent attacks and reduces uncertainty when receiving funds. + +See also: + +* [ChainLocks (Core Guide)](../guide/dash-features-chainlocks.md) +* [ChainLocks Overview (User docs)](chainlocks) +* [DIP-8: ChainLocks](https://github.com/dashpay/dips/blob/master/dip-0008.md) +* [ChainLock integration developer info](integration-chainlocks) + +## Change output + +An output in a transaction which returns duffs to the spender, thus preventing too much of the input value from going to transaction fees. + +## Child key + +In HD wallets, a key derived from a parent key. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Child pays for parent + +Selecting transactions for mining not just based on their fees but also based on the fees of their ancestors (parents) and descendants (children). + +## Child private key + +In HD wallets, a key derived from a parent key. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Child public key + +In HD wallets, a key derived from a parent key. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Coinbase + +A special field used as the sole input for coinbase transactions. The coinbase allows claiming the block reward and provides up to 100 bytes for arbitrary data. + +## Coinbase block height + +The current block's height encoded into the first bytes of the coinbase field. + +## Coinbase transaction + +The first transaction in a block. Always created by a miner, it includes a single coinbase. + +## CoinJoin + +A masternode managed, decentralized [CoinJoin](https://en.bitcoin.it/wiki/CoinJoin) service for creating an on-demand system of removing the history from coins on the network. CoinJoin processes inputs while allowing each participant to retain control of their coins at all times so the process can be done without trusting a third party. + +## CompactSize + +A type of variable-length integer commonly used in the Dash P2P protocol and Dash serialized data structures. + +## Compressed public key + +An ECDSA public key that is 33 bytes long rather than the 65 bytes of an uncompressed public key. + +## Confirmations + +A score indicating the number of blocks on the best block chain that would need to be modified to remove or modify a particular transaction. A confirmed transaction has a confirmation score of one or higher. + +## Consensus + +When several nodes (usually most nodes on the network) all have the same blocks in their locally-validated best block chain. + +## Consensus rules + +The block validation rules that full nodes follow to stay in consensus with other nodes. + +## Dark Gravity Wave + +An open source difficulty-adjusting algorithm for Bitcoin-based cryptocurrencies that was first used in Dash. Difficulty adjusts every block based on historical statistical data to ensure consistent block issuance regardless of hash rate fluctuation. + +## Dash address encoding + +The method used in Dash for converting 160-bit hashes into P2PKH and P2SH addresses. Also used in other parts of Dash, such as encoding private keys for backup in WIP format. Not the same as other base58 implementations. + +## Data-pushing opcode + +Any opcode from 0x01 to 0x4e which pushes data on to the script evaluation stack. + +## Decentralized Governance By Blockchain + +The method used in Dash for funding development and making decisions regarding the project direction and priorities. + +## Denominations + +Denominations of Dash value, usually measured in fractions of a dash but sometimes measured in multiples of a duff. One dash equals 100,000,000 duffs. + +## Devnet + +A development environment in which developers can obtain and spend duffs that have no real-world value on a network that is very similar to the Dash mainnet. Multiple independent devnets can coexist without interference. Devnets can be either public or private. + +## Difficulty + +How difficult it is to find a block relative to the difficulty of finding the easiest possible block. The easiest possible block has a proof-of-work difficulty of 1. + +## DNS seed + +A DNS server which returns IP addresses of full nodes on the Dash network to assist in peer discovery. + +## Double spend + +A transaction that uses the same input as an already broadcast transaction. The attempt of duplication, deceit, or conversion, will be adjudicated when only one of the transactions is recorded in the blockchain. + +## Duffs + +Denominations of Dash value, usually measured in fractions of a dash but sometimes measured in multiples of a duff. One dash equals 100,000,000 duffs. + +## ECDSA private key + +The private portion of a keypair which can create signatures that other people can verify using the public key. + +## ECDSA signatures + +A value related to a public key which could only have reasonably been created by someone who has the private key that created that public key. Used in Dash to authorize spending duffs previously sent to a public key. + +## Escrow contract + +A transaction in which a spender and receiver place funds in a 2-of-2 (or other m-of-n) multisig output so that neither can spend the funds until they're both satisfied with some external outcome. + +## Evolution + +Code name for a decentralized currency platform built on the Dash blockchain technology. The goal is to provide simple access to the unique features and benefits of Dash to assist in the creation of decentralized technology. + +## Extended key + +In the context of HD wallets, a public key or private key extended with the chain code to allow them to derive child keys. + +## Extended private key + +In the context of HD wallets, a public key or private key extended with the chain code to allow them to derive child keys. + +## Extended public key + +In the context of HD wallets, a public key or private key extended with the chain code to allow them to derive child keys. + +## Evolution masternode (EvoNode) + +Evolution masternodes are a new type of [masternode](#masternode) created to host Dash Platform – a Web3 technology stack for building decentralized applications on the Dash network. The collateral required to own an evonode is 4000 DASH, as opposed to 1000 DASH for regular masternodes. Evonodes serve Platform along with Core, while regular masternodes only serve Core. The recommended specs for evonodes are higher than those for regular masternodes. + +## Fork + +When two or more blocks have the same block height, forking the block chain. Typically occurs when two or more miners find blocks at nearly the same time. Can also happen as part of an attack. + +## Genesis block + +The first block in the Dash block chain. + +## Hard fork + +A permanent divergence in the block chain, commonly occurs when non-upgraded nodes can't validate blocks created by upgraded nodes that follow newer consensus rules. + +## Hardened extended key + +A variation on HD wallet extended keys where only the hardened extended private key can derive child keys. This prevents compromise of the chain code plus any private key from putting the whole wallet at risk. + +## Hardened extended private key + +A variation on HD wallet extended keys where only the hardened extended private key can derive child keys. This prevents compromise of the chain code plus any private key from putting the whole wallet at risk. + +## HD wallet + +The Hierarchical Deterministic (HD) key creation and transfer protocol (BIP32), which allows creating child keys from parent keys in a hierarchy. Wallets using the HD protocol are called HD wallets. + +## HD wallet seed + +A potentially-short value used as a seed to generate the master private key and master chain code for an HD wallet. + +## Header + +An 80-byte header belonging to a single block which is hashed repeatedly to create proof of work. + +## Header chain + +A chain of block headers with each header linking to the header that preceded it; the most-difficult-to-recreate chain is the best header chain + +## headerandshortids + +A P2P Networking data structure used to relay a block header, the short transactions IDs used for matching already-available transactions, and a select few transactions which a peer may be missing. + +## Headers-first sync + +Synchronizing the block chain by downloading block headers before downloading the full blocks. + +## High-priority transaction + +Transactions that don't have to pay a transaction fee because their inputs have been idle long enough to accumulated large amounts of priority. Note: As of Dash Core 0.12.3, all transactions require a fee. Also, coin age priority logic was removed in Dash Core 0.14.0. + +## Index + +An index number used in the HD wallet formula to generate child keys from a parent key + +## Initial block download + +The process used by a new node (or long-offline node) to download a large number of blocks to catch up to the tip of the best block chain. + +## Input + +An input in a transaction which contains three fields: an outpoint, a signature script, and a sequence number. The outpoint references a previous output and the signature script allows spending it. + +## InstantSend + +InstantSend is a service that allows for near-instant transactions. Through this system, inputs can be locked to specific transactions and verified by consensus of the masternode network. InstantSend allows for zero-confirmation transactions to be safely accepted and re-spent prior to being mined into a block. + +See also: + +* [InstantSend (Core Guide)](../guide/dash-features-instantsend.md) +* [InstantSend Overview (User docs)](instantsend) +* [DIP-10: LLMQ InstantSend](https://github.com/dashpay/dips/blob/master/dip-0010.md) +* [InstantSend integration developer info](integration-instantsend) + +## Internal byte order + +The standard order in which hash digests are displayed as strings---the same format used in serialized blocks and transactions. + +## Inventory + +A data type identifier and a hash; used to identify transactions, blocks, and objects available for download through the Dash P2P network. + +## Key index + +An index number used in the HD wallet formula to generate child keys from a parent key. + +## Key pair + +A private key and its derived public key. + +## Locktime + +Part of a transaction which indicates the earliest time or earliest block when that transaction may be added to the block chain. + +## Long-Living Masternode Quorum + +Long-Living Masternode Quorums (LLMQs) are a Dash innovation that enable masternodes to perform threshold signing of consensus-related messages (e.g. InstantSend transactions). LLMQs provide a more scalable, general use quorum system than the ephemeral ones used prior to Dash Core version 0.14. + +## M-of-N multisig + +A pubkey script that provides *n* number of pubkeys and requires the corresponding signature script provide *m* minimum number signatures corresponding to the provided pubkeys. + +## Mainnet + +The original and main network for Dash transactions, where duffs have real economic value. + +## Majority Hash Rate Attack + +The ability of someone controlling a majority of network hash rate to revise transaction history and prevent new transactions from confirming. + +## Malleability + +The ability of someone to change (mutate) unconfirmed transactions without making them invalid, which changes the transaction's txid, making child transactions invalid. + +## Master chain code and private key + +In HD wallets, the master chain code and master private key are the two pieces of data derived from the root seed. + +## Master private key + +In HD wallets, the master chain code and master private key are the two pieces of data derived from the root seed. + +## Masternode + +A computer that provides second-tier Dash functionality (InstantSend, CoinJoin, decentralized governance). Masternodes are incentivized by receiving part of the block reward, but must hold 1000 Dash as collateral to prevent sybil attacks. + +See also: [Evolution masternode](#evolution-masternode-evonode) + +## Merkle block + +A partial merkle tree connecting transactions matching a bloom filter to the merkle root of a block. + +## Merkle root + +The root node of a merkle tree, a descendant of all the hashed pairs in the tree. Block headers must include a valid merkle root descended from all transactions in that block. + +## Merkle tree + +A tree constructed by hashing paired data (the leaves), then pairing and hashing the results until a single hash remains, the merkle root. In Dash, the leaves are almost always transactions from a single block. + +## Message header + +The four header fields prefixed to all messages on the Dash P2P network. + +## Miner + +Mining is the act of creating valid Dash blocks, which requires demonstrating proof of work, and miners are devices that mine or people who own those devices. + +## Miner Activated Soft Fork + +A Soft Fork activated by through miner signaling. + +## Miner fee + +The amount paid to the miner who includes a transaction in a block. This equals 25% of the amount remaining when the value of all outputs in a transaction are subtracted from all inputs in a transaction. The remaining 75% is paid to the masternode eligible for payment at the block height where the transaction is mined. Related to [transaction fee](#transaction-fee). + +## Miners + +Mining is the act of creating valid Dash blocks, which requires demonstrating proof of work, and miners are devices that mine or people who own those devices. + +## Minimum relay fee + +The minimum transaction fee a transaction must pay for a full node to relay that transaction to other nodes. There is no one minimum relay fee---each node chooses its own policy. + +## Mining + +Mining is the act of creating valid Dash blocks, which requires demonstrating proof of work, and miners are devices that mine or people who own those devices. + +## Multi-phased fork + +A spork is a mechanism unique to Dash used to safely deploy new features to the network through network-level variables to avoid the risk of unintended network forking during upgrades. Dash Core 21.0.0 [hardened all spork values on mainnet](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md#mainnet-spork-hardening). On test networks, spork values can still be updated dynamically. + +## Multisig + +A pubkey script that provides *n* number of pubkeys and requires the corresponding signature script provide *m* minimum number signatures corresponding to the provided pubkeys. + +## nBits + +The target is the threshold below which a block header hash must be in order for the block to be valid, and nBits is the encoded form of the target threshold as it appears in the block header. + +## Network + +The Dash P2P network which broadcasts transactions and blocks. + +## Network magic + +Four defined bytes which start every message in the Dash P2P protocol to allow seeking to the next message. + +## nLockTime + +Part of a transaction which indicates the earliest time or earliest block when that transaction may be added to the block chain. + +## Node + +A computer that connects to the Dash network. + +## Null data (OP_RETURN) transaction + +A transaction type that adds arbitrary data to a provably unspendable pubkey script that full nodes don't have to store in their UTXO database. + +## Opcode + +Operation codes from the Dash Script language which push data or perform functions within a pubkey script or signature script. + +## Orphan block + +Blocks whose parent block has not been processed by the local node, so they can't be fully validated yet. + +## Outpoint + +The data structure used to refer to a particular transaction output, consisting of a 32-byte TXID and a 4-byte output index number (vout). + +## Output + +An output in a transaction which contains two fields: a value field for transferring zero or more duffs and a pubkey script for indicating what conditions must be fulfilled for those duffs to be further spent. + +## Output index + +The sequentially-numbered index of outputs in a single transaction starting from 0. + +## P2PKH address + +A Dash payment address comprising a hashed public key, allowing the spender to create a standard pubkey script that Pays To PubKey Hash (P2PKH). + +## P2SH address + +A Dash payment address comprising a hashed script, allowing the spender to create a standard pubkey script that Pays To Script Hash (P2SH). The script can be almost any valid pubkey script. + +## P2SH multisig + +A P2SH output where the redeem script uses one of the multisig opcodes. Up until Bitcoin Core 0.10.0, P2SH multisig scripts were standard transactions, but most other P2SH scripts were not. + +## P2SH output + +A Dash payment address comprising a hashed script, allowing the spender to create a standard pubkey script that Pays To Script Hash (P2SH). The script can be almost any valid pubkey script. + +## P2SH pubkey script + +A Dash payment address comprising a hashed script, allowing the spender to create a standard pubkey script that Pays To Script Hash (P2SH). The script can be almost any valid pubkey script. + +## Parent chain code + +In HD wallets, 256 bits of entropy added to the public and private keys to help them generate secure child keys; the master chain code is usually derived from a seed along with the master private key + +## Parent key + +In HD wallets, a key used to derive child keys. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Parent private key + +In HD wallets, a key used to derive child keys. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Parent public key + +In HD wallets, a key used to derive child keys. The key can be either a private key or a public key, and the key derivation may also require a chain code. + +## Pay To PubKey Hash + +A Dash payment address comprising a hashed public key, allowing the spender to create a standard pubkey script that Pays To PubKey Hash (P2PKH). + +## Pay To Script Hash + +A Dash payment address comprising a hashed script, allowing the spender to create a standard pubkey script that Pays To Script Hash (P2SH). The script can be almost any valid pubkey script. + +## Payment protocol + +The protocol defined in BIP70 (and other BIPs) which lets spenders get signed payment details from receivers. + +## Peer + +A computer that connects to the Dash network. + +## Point function + +The ECDSA function used to create a public key from a private key. + +## Previous block header hash + +A field in the block header which contains the SHA256(SHA256()) hash of the previous block's header. + +## Private key + +The private portion of a keypair which can create signatures that other people can verify using the public key. + +## PrivateSend + +A masternode managed, decentralized CoinJoin service for creating an on-demand system of removing the history from coins on the network. CoinJoin processes inputs while allowing each participant to retain control of their coins at all times so the process can be done without trusting a third party. + +## Proof of work + +A hash below a target value which can only be obtained, on average, by performing a certain amount of brute force work---therefore demonstrating proof of work. + +## Pubkey script + +A script included in outputs which sets the conditions that must be fulfilled for those duffs to be spent. Data for fulfilling the conditions can be provided in a signature script. Pubkey Scripts are called a scriptPubKey in code. + +## Public key + +The public portion of a keypair which can be used to verify signatures made with the private portion of the keypair. + +## Raw block + +A complete block in its binary format---the same format used to calculate total block byte size; often represented using hexadecimal. + +## Raw format + +Complete transactions in their binary format; often represented using hexadecimal. Sometimes called raw format because of the various Dash Core commands with "raw" in their names. + +## Raw transaction + +Complete transactions in their binary format; often represented using hexadecimal. Sometimes called raw format because of the various Dash Core commands with "raw" in their names. + +## Replace-by-fee + +NOT IMPLEMENTED IN DASH. Replacing one version of an unconfirmed transaction with a different version of the transaction that pays a higher transaction fee. May use BIP125 signaling. + +## Redeem script + +A script similar in function to a pubkey script. One copy of it is hashed to create a P2SH address (used in an actual pubkey script) and another copy is placed in the spending signature script to enforce its conditions. + +## Regression test mode + +A local testing environment in which developers can almost instantly generate blocks on demand for testing events, and can create private duffs with no real-world value. + +## Root seed + +A potentially-short value used as a seed to generate the master private key and master chain code for an HD wallet. + +## RPC byte order + +A hash digest displayed with the byte order reversed; used in Dash Core RPCs, many block explorers, and other software. + +## scriptSig + +Data generated by a spender which is almost always used as variables to satisfy a pubkey script. Signature Scripts are called scriptSig in code. + +## secp256k1 signatures + +A value related to a public key which could only have reasonably been created by someone who has the private key that created that public key. Used in Dash to authorize spending duffs previously sent to a public key. + +## Sentinel + +An autonomous agent for persisting, processing and automating Dash governance objects and tasks, and for expanded functions in Dash Evolution. **Note**: Sentinel was deprecated in Dash Core v20.0 when its functionality was integrated into Dash Core. + +## Sequence number + +Part of all transactions. A number intended to allow unconfirmed time-locked transactions to be updated before being finalized; not currently used except to disable locktime in a transaction + +## Serialized block + +A complete block in its binary format---the same format used to calculate total block byte size; often represented using hexadecimal. + +## Serialized transaction + +Complete transactions in their binary format; often represented using hexadecimal. Sometimes called raw format because of the various Dash Core commands with "raw" in their names. + +## SIGHASH flag + +A flag to Dash signatures that indicates what parts of the transaction the signature signs. (The default is SIGHASH_ALL.) The unsigned parts of the transaction may be modified. + +## SIGHASH_ALL + +Default signature hash type which signs the entire transaction except any signature scripts, preventing modification of the signed parts. + +## SIGHASH_ANYONECANPAY + +A signature hash type which signs only the current input. + +## SIGHASH_NONE + +Signature hash type which only signs the inputs, allowing anyone to change the outputs however they'd like. + +## SIGHASH_SINGLE + +Signature hash type that signs the output corresponding to this input (the one with the same index value), this input, and any other inputs partially. Allows modification of other outputs and the sequence number of other inputs. + +## Signature + +A value related to a public key which could only have reasonably been created by someone who has the private key that created that public key. Used in Dash to authorize spending duffs previously sent to a public key. + +## Signature hash + +A flag to Dash signatures that indicates what parts of the transaction the signature signs. (The default is SIGHASH_ALL.) The unsigned parts of the transaction may be modified. + +## Signature script + +Data generated by a spender which is almost always used as variables to satisfy a pubkey script. Signature Scripts are called scriptSig in code. + +## Simplified Payment Verification + +A method for verifying if particular transactions are included in a block without downloading the entire block. The method is used by some lightweight clients. + +## Soft fork + +A softfork is a change to the dash protocol wherein only previously valid blocks/transactions are made invalid. Since old nodes will recognise the new blocks as valid, a softfork is backward-compatible. + +## Special transactions + +Special Transactions provide a way to include non-financial, consensus-assisting metadata (e.g. masternode lists) on-chain. + +## Spork + +A spork is a mechanism unique to Dash used to safely deploy new features to the network through network-level variables to avoid the risk of unintended network forking during upgrades. Dash Core 21.0.0 [hardened all spork values on mainnet](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md#mainnet-spork-hardening). On test networks, spork values can still be updated dynamically. + +## Stale block + +Blocks which were successfully mined but which aren't included on the current best block chain, likely because some other block at the same height had its chain extended first. + +## Standard block relay + +The regular block relay method: announcing a block with an inv message and waiting for a response. + +## Standard transaction + +A transaction that passes Dash Core's IsStandard() and IsStandardTx() tests. Only standard transactions are mined or broadcast by peers running the default Dash Core software. + +## Start string + +Four defined bytes which start every message in the Dash P2P protocol to allow seeking to the next message. + +## Superblock + +Special blocks that pay out funded budget proposals approved by masternode votes via the decentralized governance system. Superblocks are issued monthly and have a coinbase that can be much larger than normal. The superblock value is provided by the [portion of block subsidy](../reference/block-chain-serialized-blocks.md#block-reward) set aside for superblock payouts. + +## Target + +The target is the threshold below which a block header hash must be in order for the block to valid, and nBits is the encoded form of the target threshold as it appears in the block header. + +## Testnet + +A global testing environment in which developers can obtain and spend duffs that have no real-world value on a network that is very similar to the Dash mainnet. + +## Transaction + +A transaction spending satoshis. + +## Transaction fee + +The amount remaining when the value of all outputs in a transaction are subtracted from all inputs in a transaction; the fee is split between the miner (25%) that creates the block containing the transaction and the masternode (75%) eligible for payment in that block. + +## Transaction identifiers + +Identifiers used to uniquely identify a particular transaction; specifically, the sha256d hash of the transaction. Also known as TXIDs. + +## Transaction version number + +A version number prefixed to transactions to allow upgrading. + +## Unconfirmed transaction + +A score indicating the number of blocks on the best block chain that would need to be modified to remove or modify a particular transaction. A confirmed transaction has a confirmation score of one or higher. + +## Unencrypted wallet + +A wallet that has not been encrypted with the encryptwallet RPC. + +## Unique addresses + +Address which are only used once to protect privacy and increase security. + +## Unlocked wallet + +An encrypted wallet that has been unlocked with the walletpassphrase RPC. + +## Unsolicited block push + +When a miner sends a block message without sending an inv message first. + +## Unspent transaction output + +An Unspent Transaction Output (UTXO) that can be spent as an input in a new transaction. + +## User Activated Soft Fork + +A Soft Fork activated by flag day or node enforcement instead of miner signaling. + +## Wallet + +Software that stores private keys and monitors the block chain (sometimes as a client of a server that does the processing) to allow users to spend and receive duffs. + +## Wallet Import Format + +A data interchange format designed to allow exporting and importing a single private key with a flag indicating whether or not it uses a compressed public key. + +## Wallet support + +A Dash Core ./configure option that enables (default) or disables the wallet. + +## Watch-only address + +An address or pubkey script stored in the wallet without the corresponding private key, allowing the wallet to watch for outputs but not spend them. + +## X11 + +Chained hashing algorithm created by Evan Duffield that utilizes a sequence of eleven scientific hashing algorithms for the proof-of-work. diff --git a/docs/img/dash-d.png b/docs/img/dash-d.png new file mode 100644 index 0000000000000000000000000000000000000000..c02c266ccb07092e79d5524e24ee4acce0b588d7 GIT binary patch literal 10675 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 W4c&wGGt`8^DcsZ5&t;ucLK6VCb67?I literal 0 HcmV?d00001 diff --git a/docs/img/dash_logo_white.png b/docs/img/dash_logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..20466d376dfb420509ce4212b2bd1f488c34b94c GIT binary patch literal 39404 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 LP_s + +After generating, you should use optipng to reduce the PNG filesize. +(Reductions here tend to be small, ~10%): + + optipng -o7 + +If your plot has a high sample rate, you can reduce the SVG filesize by +opening it in Inkscape, ungrouping the graphic, selecting plot lines, +and using Path->Simplify. Then select all, regroup, and save. Be sure +to double-check your work---if you simplify text, it becomes unreadable. +(Reductions here tend to be large, I've seen ~80%.) diff --git a/docs/img/dev/animated-en-merkleblock-creation.gif b/docs/img/dev/animated-en-merkleblock-creation.gif new file mode 100644 index 0000000000000000000000000000000000000000..30a25f2ccc50bba573e3a181e874fcfe07b46a93 GIT binary patch literal 16316 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 K)uaJH;Qs)x53xT0 literal 0 HcmV?d00001 diff --git a/docs/img/dev/animated-en-merkleblock-parsing.gif b/docs/img/dev/animated-en-merkleblock-parsing.gif new file mode 100644 index 0000000000000000000000000000000000000000..4510f8b876df2873a096c7aab0ed9b5798f5c3e5 GIT binary patch literal 14866 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-block-height-vs-depth.dot b/docs/img/dev/en-block-height-vs-depth.dot new file mode 100644 index 000000000..679a889be --- /dev/null +++ b/docs/img/dev/en-block-height-vs-depth.dot @@ -0,0 +1,39 @@ +digraph { +size=6.25; +rankdir=BT +node [ shape = "box" ] + +subgraph cluster_height { + h0 [ label = "Block 0" ] + h1 [ label = "Block 1" ] + h100 [ label = "Block 100" ] + h101 [ label = "Block 101" ] + h102 [ label = "Block 102" ] + + h0 -> h1 + h1 -> h100 [ style = dotted ]; + h100 -> h101 -> h102 + + label = "Block Height" + labelloc = b; +} + +subgraph cluster_depth { + edge [ dir = "back" ]; + + d0 [ label = "Depth 101" ] + d1 [ label = "Depth 100" ] + d100 [ label = "Depth 3" ] + d101 [ label = "Depth 2" ] + d102 [ label = "Depth 1" ] + + d0 -> d1 + d1 -> d100 [ style = dotted]; + d100 -> d101 -> d102 + + label = "Block Depth" + labelloc = b; +} + +label = "Block Height Compared\nTo Block Depth" +} diff --git a/docs/img/dev/en-block-height-vs-depth.png b/docs/img/dev/en-block-height-vs-depth.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1542cc14c59422bdd321e172bc68b729f02b1b GIT binary patch literal 4695 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-block-height-vs-depth.svg b/docs/img/dev/en-block-height-vs-depth.svg new file mode 100644 index 000000000..c50da7974 --- /dev/null +++ b/docs/img/dev/en-block-height-vs-depth.svg @@ -0,0 +1,113 @@ + + + + + + +_anonymous_0 + +Block Height Compared +To Block Depth +cluster_height + +Block Height + +cluster_depth + +Block Depth + + +h0 + +Block 0 + + +h1 + +Block 1 + + +h0->h1 + + + + +h100 + +Block 100 + + +h1->h100 + + + + +h101 + +Block 101 + + +h100->h101 + + + + +h102 + +Block 102 + + +h101->h102 + + + + +d0 + +Depth 101 + + +d1 + +Depth 100 + + +d0->d1 + + + + +d100 + +Depth 3 + + +d1->d100 + + + + +d101 + +Depth 2 + + +d100->d101 + + + + +d102 + +Depth 1 + + +d101->d102 + + + + + diff --git a/docs/img/dev/en-blockchain-fork.dot b/docs/img/dev/en-blockchain-fork.dot new file mode 100644 index 000000000..f76838cc8 --- /dev/null +++ b/docs/img/dev/en-blockchain-fork.dot @@ -0,0 +1,55 @@ +digraph blockchain { + +size=6.66; + +//splines = "ortho"; +rankdir=LR; +ranksep=0.1; + +subgraph cluster_extended { + block00 [ label = block0 ]; + block01 [ label = block1 ]; + block02 [ label = block2 ]; + block03 [ label = block3 ]; + block04 [ label = block4 ]; + block05 [ label = block5 ]; + block06 [ label = block6 ]; + + block02x [ label = block2 ]; + block03x [ label = block3 ]; + block04x [ label = block4 ]; + block05x [ label = block5 ]; + + block01 -> block02x; + block02x -> block03x; + block03x -> block04x; + block04x -> block05x; + + + block00 -> block01 [label = "Header Hash"]; + block01 -> block02; + block02 -> block03; + block03 -> block04; + block04 -> block05 + block05 -> block06; + + label = "Rare Extended Forking"; +} + +subgraph cluster_normal { + block2x [ label = block2 ]; + block5x [ label = block5 ]; + + block1 -> block2x; + block4 -> block5x; + + block0 -> block1 [label = "Header Hash"]; + block1 -> block2 [weight = 100]; + block2 -> block3; + block3 -> block4; + block4 -> block5 [weight = 100]; + block5 -> block6; + + label = "Normal Occasional Forking"; +} +} diff --git a/docs/img/dev/en-blockchain-fork.png b/docs/img/dev/en-blockchain-fork.png new file mode 100644 index 0000000000000000000000000000000000000000..8a717e128b1a7cd65aa1ef98afaa3a11d87e0f03 GIT binary patch literal 12080 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 + + + + + +blockchain + +cluster_extended + +Rare Extended Forking + +cluster_normal + +Normal Occasional Forking + + +block00 + +block0 + + +block01 + +block1 + + +block00->block01 + + +Header Hash + + +block02 + +block2 + + +block01->block02 + + + + +block02x + +block2 + + +block01->block02x + + + + +block03 + +block3 + + +block02->block03 + + + + +block04 + +block4 + + +block03->block04 + + + + +block05 + +block5 + + +block04->block05 + + + + +block06 + +block6 + + +block05->block06 + + + + +block03x + +block3 + + +block02x->block03x + + + + +block04x + +block4 + + +block03x->block04x + + + + +block05x + +block5 + + +block04x->block05x + + + + +block2x + +block2 + + +block5x + +block5 + + +block1 + +block1 + + +block1->block2x + + + + +block2 + +block2 + + +block1->block2 + + + + +block4 + +block4 + + +block4->block5x + + + + +block5 + +block5 + + +block4->block5 + + + + +block0 + +block0 + + +block0->block1 + + +Header Hash + + +block3 + +block3 + + +block2->block3 + + + + +block3->block4 + + + + +block6 + +block6 + + +block5->block6 + + + + + diff --git a/docs/img/dev/en-blockchain-overview.dot b/docs/img/dev/en-blockchain-overview.dot new file mode 100644 index 000000000..34314012d --- /dev/null +++ b/docs/img/dev/en-blockchain-overview.dot @@ -0,0 +1,60 @@ +digraph blockchain { + +//splines = "ortho"; +rankdir=LR; +size=6.66; +node [ shape = "box", penwidth = 1.75 ]; +edge [ penwidth = 1.75 ]; +penwidth = 1.75; +nodesep = 0.3; + + _transactions0 [ label = "Block 1\nTransactions", width = 2 ]; + subgraph cluster_block0header { + _blockHeader0 [ style = "invis", label = "", width = 0, height = 0 ]; + hashBlock9 [label = "Hash Of Previous\nBlock Header", shape = box]; + hashMerkleRoot0 [label = "Merkle Root"]; + + label = "Block 1\nHeader" + } + + + + _transactions1 [ label = "Block 2\nTransactions", width = 2 ]; + + subgraph cluster_block1header { + _blockHeader1 [ style = "invis", label = "", width = 0, height = 0 ]; + hashBlock0 [label = "Hash Of Previous\nBlock Header", shape = box]; + hashMerkleRoot1 [label = "Merkle Root"]; + label = "Block 2\nHeader" + } + + + _transactions2 [ label = "Block 3\nTransactions", width = 2 ]; + _block2 [ style = "invis", label = "", width = 0, height = 0 ]; + subgraph cluster_block2header { + _blockHeader2 [ style = "invis", label = "", width = 0, height = 0 ]; + hashBlock1 [label = "Hash Of Previous\nBlock Header", shape = box]; + hashMerkleRoot2 [label = "Merkle Root"]; + label = "Block 3\nHeader" + } +invis0 [ style = "invis", label = "", width = 0, height = 0 ]; +invis1 [ style = "invis", label = "", width = 0, height = 0 ]; + +invis0 -> hashBlock9 [ style = dotted ]; + +_blockHeader0 -> hashBlock0 [ minlen = 2 ]; +//hashBlock0 -> hashBlock1 [ style = "invis" ]; +_blockHeader1 -> hashBlock1 [ minlen = 2 ]; + +hashMerkleRoot0 -> hashMerkleRoot1 -> hashMerkleRoot2 [ style = invis, weight = 100, minlen = 2 ]; + +_transactions0 -> hashMerkleRoot0 [constraint = false, minlen = 1]; +_transactions1 -> hashMerkleRoot1 [constraint = false, minlen = 1]; +_transactions2 -> hashMerkleRoot2 [constraint = false, minlen = 1]; + +_transactions0 -> _transactions1 -> _transactions2 [ style = "invis", minlen = 2 ]; +invis1 -> _transactions0 [ style = "invis", minlen = 1 ]; + + +label = "\nSimplified Dash Block Chain"; +} diff --git a/docs/img/dev/en-blockchain-overview.png b/docs/img/dev/en-blockchain-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5a842cbae5ac8ef5dfdc9ba5ac0b1c2919472897 GIT binary patch literal 17511 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 Z;Z3VHRgvlzH7Jn;%_BN$xkU3D{|nEI=*|ED literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-blockchain-overview.svg b/docs/img/dev/en-blockchain-overview.svg new file mode 100644 index 000000000..59e7c12cb --- /dev/null +++ b/docs/img/dev/en-blockchain-overview.svg @@ -0,0 +1,121 @@ + + + + + + +blockchain + +Simplified Dash Block Chain +cluster_block0header + +Block 1 +Header + +cluster_block1header + +Block 2 +Header + +cluster_block2header + +Block 3 +Header + + +_transactions0 + +Block 1 +Transactions + + +hashMerkleRoot0 + +Merkle Root + + +_transactions0->hashMerkleRoot0 + + + + +_transactions1 + +Block 2 +Transactions + + + + +hashBlock0 + +Hash Of Previous +Block Header + + +_blockHeader0->hashBlock0 + + + + +hashBlock9 + +Hash Of Previous +Block Header + + +hashMerkleRoot1 + +Merkle Root + + + +_transactions1->hashMerkleRoot1 + + + + +_transactions2 + +Block 3 +Transactions + + + + +hashBlock1 + +Hash Of Previous +Block Header + + +_blockHeader1->hashBlock1 + + + + +hashMerkleRoot2 + +Merkle Root + + + +_transactions2->hashMerkleRoot2 + + + + + + + +invis0->hashBlock9 + + + + + + + diff --git a/docs/img/dev/en-blocks-first-flowchart.dot b/docs/img/dev/en-blocks-first-flowchart.dot new file mode 100644 index 000000000..02e1fabd0 --- /dev/null +++ b/docs/img/dev/en-blocks-first-flowchart.dot @@ -0,0 +1,32 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=TB +splines = "true"; +ranksep = 0.2; +nodesep = 0.9; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "none", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +fsbc [ label = "Fully-Synced Block Chain?", style = "filled" ]; +listen [ label = "Listen For New Blocks (Inv)" ]; +request_blocks [ label = "Request Blocks (GetData)" ]; +request_invs [ label = "Request Inventories (GetBlocks)" ]; +have_invs [ label = "Have Inventories?", style = "filled" ]; + +fsbc -> have_invs [ label = " No" ]; +fsbc -> listen [ label = "Yes", constraint = false ]; +have_invs -> request_invs [ label = " No" ]; + +have_invs -> request_blocks [ label = "Yes", constraint=false ]; + +listen -> request_blocks [ style = "invis" ]; + + + +label = "\ \nOverview Of Blocks-First Initial Blocks Download (IBD)" +} diff --git a/docs/img/dev/en-blocks-first-flowchart.png b/docs/img/dev/en-blocks-first-flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd85cbeb7525420bf71c4ab09ed391200e4dbb4 GIT binary patch literal 7040 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 + + + + + +%3 + + +Overview Of Blocks-First Initial Blocks Download (IBD) + +fsbc + +Fully-Synced Block Chain? + + +listen +Listen For New Blocks (Inv) + + +fsbc->listen + + +Yes + + +have_invs + +Have Inventories? + + +fsbc->have_invs + + +  No + + +request_blocks +Request Blocks (GetData) + + + +request_invs +Request Inventories (GetBlocks) + + +have_invs->request_blocks + + +Yes + + +have_invs->request_invs + + +  No + + + diff --git a/docs/img/dev/en-bloom-update.dot b/docs/img/dev/en-bloom-update.dot new file mode 100644 index 000000000..57d00d241 --- /dev/null +++ b/docs/img/dev/en-bloom-update.dot @@ -0,0 +1,72 @@ +digraph { + +size="6.25"; +rankdir=TB; +nodesep=1.05; +ranksep=0.2; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +subgraph cluster_client { + graph [ penwidth = 0 ]; + subgraph cluster_client1 { + graph [ penwidth = 0 ]; + + address [ label = "Address To Match" ]; + filter1 [ label = "Filter That\n\ \ Matches Address\ \ ", style = "diagonals" ]; + mymatch1 [ label = "Transaction 1", style = "invis" ]; + mymatch2 [ label = "Transaction 2", style = "invis" ]; + + address -> filter1; + filter1 -> mymatch1 [ style = "invis" ]; + mymatch1 -> mymatch2 [ style = "invis" ]; + + } + + label = "Client" +} + +filter1 -> filter2 [ constraint = false ]; + +subgraph cluster_node { + graph [ penwidth = 0 ]; + subgraph cluster_node2 { + graph [ penwidth = 0 ]; + + tx2 [ label = "Transaction 2" ]; + filter3 [ label = "Filter Updated\n\ \ \ \ With Outpoint \ ", style = "diagonals" ]; + match2 [ label = "Transaction 2\nSpends Outpoint", shape = "none" ]; + + tx2 -> filter3; + filter3 -> match2 [ minlen = 2 ]; + } + + + subgraph cluster_node1 { + graph [ penwidth = 0 ]; + + tx1 [ label = "Transaction 1" ]; + filter2 [ label = "Filter That\n\ \ Matches Address\ \ ", style = "diagonals" ]; + match1 [ label = "Transaction 1\nPays Address", shape = "none" ] + + tx1 -> filter2; + filter2 -> match1; + } + + match1 -> mymatch1 [ constraint = false ]; + + filter2 -> filter3 [constraint = false ]; + match1 -> filter3 [ constraint = false ]; + + + match2 -> mymatch2 [ constraint = false ]; + + label = "Full Node" +} + +label = "Automatically Updating Bloom Filters To Track Relevant Transactions" + +} diff --git a/docs/img/dev/en-bloom-update.png b/docs/img/dev/en-bloom-update.png new file mode 100644 index 0000000000000000000000000000000000000000..320410b71a7b78f3d4c6ba8ad6afc36cb1c6791c GIT binary patch literal 7339 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 F{sVG8`3V33 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-bloom-update.svg b/docs/img/dev/en-bloom-update.svg new file mode 100644 index 000000000..b5e88ec93 --- /dev/null +++ b/docs/img/dev/en-bloom-update.svg @@ -0,0 +1,140 @@ + + + + + + +_anonymous_0 + +Automatically Updating Bloom Filters To Track Relevant Transactions +cluster_client + +Client + +cluster_client1 + + +cluster_node + +Full Node + +cluster_node2 + + +cluster_node1 + + + +address + +Address To Match + + +filter1 + + + + + +Filter That +  Matches Address   + + +address->filter1 + + + + + + +filter2 + + + + + +Filter That +  Matches Address   + + +filter1->filter2 + + + + + + +filter3 + + + + + +Filter Updated +    With Outpoint   + + +filter2->filter3 + + + + +match1 +Transaction 1 +Pays Address + + +filter2->match1 + + + + +tx2 + +Transaction 2 + + +tx2->filter3 + + + + +match2 +Transaction 2 +Spends Outpoint + + +filter3->match2 + + + + +match2->mymatch2 + + + + +tx1 + +Transaction 1 + + +tx1->filter2 + + + + +match1->mymatch1 + + + + +match1->filter3 + + + + + diff --git a/docs/img/dev/en-btcc-payment-request.png b/docs/img/dev/en-btcc-payment-request.png new file mode 100644 index 0000000000000000000000000000000000000000..57322ab935afb31fa2c77837af1c73b804d24eb3 GIT binary patch literal 29521 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
2GC&0h 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-cert-order.dot b/docs/img/dev/en-cert-order.dot new file mode 100644 index 000000000..94c18fbbf --- /dev/null +++ b/docs/img/dev/en-cert-order.dot @@ -0,0 +1,29 @@ +digraph paymentchannel { +size=6.66; +//rankdir=LR; +//splines = true; +//nodesep = 0.4; + +//edge [ minlen = 2 ]; +node [ shape = box ]; + + +subgraph cluster_signing { + btcorg [ label = "www.bitcoin.org" ] + rapidssl [ label = "RapidSSL CA" ] + geotrust [ label = "GeoTrust Global CA" ] + + geotrust -> rapidssl -> btcorg + label = " Certificates In Signing Order \n " +} + +subgraph cluster_loading { + one [ label = " x509.certificate.append(bitcoin_org-cert) " ] + two [ label = " x509.certificate.append(rapidssl_ca-cert) " ] + one -> two + label = "Certificates In Loading Order\n(Root CA Certificate Is Not Loaded)" +} + +label = "(Certificates are loaded into X509Certificates() in reverse signing order)\n \nExample Certificate Loading Order For Payment Requests From Bitcoin.org" + +} diff --git a/docs/img/dev/en-cert-order.png b/docs/img/dev/en-cert-order.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb0e806c1ca4ffc3e5c8afd7ff5d691b83ff149 GIT binary patch literal 9204 zcmb7KbwJZ!*T387l5UU?3n@uykWgAsx)f<}Zckjq)0sw^r05QVDd;rQf{oi5U zppTRl&p1}g-7+XQf>OS^**~5k_Dqlr#?_hs@wS0a5gw4B;zXd z4w-bwe_iGT!z$6Kl36s}uNr=mQb}xFz(d|P)84=KtI2MuSvk8fEiIGp0yd80gW2kz zQaq67Zx0)Dtf?TE;8{Rx32x!UgD@A7ijFj%@5beJl_PUr577`fWIWt`*^P;0MKakCdeFSObn` zqe*3H>)uDGcT5u@J1=G~&Cc2kM{-4Yd);}|-r14!XtFXRRhh$e^uCplL}Ic=>D{Yk z0W;0laX}Z~iMMruIcrf_UtUTAvlF1oUb$^Rva=W8WNow`?|m#3rb2sUFt%C2M2ZoT z5Ru0}GGaj2Amv-+NW)T)Z{6?kC0ac<@WF8e7wk>NFnT;OH(#{Gyj^tmtAFMvPQ_7_ z`VGA&#Kk;b9Wb7s6%X{|OqL5fDU`TU1tS*${7ZIN!lqN1Q z>epe5)n$q0cN)LTc4!TbClqAAPI;(|D~E9Ehw`4jEfZX$0$Zw}8M4fuve?mHc$Lfh zr8d*}%?-lVoOy4MjoazZC3aE&{ZYh~umJ;3$bG!b=)U+iXCVE-+RC7|)KMQBesfMp zVgO92xsYsNr>qK2S{oh2i+fkRhm7&buiO=7frh`HpemBF$7c-)hRNBo09*n32MoT3 zZyw(tHYn)PKl-T?&nY%_fgzuhnm!085r+ID)`V|cc1gy|IBo3g6|x4X5DR>?76{ZW zIqJvMU9J;u!$k<+`9pvjzPq@f;@i-g@L{txNVD$U|D^QhUsj8@Xzj(rS{{OUZNig z@|fxeeV@?rK2u$&lCmJo4S#ZLdEWy4jsgn1+7cz0SXi|)x}<#P%Znu#_6x}S#Xuj8 zl8UO#>c>^nbKGls6V{&14KStbTR}pM^MAxT;kZ;WVv=BxTIm~eKu&JlD!&!;#>fS? z)iP!iwrY_@6kDY}GHXnFg|VRdV7~b$7s8To;9ZL(Po8MWV$aI2&q@&(c{jX%%nx36 zC?m1!P`>KP#>aw@dT8WTdpku%4wHSkq_Bue#7`d90qgKo)gX6|?v>I4PgT6Nrfx0v z1;tb9kdsUp8?y2{gw~*r|C8ln;>X@o>M5<(eQXfJZ0)htQkEJ+fxr_j-~p(q*l%m2 zZUM$>fc<-Ay)$8WX(i+9e~vVoSVcOJN>?G4fIIX@gG)V}oP_(m*_I!6xpy=VW43Fq zhsZ++NPoH`ogrPGA3zH=qWobH1Y#)eJQ=u02skNr0dJxzc-- zh}%s(WQbU(uHd*c^3{4zPeQo{dMRG`vS$pI_{Ow;;}*{L&@;!3+d z7w;CV5J{V-p0b${n|!Rf#Hftg2n_%FGbVfMI}UsVY+@fD#QPXS%!o{PSXU5y`yHR$ ztH@@#*CsHxk(CUC@6uT&a?I&BIwaq><3ktwDa_d!zKQyEwvP*?fqy1d=cqESWQoF= zP+j}`;Qh;EhG<&cXgkN~05kjsZ%w1uM>{BTGDIbU^JJQEZ;>ny%?b(Ka6{Z3cwsUH zydKm}6^)F-ifC485~MuVd0hYA*DrY&ih(`jPe}OH2*-{zkXTAj3_)EVA!kZ1L8kuu4{@?Uj}Fn zkMB{1r7u$yS6mPjf&LlIx}{#%%rq%YQ=7fA=u#1@cUylZVg~ zUNd_+R|1&!a$UxmUcr}cMPRA@B6k8CaZHIZ@uFxm@Sq~Y@`mV4*@(2TR&M|s1lU^M z#&W$}twEV)X#Io@ibON*H`3T;n=sR8;xLzKtmJe89LyQmAU{k?$HB^G;>{qOtIAw* zHax-G$eKoAUuDdcl-GI13WNm1tXvnB%qZ}|Y~`FdNLeuP!b_RBrvoASaLf@83hFO_ zO)paUGN7@mK{JW1CPASMaxc5B_5~Zd g5qdAqi#Z3{{W_U&0vDc15>-ZXaBZ2Pz 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-cert-order.svg b/docs/img/dev/en-cert-order.svg new file mode 100644 index 000000000..8f9b19c50 --- /dev/null +++ b/docs/img/dev/en-cert-order.svg @@ -0,0 +1,66 @@ + + + + + + +paymentchannel + +(Certificates are loaded into X509Certificates() in reverse signing order) + +Example Certificate Loading Order For Payment Requests From Bitcoin.org +cluster_signing + + Certificates In Signing Order + + +cluster_loading + +Certificates In Loading Order +(Root CA Certificate Is Not Loaded) + + +btcorg + +www.bitcoin.org + + +rapidssl + +RapidSSL CA + + +rapidssl->btcorg + + + + +geotrust + +GeoTrust Global CA + + +geotrust->rapidssl + + + + +one + +    x509.certificate.append(bitcoin_org-cert) + + +two + +    x509.certificate.append(rapidssl_ca-cert) + + +one->two + + + + + diff --git a/docs/img/dev/en-coinjoin.dot b/docs/img/dev/en-coinjoin.dot new file mode 100644 index 000000000..4d401ff32 --- /dev/null +++ b/docs/img/dev/en-coinjoin.dot @@ -0,0 +1,99 @@ +digraph paymentchannel { +size=6.66; +rankdir=LR; +//splines = false; +nodesep = 0.1; + +edge [ minlen = 1.33 ]; +node [ shape = box ]; + + + + +subgraph cluster_nemo { + label = "Nemo's UTXOs" + + nemo_out1 [ label = "10 mBTC" ]; + nemo_out2 [ label = "90 mBTC" ]; +} + + +subgraph cluster_neminem { + label = "Neminem's UTXOs" + + neminem_out1 [ label = "100 mBTC" ]; + +} + +subgraph cluster_alice { + label = "AnonGirl's UTXOs" + + alice_out1 [ label = "55 mBTC" ]; + alice_out2 [ label = "25 mBTC" ]; + alice_out3 [ label = "20 mBTC" ]; + +} + +subgraph prevouts { + node [ style = invis, label="", width=0, height=0 ] + + prevout3; + prevout4; + prevout5; + prevout0; + prevout1; + prevout2; + +} + +subgraph cluster_coinjoin { + label = "CoinJoin Transaction" + + subgraph cluster_inputs { + label = "Inputs" + node [ label = "" ] + nemo_in1; + nemo_in2; + neminem_in1; + alice_in1; + alice_in2; + alice_in3; + } + + subgraph cluster_outputs { + label = "Outputs" + node [ label = "100 mBTC" ]; + out1; + out2; + out3; + } +} + +utxo1 [ label = "Person 1" ]; +utxo2 [ label = "Person 2" ]; +utxo3 [ label = "Person 3" ]; + +// prevouts + +prevout0 -> alice_out1 [ style = dashed, label = "From Bob" ]; +prevout1 -> alice_out2 [ style = dashed, label = "From Charlie" ]; +prevout2 -> alice_out3 [ style = dashed ]; +prevout3 -> nemo_out1 [ style = dashed ]; +prevout4 -> nemo_out2 [ style = dashed ]; +prevout5 -> neminem_out1 [ style = dashed ]; + +alice_out1 -> alice_in1; +alice_out2 -> alice_in2; +alice_out3 -> alice_in3; +nemo_out1 -> nemo_in1; +nemo_out2 -> nemo_in2; +neminem_out1 -> neminem_in1; + + +out1 -> utxo1; +out2 -> utxo2; +out3 -> utxo3; + + +label = "Example CoinJoin Transaction\nOnly the participants know who gets which output." +} diff --git a/docs/img/dev/en-coinjoin.png b/docs/img/dev/en-coinjoin.png new file mode 100644 index 0000000000000000000000000000000000000000..48ad3bb097ecc7ed9acec91106bd36c9e5a5ca37 GIT binary patch literal 12451 zcma*O2UHZ>5;m$JNdyOw0m(VTFp_f+88RXQL)J!7auh_8AYn!_2n<<3K#9(fv*M6J z1O$nqWF!elPOs5(&VSE+_kZiH)vWH>y;Ik&+V$193-nDr1jR*$i|5XrqtMh)yLIjy z0Ra9zB?Sx4F<`aJ!5aafjZiyx8XnWreD0j6g{GRy?Z;!QlVpBZwkMT-ve%DJcoU#7 z%E8pPSjpIlxJldc=ZslJLYo%{p;R&UhhHvUHr{t|iZZ@pz= zUPSpRJpmp<3c3D2?st^|qw!13?dS5wY0^e^B?%ENMNbEg(ZXVzdZ|PJ8}Yxduyb$- zA-qLr$-S3ezbewr^Qv!bs$zJpO8Aqkd0B@r#0?5-3P449g);-Ksl__cucyKINW%N4 zS5b+OZ)rWgY5%SH4Kb9=@Z!olS>fRxVPH1sM#z=ug#$?noIA6_ysZ@ac$b2+-awRB zS;rzb$8JYrJl#ptH+i`6Pvml!^H0egYh~D#CcZl=3KbnbD>h%2;$ZP8_|=z$w9a@Aw=g+{C8; zbu`VBHLH)_Nt41Q&8eN4E>aVn+e!CEYodi6asgEcxdt#BmEu^<;axps3~wR_z(HIX z6|tsMA8F_7dGG65nos_Cp)jy|LgU@6tlrq}|M4S#xkU1Ud`>zzS^{$1wX|MPNr0m{ z=d3Nqz2(K9vz}(64(zvvI^ZNaE}`En5_JL!HumNj_T+@1>(5xtnUS z=H7SBa^=wm9Z5!$CS*CR*+2{37`x^6VXklezC6!-tM~h-NC-rb(Jy7aX?7^U_Sexx zm119-v>Fwr1|d#y8zO^~3-3K|@g9m`DnI0?j;t;5<{Tb3-H=T^<|Xl^U{4DV%WJYx zYP^OclI~@~*GXY#Wf3l#Q(gI8O?h2eY#6;Cvv}t>vw?5*%)?FyQ9G zVoDIUn))xM3DRvTfyp$?erm4wg)j34@dZa@!Ar07^c-WPU$R@urvBn3DGi&z>iG!s zh`h6#XB+N~0T!4W$tL;?D9HXEW6zMS_UFA*(ItH-ek0*oZkU?IO==ptZ{i-1<*#@i zM^}|dPu0lRG&J+lyWvp4=3Z`p788>M7nTONfG3C;*>QY=*uUmmI)?X>ntwy>VNjqh zG*9g<)5nJ>il%Ysuv}g;t<#k^(4spBoF5XYy0e(1Eqqwxg^mB5F`V%xuMltX`3)6g z?YEZJX{&2Mi#}yE18%FWWMVGhfU@1xpz0iioDaA+Uc=>4)=BF)HE^kXMD*@dyA!)# zmVJf*c7|rAg_y1rMW!SpZBIHH>$FrI@3`pV-lJa!wiE&^)tus+tIy*J(vaO-G%ADKsi?F1~GuPD;qc}O>7bsi4!7#k{(u$Va|05>G8v)0Nx8@Cn#Ru)!fh3~#T zSzS9=Dw)N;l1-_{{8PkdO&5F39>&u#NOeO zoEO2TqZRJN@>ilvK{M^M%3TuM)Jr63^=cmr(mz z^o&&O&!Aa`oY0o$j_h78urC}Fho{J!$^lJo7eX;fI8Q8UGU;9DPu}k4@8o2^B9I7j zTEFk|!VSvpjGc7qgDnJRH>MD`)ycX2zF!nRN{W_>hF!`IRW*B*&buQce5Jooqn(+J z23o!PBpLwwp6D=XPUBO0o*IpQw3YY^h~gykklr#y7N0c&>L1V>3o&)2I`^uu*QKU<~ahpEN$RH{HsUt)j|7Nm_5mn z3QJH!@9Vilx_1eZ0I5_Fh;wGRllq_oseF01MlTdL~BnNZ@zIn;xr=>v0^xVhTo-%(J1o$docc(2|vL#KO}Yj zZ)Kj>24du^D?9t}q$nbBtW1n;s(TiHBPqa^KZPDJQ-s09{f9SM&#a~%TAl}=k!Qjg;5BtrGkdS`gvFSoe2sr^j`{h?u zyG2EWWsyKS{kX%Je%8u4>^a`HMdl3gMqJN9*ls!!IYbErX|J@%G=3Of8tXkU9GbQx z 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 IdMEh*0a8~s + + + + + +paymentchannel + +Example CoinJoin Transaction +Only the participants know who gets which output. +cluster_nemo + +Nemo's UTXOs + +cluster_neminem + +Neminem's UTXOs + +cluster_alice + +AnonGirl's UTXOs + +cluster_coinjoin + +CoinJoin Transaction + +cluster_inputs + +Inputs + +cluster_outputs + +Outputs + + +nemo_out1 + +10 mBTC + + +nemo_in1 + + + +nemo_out1->nemo_in1 + + + + +nemo_out2 + +90 mBTC + + +nemo_in2 + + + +nemo_out2->nemo_in2 + + + + +neminem_out1 + +100 mBTC + + +neminem_in1 + + + +neminem_out1->neminem_in1 + + + + +alice_out1 + +55 mBTC + + +alice_in1 + + + +alice_out1->alice_in1 + + + + +alice_out2 + +25 mBTC + + +alice_in2 + + + +alice_out2->alice_in2 + + + + +alice_out3 + +20 mBTC + + +alice_in3 + + + +alice_out3->alice_in3 + + + + + +prevout3->nemo_out1 + + + + + +prevout4->nemo_out2 + + + + + +prevout5->neminem_out1 + + + + + +prevout0->alice_out1 + + +From Bob + + + +prevout1->alice_out2 + + +From Charlie + + + +prevout2->alice_out3 + + + + +out1 + +100 mBTC + + +utxo1 + +Person 1 + + +out1->utxo1 + + + + +out2 + +100 mBTC + + +utxo2 + +Person 2 + + +out2->utxo2 + + + + +out3 + +100 mBTC + + +utxo3 + +Person 3 + + +out3->utxo3 + + + + + diff --git a/docs/img/dev/en-creating-p2pkh-output.dot b/docs/img/dev/en-creating-p2pkh-output.dot new file mode 100644 index 000000000..ff5e34af2 --- /dev/null +++ b/docs/img/dev/en-creating-p2pkh-output.dot @@ -0,0 +1,42 @@ +digraph blockchain { + +size=6.25; + +//splines = "false"; +rankdir=LR; +//ranksep=0.1; +//splines=ortho; + +node [ fontname="Sans", shape = box, penwidth = 1.75 ]; +edge [ fontname="Sans", penwidth = 1.75 ]; +graph [ fontname="Sans" ]; +penwidth = 1.75; + +subgraph cluster_bob { + private_key [ label = "Private\nKey" ]; + full_public_key [ label = "Full\nPublic Key" ]; + pubkey_hash [ label = "Public Key\nHash" ]; + + label = "Bob's Computer" +} + +subgraph cluster_alice { + spender_pubkey_hash [ label = "Copy Of\nPublic Key\nHash" ]; + + label = "Alice's Computer" +} + +subgraph cluster_tx1 { + tx1_pubkey_hash [ label = "Copy Of\nPublic Key\nHash" ]; + + label = "TX 1" +} + + +private_key -> full_public_key -> pubkey_hash -> spender_pubkey_hash -> tx1_pubkey_hash; + + + + +label = "Creating A P2PKH Public Key Hash To Receive Payment" +} diff --git a/docs/img/dev/en-creating-p2pkh-output.png b/docs/img/dev/en-creating-p2pkh-output.png new file mode 100644 index 0000000000000000000000000000000000000000..7af90db2be1d5c981fbda0fcb17443cb874e0d71 GIT binary patch literal 4167 zcmY*dc|25Y`#;PuH1?S6$`+Yy8Ec4{vBrZe$5I_jWr>uOC41S1v@o(%vP2m<_9B`g zF_uChQ&O^Ij}W8fH=d{8`#$ge$GOjSKG$`Buj_N2?|pyINwKpv=iMQ`0{{SCOACSn z0I-9s`wTAD1wcGtwy-94FKcrG@H;7^=NSM90G0$3$1uji?a1@OYa$(IOu6C&EMk4) z%gT;={y@7&57j3 zlKEwgkXTMqJ5(i##gJ%T8sN6&1%o`>7TxjP(1d?!d(kL2%;ZRzY_PRE=X84cOFa@C z?SeM>o$0yq4;!SwXWvG?U^!I;q0u{szai$S`ja*NI37$wJEZZ?Lhua$6Y2o_FM79^ zA62ClzT_Hm_G&K=y-s!OKS8`K*!{R}{k~C-xAv2RH|2L>>(qegU{vexeKKK)09S;H zbVWLs^HyJ%=YlGYu?q~>U0tu8h%Kpm8_}=-kxp{=Zb~&ss7stSJ3G^!3E zZmlOKoO5Ac$l#%Gd7=-6{T!gs0VKRL9Y`WaS)kP@X+qp+L~H~ zQws5+ZS}^+R4CL3W+AdkcJe3Mi{48EiKx2fS3xtCFRRFIW>`ZIcc?dbce#kK?C#z^ z0eark&m(ie7v_zR@MC4I(1$A<8a-!Yi`y@1(jGQS19t0&MJWoO=W?gnGqM*AYo;Rs z_2#J_a@_1gIEEPIJFEqut>)(TVzuHz1MzKjq&O9sAU*Y**dNWYL)Qqfky;t&!=$L3 z2#9SV-B?0`7wbw|@`=Zp>AlS(wLwuoNv%(J6g02I2NfM-i{&M{X1CmnKC|@Zeb2ZJ z5MP6c8!_1lcB5AodD#XPToYV&!uzrdaPoo_zl&_tA7V_v#3

{U8U@gDC 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-creating-p2pkh-output.svg b/docs/img/dev/en-creating-p2pkh-output.svg new file mode 100644 index 000000000..1cf1fe046 --- /dev/null +++ b/docs/img/dev/en-creating-p2pkh-output.svg @@ -0,0 +1,78 @@ + + + + + + +blockchain + +Creating A P2PKH Public Key Hash To Receive Payment +cluster_bob + +Bob's Computer + +cluster_alice + +Alice's Computer + +cluster_tx1 + +TX 1 + + +private_key + +Private +Key + + +full_public_key + +Full +Public Key + + +private_key->full_public_key + + + + +pubkey_hash + +Public Key +Hash + + +full_public_key->pubkey_hash + + + + +spender_pubkey_hash + +Copy Of +Public Key +Hash + + +pubkey_hash->spender_pubkey_hash + + + + +tx1_pubkey_hash + +Copy Of +Public Key +Hash + + +spender_pubkey_hash->tx1_pubkey_hash + + + + + diff --git a/docs/img/dev/en-creating-p2sh-output.dot b/docs/img/dev/en-creating-p2sh-output.dot new file mode 100644 index 000000000..bcc723238 --- /dev/null +++ b/docs/img/dev/en-creating-p2sh-output.dot @@ -0,0 +1,42 @@ +digraph blockchain { + +size=6.25; + +//splines = "false"; +rankdir=LR; +ranksep=0.2; +//splines=ortho; + +node [ shape = box, penwidth = 1.75 ]; +edge [ penwidth = 1.75 ]; +penwidth = 1.75; + +subgraph cluster_bob { + private_key [ label = "Private\nKey" ]; + full_public_key [ label = "Full\nPublic Key" ]; + redeemScript [ label = "Redeem Script" ]; + script_hash [ label = "Script\nHash" ]; + + label = "Bob's Computer" +} + +subgraph cluster_alice { + spender_script_hash [ label = "Copy Of\nScript\nHash" ]; + + label = "Alice's Computer" +} + +subgraph cluster_tx1 { + tx1_script_hash [ label = "Copy Of\nScript\nHash" ]; + + label = "TX 1" +} + + +private_key -> full_public_key -> redeemScript -> script_hash -> spender_script_hash -> tx1_script_hash; + + + + +label = "Creating A P2SH Redeem Script Hash To Receive Payment" +} diff --git a/docs/img/dev/en-creating-p2sh-output.png b/docs/img/dev/en-creating-p2sh-output.png new file mode 100644 index 0000000000000000000000000000000000000000..47a1b825cd649c5591e2d5f5b5b65b841ad01440 GIT binary patch literal 4502 zcmZu#XH-*bunizeF9MOShzOW~B25fMsR9ZD0!JVaKx$~xd*>oGN|h26=@1~161oXe zloC2hmkv^;3DO?wz3<0c@6S1BzBRLF)?R1UH+!NUYpK!GaMFN4AbRx&%DNyBIdJwJ zLv{85y}naZc=jT<&{R_fokpU%K7c^X+Um;ppLmb1q5a%hhj`kZy~E)T$hi`rxL0bn z(V>GKe7u;w&07~K3a?bpPxtlPhTpJYL!yFF;L5AHoW3u?lCJSIyqm4}Au6TiIWEdj z6o{PKBJ}Nbu`5_Er5bb^>?aA0PMh#qJN$WUSpiGy`nldE=(TaYHa^8@&Ll*m=t6T3 z1g0X8lL1$lf+@+dzpZnK5D@gtiq11dvnZ6lG}<&}jc;HeMB`7wX9`Mk!Gp@vpWHy0 z{jjQ2<;)~CqVJb^3TZMR3S^+yfY}xXjN$T|)F4^{ITi#3(aupplZp}OeNI-2st7XL zyla3PlhFC}JTj!+m%M-EQhaBdR@}tZ%DmXKW9d@Hbz_}R(EACp32S?VIyZTtjyhvn zgT=S$Gg^8Gp3R%Ei{p1CzawxTL0II0+P+G$*!om0z& znsYmK;`QK3<~&f7)DK>UC-QU%0e*lbtF?-S6$?hm4EkO&4YX2PiSyDlrjb5}dZOX? zYh_;H>678FclOAp@hpsJql5s*<063^u^UMH8-6cB1k9d#X0F7KF5zyK@kq`2{6XA3 zAmjezjJS2=j<4AbJ!Zdr`O2D0V7K8`*#!Ak;>_JxFGld*snLFoVte?7o2t##a$!ou zckTDhEQ}F6JYo{BLlM~$AY_xo&{g_?uicCsK>gXc-PFdYJ?y8OIUiY_*=;ln4xI2clNN$f~+ z*$^4&E$WlH+Tf+}rb~C)?8dDx8*jL%$X0OVQ{3jVm3~P!1P$}CE%|=TWBGVFZ2sg` z`AKOs%2_}dV8{E^E=y!6LfoA65}l-aUy{N}nXnM+2pq3e3*S~2mE17yP}Oa~PAbA+ zVLbo(#HtwwM^`NwrjlGU$(d35PI5u-QRdiSt}%TIDU*w!QNc?aRFB}6MyCXA{lSz3 z?z*iHQqWQW)2GW?zC&^b6Nug45gDY~&$-4nBzi<17tkG}`h397ho-xy_R*ud<;;wS zbsh`jAcML%oNKvU%cFvM;YxdwqjmqI#qnqTrQ(a{vHjE-fWe&Xte^h26-1KQ3<3vJ zBF;MZ>`cQGoBs38Ff%Pe#%qk_95#Ur(~d3|E5U+NXf;Q_gD`U-vbHu%yj|7n=%r#{&?-8uuGPy2Sg*d$u&}v^Dd%aEFg1v;8QSH(7r;Ue zeN$R34V>>BRK$lJbfS1lND80KH2n~1IK6RJ*Z?BVufOTW5aLllzdro+6$E|NTlj7Bkzzo=CS+9ULrl_ak2Ox!sO@Ah&bnHhxX&#tqH zEE0X4^`W~>BkHLk;89SF2v;^_Vy@NE8U8iu`TW!znjs1m`AcR4SGn^28jM1kOU@u6 zc=z!2^_h}b3cw+o3ofmg`Z2jFn347Ka&Mgm486R-4PC3dYf-R~(t&8)zK_}QG$H8v zLVfbM;0!-UUsen(7m2uhXs3A^aOR?nP$8{zk{jHz&MCfULa?Bn*yq(WVeoR=Z=@KT zH+v+Qla)pyo)ypU`OB#+Bmx9=L-2k1?YE>MUCr&p@QVZ#titT+_1H#?eC_I9jB4# zuspb-;Mj7V3>ocgzFE(UtAP5HW%88o+vBlRRW*9($65Hc#lH6o*ekDRq;3XapX-ON z#&Qso(`S~P?;@0?W)Hi&)3)HY7N+%xA3op&I;eBTQF!j%>vjoDnjczzesT&OI_Q~3 z<0v5SGAOVuI||JuBNn%2`|3A)rsM`Z+eNaYd(Nq5Js=kW4Jc$zOR3+l<^^9Q7 zec^Z>fO%py*u#BP0$Om&Y`V5G6#_e-a9E_x8gYH03f87!fz^W6ebtlw5SRZar-98a zPiE+V8U3{xNAY5!AF<0BmwBQ#USYvw3Zbi$=UG%LMA}+RO043}p~u{|mD9h!&Q(_g z&_s4Z|Dn(mvtQk*(>kzQybbyD4l&oo%Hdd`gU^eoh&v-_qr$G(GQ5^oGgjIP1S}Am zKN=)aqmE7KhqZ^UEmYBhHD!{R5PT3sT;TFPiXN}u`=p%)a0R`{d|MbCVL=0qmI6xZ z9l*R(?EQ^FasQ!@A)VW>QxpId2t*i*QutwM|0ZfqJ;_!2B&^*WciYENPASLzMBnx|4uqK^31-!R5$ zS(;gPF`R(0xZFp>>ZK5?Z1e&#eTXe?#NU7sYOgkK%ak~}T+_;caR~SI394O)TnZL= zc;C&{#@R4z=>4Xyz`H%fQ@vTB#k9g<++@@#Mn{MmYJOvNS;l`TN+={5!aWIF-I%f? zyzkYbMNkJn`Nkd-x$pU zG4KspjPl_5m?;wfUb@xnLcgbRtRiJEr9O+VCdqUo7gJIy9l)1vDzF5WP(IS}5KDiW zH#}!@uxVAH_&X!baGrkK7HbsB@{^-=qw5A8Wy~nEG`Qu7)m_vD;HqwJUl!fuXEtmd z|FtQXtm)6J9IvKYYL#ZvnK^Y5*98?HG1#K_&vTdz-E;~;bvO^D%Rk=RFa{O3b{zu`D25kH zL*sMOW>CX09e9b6aSLyW-y8FxM|IQZ-PUpu$#_nPbL_r%;vmH{vkI|7E+?i{4bRAy z@+i0}_k|5P@okz*tBf%3MZ$Xmn8R|H#96=oaOoS*6gFCA5FB?&mEwiU*C!)2GFYf` zcCMI#)|ZA*KTmTv>0f-EmY7NS)-TdTnYcH;S4-0pgUQzB{=(6q2b*aNQCY2YiYHwB zIi_FJ#SO?LzX=cLlE8a%>;dL+%Gf~9z7A{08nW4Len45|&X^(giTcOVj<)U)D?S>5 zkYvg2W36rvCG*KhNo<3(gG>pR6Sh}t8!?d*CbbmFRmk&vmT=Y6NV)(Kuo^@(K@AOO zQ@^x#TBEs;f_p_}Q1SUweE{F_r^C;ljVlYBKtT_1tZ_jmszKWLMB_p&*vIhluEKFO zf|FBML~(GdIBARh z_STe8-)*)yVxb0pg`+6*A}91fRI(P7RgXxcx38f{QIR&}-%!=;9`BhT!16{e9_~pox9A zQwcO4iEDJ@x{R3UD4ecJ^A0ebW99S{aHkZ;iMwb@V%L{=G`k-$VVl)D$Ir*qs(adz z8yvA}|7(|B5%AO^e%H4(la~Z!BFc)@LW74s`VLf>kVE|cOSnjfNx_kJvRzvOEGLHN z!a*x{jU5%h5ufVOqHOldx$pjHn6vTd&y;kgXuJr;rqt2z4RQs5x9p$jfTuE~By(!a zI>UsoGN|N)|1q8Wt*b!!Lsv{BG&2-bFN+El5s}S7G92)wf+C?t{x9uu#WeIraaGt24!={-cRGIQgGa#lBNW z(lF4LeSBEf)6HEwX&sj03Gdj;Wotc=Bk2JnUCCyKf;Mr!aeiSY*dwHVv@CZ%oVnc4 zmZM79N@6en!ck}ZIlNZYm$#(*lC9{DtlW2B^_@>PyB%3-w^oF9Le=nXjnr6dAcKWt z{X>(R9vqUO82dI0dl7xh0)d73qlURtqZ=r}f+czqX;(otqt@=6Xh0b9m$ZcW@Mlw# zDldA#X{g39x^}y2Hck60_s4$IzbY!Q{skkF!Ra%SZO>NNHZNmeTErMPV{5W9!u%`< zUAHYvo$?{eNOS0`U6fDy8^fY{p@Jni@O)>g-IOFzuJiQd(~&Z>?T%W1w9#DF^vDF-9p)lTFs;VNxcF2)Vq zFniZ>)NpngM^9R0Qxqj;JbiPS5OQ>W*j-oWVQ>6>Gnb*sp{GG`%<~>Lw?*R28l4-R z<_A%5r^fOd^N{e&RHdy-OwRLC8@0D5cH}Ajmg;A$^9L$ov8Q7}TqCN*jgfmm*-*`5bnVJ6V15SPBfE8(tBSTHT@S}l zj?Q+NnUbh_*V$e{g-P@3C9P85d58&g9sWuxwW2 z!ZRqfQrqVeWxMIpxuvi->CZ8ZdcU5flobqDc3kT2fv~AB5^0_s(46$cN4@4U`cZLt z-}4ihNsJm*UOd?GqCXrL*NVTv%KVdO6H*&^Iv#xXm!OJe&ZeUUE#@Fu`#%JKY2b65 zIH-(kh_qk4vR~GGPu1${Hwl$NczaXB7Rse + + + + + +blockchain + +Creating A P2SH Redeem Script Hash To Receive Payment +cluster_bob + +Bob's Computer + +cluster_alice + +Alice's Computer + +cluster_tx1 + +TX 1 + + +private_key + +Private +Key + + +full_public_key + +Full +Public Key + + +private_key->full_public_key + + + + +redeemScript + +Redeem Script + + +full_public_key->redeemScript + + + + +script_hash + +Script +Hash + + +redeemScript->script_hash + + + + +spender_script_hash + +Copy Of +Script +Hash + + +script_hash->spender_script_hash + + + + +tx1_script_hash + +Copy Of +Script +Hash + + +spender_script_hash->tx1_script_hash + + + + + diff --git a/docs/img/dev/en-ecdsa-compressed-public-key.gnuplot b/docs/img/dev/en-ecdsa-compressed-public-key.gnuplot new file mode 100644 index 000000000..8f04cf3ac --- /dev/null +++ b/docs/img/dev/en-ecdsa-compressed-public-key.gnuplot @@ -0,0 +1,15 @@ +set samples 1000000 +set yrange [-4:4] + +set terminal svg size 600,200 font "Sans,12" +set output "en-ecdsa-compressed-public-key.svg" + +plot [-3:8] sqrt(x**3+7) \ + ,-sqrt(x**3+7) \ + ,"< echo 1 2.83" u 1:2 title "x,y=1.00,2.83" with points + +## Remember to run optipng -o7 on output before commiting +set terminal png size 600,200 font "Sans,12" +set output "en-ecdsa-compressed-public-key.png" + +replot diff --git a/docs/img/dev/en-ecdsa-compressed-public-key.png b/docs/img/dev/en-ecdsa-compressed-public-key.png new file mode 100644 index 0000000000000000000000000000000000000000..08c49ac686e3ccecf5f8110814285f3e3b932627 GIT binary patch literal 2963 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ecdsa-compressed-public-key.svg b/docs/img/dev/en-ecdsa-compressed-public-key.svg new file mode 100644 index 000000000..30db27cee --- /dev/null +++ b/docs/img/dev/en-ecdsa-compressed-public-key.svg @@ -0,0 +1,386 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Gnuplot + Produced by GNUPLOT 4.6 patchlevel 0 + + + + + -4 + + + + -3 + + + + -2 + + + + -1 + + + + 0 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + -2 + + + + 0 + + + + 2 + + + + 4 + + + + 6 + + + + 8 + + + sqrt(x**3+7) + + + -sqrt(x**3+7) + + + + + x,y=1.00,2.83 + + + + + + + diff --git a/docs/img/dev/en-hard-fork.dot b/docs/img/dev/en-hard-fork.dot new file mode 100644 index 000000000..b485f5018 --- /dev/null +++ b/docs/img/dev/en-hard-fork.dot @@ -0,0 +1,49 @@ +digraph { + +size=6.25; +rankdir=LR +//splines = ortho; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", label = "", width=0.3, height=0.3 ] +graph [ penwidth = 1.75, fontname="Sans" ] + +invis1 [ shape = "none", label = "Blocks\nFrom\nUpgraded\nNodes" ] +invis0 [ shape = "none", label = "Blocks\nFrom Non-\nUpgraded\nNodes" ]; + +subgraph cluster_honest { +block0 [ label = "Follows\nOld\nRules" ]; +block1 [ label = "Follows\nOld\nRules" ]; +block2_1 [ label = "Follows\nOld\nRules" ]; +block3_1 [ label = "Follows\nOld\nRules" ]; +//block2_1 -> block4 [ style = "invis", minlen = 2 ]; + + +style = "invis"; +} + + +subgraph cluster_attack { +block2 [ label = "Follows\nNew\nRules" ]; +block3 [ label = "Follows\nNew\nRules" ]; +block4 [ label = "Follows\nNew\nRules" ]; +block5 [ label = "Follows\nNew\nRules" ]; + +style = "invis" +} + + + +invis0 -> block0 [ minlen = 2, style = "dashed" ]; +block2_1 -> block3_1; + +block0 -> block1 -> block2 -> block3 -> block4 -> block5; + +block1 -> block2_1 + + + +label = "A Hard Fork: Non-Upgraded Nodes Reject The New Rules, Diverging The Chain" +} diff --git a/docs/img/dev/en-hard-fork.png b/docs/img/dev/en-hard-fork.png new file mode 100644 index 0000000000000000000000000000000000000000..beb3a020e1e1a146e5e79c9bb1d1e72280769c36 GIT binary patch literal 6182 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 + + + + + +_anonymous_0 + +A Hard Fork:  Non-Upgraded Nodes Reject The New Rules, Diverging The Chain +cluster_honest + +cluster_attack + + +invis1 +Blocks +From +Upgraded +Nodes + + +invis0 +Blocks +From Non- +Upgraded +Nodes + + +block0 + +Follows +Old +Rules + + +invis0->block0 + + + + +block1 + +Follows +Old +Rules + + +block0->block1 + + + + +block2_1 + +Follows +Old +Rules + + +block1->block2_1 + + + + +block2 + +Follows +New +Rules + + +block1->block2 + + + + +block3_1 + +Follows +Old +Rules + + +block2_1->block3_1 + + + + +block3 + +Follows +New +Rules + + +block2->block3 + + + + +block4 + +Follows +New +Rules + + +block3->block4 + + + + +block5 + +Follows +New +Rules + + +block4->block5 + + + + + diff --git a/docs/img/dev/en-hd-cross-generational-key-compromise.dot b/docs/img/dev/en-hd-cross-generational-key-compromise.dot new file mode 100644 index 000000000..dead1601f --- /dev/null +++ b/docs/img/dev/en-hd-cross-generational-key-compromise.dot @@ -0,0 +1,75 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ fontname="Sans", penwidth = 1.75, shape = "box" ]; +edge [ fontname="Sans", penwidth = 1.75, style = "" ]; +graph [ fontname="Sans" ]; +nodesep=0.15; +splines = false; +ranksep = 0.7; + +subgraph cluster_parent { + parent_private_key [ label = "Private", style = "" ]; + parent_chain_code [ label = "Chain", style = "filled" ]; + parent_public_key [ label = "Public", style = "filled" ]; + + label = "Parent\n " +} + +subgraph cluster_child { + child_private_key [ label = "Private" ]; + child_chain_code [ label = "Chain" ]; + child_public_key [ label = "Public" ]; + + label = "Child\n " +} + +subgraph cluster_grandchild { + grandchild_private_key [ label = "Private", style = "filled" ]; + grandchild_chain_code [ label = "Chain" ]; + grandchild_public_key [ label = "Public" ]; + + label = "Grandchild\n " +} + +subgraph cluster_greatgrandchild { + greatgrandchild_private_key [ label = "Private" ]; + greatgrandchild_chain_code [ label = "Chain" ]; + greatgrandchild_public_key [ label = "Public" ]; + + label = "Great-\nGrandchild" +} + + +parent_public_key -> child_public_key; +parent_public_key -> child_chain_code; +parent_chain_code -> child_chain_code [ label = "Normal Child\nKey Derivation", weight = 100 ]; +parent_chain_code -> child_public_key; +parent_chain_code -> child_private_key [ style = "invis" ]; +parent_private_key -> child_private_key [ dir = "back", style = "", label = "Parent Key\nDerivation" ]; + +parent_chain_code -> parent_private_key [ constraint = false ]; + +child_private_key -> grandchild_private_key [ dir = "back", style = "" ]; +child_public_key -> grandchild_chain_code; +child_public_key -> grandchild_public_key; +child_chain_code -> grandchild_private_key [ style = "invis" ]; +child_chain_code -> grandchild_public_key; +child_chain_code -> grandchild_chain_code [ weight = 100 ]; + +child_chain_code -> child_private_key [ constraint = false ] + +grandchild_private_key -> greatgrandchild_private_key; +grandchild_public_key -> greatgrandchild_chain_code; +grandchild_public_key -> greatgrandchild_public_key; +grandchild_chain_code -> greatgrandchild_private_key; +grandchild_chain_code -> greatgrandchild_public_key; +grandchild_chain_code -> greatgrandchild_chain_code [ weight = 100 ]; + +grandchild_chain_code -> grandchild_private_key [ constraint = false, style = "invis" ] +greatgrandchild_chain_code -> greatgrandchild_private_key [ constraint = false, style = "invis" ] + +label = "Cross-Generational Key Compromise" +} diff --git a/docs/img/dev/en-hd-cross-generational-key-compromise.png b/docs/img/dev/en-hd-cross-generational-key-compromise.png new file mode 100644 index 0000000000000000000000000000000000000000..8869dcf0aeb6df1cb5e580f8fab62239470f9d01 GIT binary patch literal 9474 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 YiK^f7J?1$6Q{1E|tM;-)8XEY201EC44FCWD literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-hd-cross-generational-key-compromise.svg b/docs/img/dev/en-hd-cross-generational-key-compromise.svg new file mode 100644 index 000000000..c0bb8e187 --- /dev/null +++ b/docs/img/dev/en-hd-cross-generational-key-compromise.svg @@ -0,0 +1,192 @@ + + + + + + +extended + +Cross-Generational Key Compromise +cluster_parent + +Parent + + +cluster_child + +Child + + +cluster_grandchild + +Grandchild + + +cluster_greatgrandchild + +Great- +Grandchild + + +parent_private_key + +Private + + +child_private_key + +Private + + +parent_private_key->child_private_key + + +Parent Key +Derivation + + +parent_chain_code + +Chain + + +parent_chain_code->parent_private_key + + + + + +child_chain_code + +Chain + + +parent_chain_code->child_chain_code + + +Normal Child +Key Derivation + + +child_public_key + +Public + + +parent_chain_code->child_public_key + + + + +parent_public_key + +Public + + +parent_public_key->child_chain_code + + + + +parent_public_key->child_public_key + + + + +grandchild_private_key + +Private + + +child_private_key->grandchild_private_key + + + + +child_chain_code->child_private_key + + + + + +grandchild_chain_code + +Chain + + +child_chain_code->grandchild_chain_code + + + + +grandchild_public_key + +Public + + +child_chain_code->grandchild_public_key + + + + +child_public_key->grandchild_chain_code + + + + +child_public_key->grandchild_public_key + + + + +greatgrandchild_private_key + +Private + + +grandchild_private_key->greatgrandchild_private_key + + + + + +grandchild_chain_code->greatgrandchild_private_key + + + + +greatgrandchild_chain_code + +Chain + + +grandchild_chain_code->greatgrandchild_chain_code + + + + +greatgrandchild_public_key + +Public + + +grandchild_chain_code->greatgrandchild_public_key + + + + +grandchild_public_key->greatgrandchild_chain_code + + + + +grandchild_public_key->greatgrandchild_public_key + + + + + + diff --git a/docs/img/dev/en-hd-overview.dot b/docs/img/dev/en-hd-overview.dot new file mode 100644 index 000000000..50d053e62 --- /dev/null +++ b/docs/img/dev/en-hd-overview.dot @@ -0,0 +1,55 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ fontname="Sans", penwidth = 1.75, shape = "box" ]; +edge [ fontname="Sans", penwidth = 1.75 ]; +graph [ fontname="Sans" ] +nodesep=0.15; +//splines = ortho; +ranksep = 0.3; + +subgraph cluster_parent { +style = "invis"; +parent_private_key [ label = "Parent Private Key" ]; +parent_chain_code [ label = "Parent Chain Code" ]; +parent_public_key [ label = "Parent Public Key" ]; +} + +child_private_key [ label = "Child Private Key" ]; +child_chain_code [ label = "Child Chain Code" ]; +child_public_key [ label = "Child Public Key" ]; + +i_norm [ label = "Index Number" ]; +hmac [ label = "One-Way Hash", style = "diagonals" ]; + +rel1 [ label = "Mathematical\nRelationship", shape = "none" ] +rel2 [ label = "Derived\nMathematical\nRelationship", shape = "none" ] + +rel1 -> parent_private_key [ weight = "", dir = "back" ]; +rel1 -> parent_chain_code [ weight = "", style = "invis" ]; +rel1 -> parent_public_key [ weight = "" ]; + +child_private_key -> rel2 [ ]; +child_chain_code -> rel2 [ style = "invis" ]; +child_public_key -> rel2 [ dir = "back" ]; + + +//parent_private_key -> parent_public_key [constraint = false, label = "Math Rel" ]; +//child_private_key -> child_public_key [constraint = false, minlen = 2]; + +parent_private_key -> child_private_key; +parent_public_key -> child_public_key; + +parent_public_key -> hmac; +parent_chain_code -> hmac; +parent_private_key -> hmac [ style = "invis" ]; +i_norm -> hmac; + +hmac -> child_public_key; +hmac -> child_private_key; +hmac -> child_chain_code; + +label = " \nNormal Hierarchical Deterministic (HD) Key Derivation (BIP32)" +} diff --git a/docs/img/dev/en-hd-overview.png b/docs/img/dev/en-hd-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..48e637bce3a30d91962bd0eb38459d58a089ef9f GIT binary patch literal 6591 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 RsO;Cy3|LKDwN@Dx{vV + + + + + +extended + + +Normal Hierarchical Deterministic (HD) Key Derivation (BIP32) +cluster_parent + + +parent_private_key + +Parent Private Key + + +child_private_key + +Child Private Key + + +parent_private_key->child_private_key + + + + +hmac + + + + + +One-Way Hash + + + +parent_chain_code + +Parent Chain Code + + +parent_chain_code->hmac + + + + +parent_public_key + +Parent Public Key + + +child_public_key + +Child Public Key + + +parent_public_key->child_public_key + + + + +parent_public_key->hmac + + + + +rel2 +Derived +Mathematical +Relationship + + +child_private_key->rel2 + + + + +child_chain_code + +Child Chain Code + + + +child_public_key->rel2 + + + + +i_norm + +Index Number + + +i_norm->hmac + + + + +hmac->child_private_key + + + + +hmac->child_chain_code + + + + +hmac->child_public_key + + + + +rel1 +Mathematical +Relationship + + +rel1->parent_private_key + + + + + +rel1->parent_public_key + + + + + diff --git a/docs/img/dev/en-hd-private-parent-to-private-child.dot b/docs/img/dev/en-hd-private-parent-to-private-child.dot new file mode 100644 index 000000000..ddbd46d82 --- /dev/null +++ b/docs/img/dev/en-hd-private-parent-to-private-child.dot @@ -0,0 +1,65 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ fontname="Sans", penwidth = 1.75, shape = "box" ]; +edge [ fontname="Sans", penwidth = 1.75 ]; +graph [ fontname="Sans" ]; +nodesep=0.05; +//splines = ortho; +ranksep = 1.0; +subgraph cluster_hard { + style = "invis"; + + subgraph cluster_h_parent_extended_key { + h_parent_private_key [ label = "Parent Private Key" ]; + h_parent_chain_code [ label = "Parent Chain Code" ]; + } + + subgraph cluster_child_extended_key_else { + child_private_key_hard [ label = "Child Private Key" ]; + child_chain_code_hard [ label = "Child Chain Code" ]; + } + + hmac_hard [ style = "diagonals", label = "One-Way\nHash" ]; + i_hard [ label = "Index ≥0x80000000" ]; + + h_parent_chain_code -> hmac_hard; + h_parent_private_key -> hmac_hard; + + i_hard -> hmac_hard; + + hmac_hard -> child_private_key_hard; + hmac_hard -> child_chain_code_hard; + h_parent_private_key -> child_private_key_hard; +} + + +subgraph cluster_norm { + style = "invis" + + subgraph cluster_n_parent_extended_key { + n_parent_private_key [ label = "Parent Private Key" ]; + n_parent_chain_code [ label = "Parent Chain Code" ]; + n_parent_public_key [ label = "Parent Public Key" ]; + } + + subgraph cluster_child_extended_key_norm { + child_private_key_norm [ label = "Child Private Key" ]; + child_chain_code_norm [ label = "Child Chain Code" ]; + } + hmac_norm [ style = "diagonals", label = "One-Way\nHash" ]; + i_norm [ label = "Index <0x80000000" ]; + + n_parent_chain_code -> hmac_norm; + n_parent_public_key -> hmac_norm; + i_norm -> hmac_norm; + hmac_norm -> child_private_key_norm; + hmac_norm -> child_chain_code_norm; + n_parent_private_key -> child_private_key_norm [weight = 5]; +} + +label = "Normal (Top) And Hardened (Bottom) Child Private Key Derivation"; + +} diff --git a/docs/img/dev/en-hd-private-parent-to-private-child.png b/docs/img/dev/en-hd-private-parent-to-private-child.png new file mode 100644 index 0000000000000000000000000000000000000000..830816046fc1c67570f2c6e0caa0adb74db3b5a0 GIT binary patch literal 10921 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 + + + + + +extended + +Normal (Top) And Hardened (Bottom) Child Private Key Derivation +cluster_hard + +cluster_h_parent_extended_key + +cluster_child_extended_key_else + +cluster_norm + +cluster_n_parent_extended_key + +cluster_child_extended_key_norm + + +h_parent_private_key + +Parent Private Key + + +child_private_key_hard + +Child Private Key + + +h_parent_private_key->child_private_key_hard + + + + +hmac_hard + + + + + +One-Way +Hash + + +h_parent_private_key->hmac_hard + + + + +h_parent_chain_code + +Parent Chain Code + + +h_parent_chain_code->hmac_hard + + + + +child_chain_code_hard + +Child Chain Code + + +hmac_hard->child_private_key_hard + + + + +hmac_hard->child_chain_code_hard + + + + +i_hard + +Index ≥0x80000000 + + +i_hard->hmac_hard + + + + +n_parent_private_key + +Parent Private Key + + +child_private_key_norm + +Child Private Key + + +n_parent_private_key->child_private_key_norm + + + + +n_parent_chain_code + +Parent Chain Code + + +hmac_norm + + + + + +One-Way +Hash + + +n_parent_chain_code->hmac_norm + + + + +n_parent_public_key + +Parent Public Key + + +n_parent_public_key->hmac_norm + + + + +child_chain_code_norm + +Child Chain Code + + +hmac_norm->child_private_key_norm + + + + +hmac_norm->child_chain_code_norm + + + + +i_norm + +Index <0x80000000 + + +i_norm->hmac_norm + + + + + diff --git a/docs/img/dev/en-hd-public-child-from-public-or-private-parent.dot b/docs/img/dev/en-hd-public-child-from-public-or-private-parent.dot new file mode 100644 index 000000000..23a7789ce --- /dev/null +++ b/docs/img/dev/en-hd-public-child-from-public-or-private-parent.dot @@ -0,0 +1,78 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ penwidth = 1.75, shape = "box" ]; +edge [ penwidth = 1.75 ]; +nodesep=0.05; +splines = ortho; +ranksep = 0.30; + +subgraph cluster_from_private { + //style = "invis" + //label = "Creation Of Normal Child Extended Keys (Key + Chain Code)\nFrom Parent Extended Keys" + + subgraph cluster_fp_n_parent_extended_key { + fp_n_parent_private_key [ label = "Parent Private Key" ]; + fp_n_parent_chain_code [ label = "Parent Chain Code" ]; + } + + subgraph cluster_fp_child_extended_key_norm { + fp_child_private_key_norm [ label = "Child Private Key" ]; + fp_child_chain_code_norm [ label = "Child Chain Code" ]; + } + subgraph cluster_fp_child_extended_key_pub { + fp_n_child_public_key_norm [ label = "Child Public Key" ]; + fp_child_chain_code_norm1 [ label = "Child Chain Code" ]; + } + + fp_hmac_norm [ style = "diagonals", label = "One-Way\nHash" ]; + fp_i_norm [ label = "i (Normal)" ]; + + fp_n_parent_chain_code -> fp_hmac_norm; + fp_i_norm -> fp_hmac_norm; + fp_hmac_norm -> fp_child_private_key_norm; + fp_hmac_norm -> fp_child_chain_code_norm; + fp_n_parent_private_key -> fp_child_private_key_norm; + + fp_child_private_key_norm -> fp_n_child_public_key_norm; + fp_child_chain_code_norm -> fp_child_chain_code_norm1; + + label = "From Parent Extended Private Key" +} + +equiv [ label = "Equivalent For\nCorresponding\nExtended Keys\nAnd Same\nValue Of i", shape = "none" ]; +equiv -> fp_n_child_public_key_norm [ constraint = false, style = "dashed", dir = "back" ]; +child_public_key_hard -> equiv [ style = "dashed" ]; + +subgraph cluster_from_public { + + subgraph cluster_h_parent_extended_key { + h_parent_public_key [ label = "Parent Public Key" ]; + h_parent_chain_code [ label = "Parent Chain Code" ]; + } + + subgraph cluster_child_extended_key_else { + child_public_key_hard [ label = "Child Public Key" ]; + child_chain_code_hard [ label = "Child Chain Code" ]; + } + + hmac_hard [ style = "diagonals", label = "One-Way\nHash" ]; + i_hard [ label = "i (Normal)" ]; + + h_parent_chain_code -> hmac_hard; + + i_hard -> hmac_hard; + + hmac_hard -> child_public_key_hard; + hmac_hard -> child_chain_code_hard; + h_parent_public_key -> child_public_key_hard; + + label = "From Parent Extended Public Key" +} + + +label = "Creation Of Equivalent Child Extended Public Keys From\nEither Private Or Public Parent Keys" + +} diff --git a/docs/img/dev/en-hd-public-child-from-public-or-private-parent.png b/docs/img/dev/en-hd-public-child-from-public-or-private-parent.png new file mode 100644 index 0000000000000000000000000000000000000000..0432bded9bc2bac60a18723b777589a90bd1ba82 GIT binary patch literal 11067 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-hd-public-child-from-public-or-private-parent.svg b/docs/img/dev/en-hd-public-child-from-public-or-private-parent.svg new file mode 100644 index 000000000..59e4a4bb0 --- /dev/null +++ b/docs/img/dev/en-hd-public-child-from-public-or-private-parent.svg @@ -0,0 +1,196 @@ + + + + + + +extended + +Creation Of Equivalent Child Extended Public Keys From +Either Private Or Public Parent Keys +cluster_from_private + +From Parent Extended Private Key + +cluster_fp_n_parent_extended_key + + +cluster_fp_child_extended_key_norm + + +cluster_fp_child_extended_key_pub + + +cluster_from_public + +From Parent Extended Public Key + +cluster_h_parent_extended_key + + +cluster_child_extended_key_else + + + +fp_n_parent_private_key + +Parent Private Key + + +fp_child_private_key_norm + +Child Private Key + + +fp_n_parent_private_key->fp_child_private_key_norm + + + + +fp_n_parent_chain_code + +Parent Chain Code + + +fp_hmac_norm + + + + + +One-Way +Hash + + +fp_n_parent_chain_code->fp_hmac_norm + + + + +fp_n_child_public_key_norm + +Child Public Key + + +fp_child_private_key_norm->fp_n_child_public_key_norm + + + + +fp_child_chain_code_norm + +Child Chain Code + + +fp_child_chain_code_norm1 + +Child Chain Code + + +fp_child_chain_code_norm->fp_child_chain_code_norm1 + + + + +fp_hmac_norm->fp_child_private_key_norm + + + + +fp_hmac_norm->fp_child_chain_code_norm + + + + +fp_i_norm + +i (Normal) + + +fp_i_norm->fp_hmac_norm + + + + +equiv +Equivalent For +Corresponding +Extended Keys +And Same +Value Of i + + +equiv->fp_n_child_public_key_norm + + + + +child_public_key_hard + +Child Public Key + + +child_public_key_hard->equiv + + + + +h_parent_public_key + +Parent Public Key + + +h_parent_public_key->child_public_key_hard + + + + +h_parent_chain_code + +Parent Chain Code + + +hmac_hard + + + + + +One-Way +Hash + + +h_parent_chain_code->hmac_hard + + + + +child_chain_code_hard + +Child Chain Code + + +hmac_hard->child_public_key_hard + + + + +hmac_hard->child_chain_code_hard + + + + +i_hard + +i (Normal) + + +i_hard->hmac_hard + + + + + diff --git a/docs/img/dev/en-hd-public-child-from-public-parent.dot b/docs/img/dev/en-hd-public-child-from-public-parent.dot new file mode 100644 index 000000000..4f920308b --- /dev/null +++ b/docs/img/dev/en-hd-public-child-from-public-parent.dot @@ -0,0 +1,39 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ penwidth = 1.75, shape = "box" ]; +edge [ penwidth = 1.75 ]; +nodesep=0.05; +splines = ortho; +ranksep = 1.0; + +subgraph cluster_norm { + //style = "invis" + //label = "Creation Of Normal Child Extended Keys (Key + Chain Code)\nFrom Parent Extended Keys" + + subgraph cluster_n_public_extended_key { + n_parent_public_key [ label = "Parent Public Key" ]; + n_parent_chain_code [ label = "Parent Chain Code" ]; + } + + subgraph cluster_child_extended_key_norm { + child_public_key_norm [ label = "Child Public Key" ]; + child_chain_code_norm [ label = "Child Chain Code" ]; + } + hmac_norm [ style = "diagonals", label = "One-Way\nHash" ]; + i_norm [ label = "i (Normal)" ]; + + n_parent_chain_code -> hmac_norm; + i_norm -> hmac_norm; + hmac_norm -> child_public_key_norm; + hmac_norm -> child_chain_code_norm; + n_parent_public_key -> child_public_key_norm; + + label = "Normal Public" +} + +label = "Creation Of Child Extended Public Keys (Key, Chain Code)\n(Hardened Child Public Keys Cannot Be Created From A Parent Public Key)" + +} diff --git a/docs/img/dev/en-hd-public-child-from-public-parent.png b/docs/img/dev/en-hd-public-child-from-public-parent.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd9d6dd599b593883f6abcfffaae5821399eaf7 GIT binary patch literal 7184 zcmai3cQhQ#yI#wZtQJIxn&@kl=%Pf4MDMJPxI5fL}o0RS*z)sz(tpW!yLNxf+AXY@w5vW3YKJdX$l>hTCi z<`F5{u@|62nPR}bKcqu3wG{SG?akn3siM-93Wj@q929w0B(y~A1R%1zPlKYxP9dt$*n5{S1>>V z_)P#Q5fH5apu^Wf0Q}d2LHOED`H%?|@*91D%c>y7IC-4* zxDDEkhh^O%qriadTwr1x@V<-{nGzuo8HqV@J12k}zh`|V|0YbRv zj)b`RsSR+43`Vm1)OQWg5!}ra>_wdFD8wlxyF0TeYWY&*)@rgdTfy8ggq)Rf%I?F_1)a+Bmp z!))o|muP)mo2bnzvC$tD<+(Xvgje6(T2rr8=4ySlgb zOA~DS?z&0$q7@0l(v}MPXf9qH#3s==J~u2T>};C(`x>V!Czc7K&V)=}%xO&?=QICI zs-E-y3mHsVX>>f>wdXl%=6B|>#W87muXQKRy8StQ?>}Ig&9{7BYrkeQe=qhV;6ioR zj8=_FZRbJM=!5cQpVBkMYNOG_H%WM?aXDwf4Eu$~xir>^wx$OFI*S~vj^wMQtvW)o zZOY95dvvK9L$djd0q(|Nhqa@d81z0~0>F#E85e1}L z68-NR=`0>0mt=72GBbHbkKelkMre!3`@GzD>A3dTw&NTa@Efq1XflUrUUCdVO^e@) zsWOP=$FC-10_CehG;ReizYv5Cvv3d;OW#=%<-51R>O8lH(NA*+R9KC@EtDBh=+-=S zysktgJT}}fxfM_qbky5S4ErI}+vY}57?imbdcHgLv!c)MZh&$IP=3odBAqFNa`M z`A`UIYo16Wn&O-vH19c*=JuqqVDLR|S0y`iKWI+Db~Cw}P~g<)Zg2|oryz2pO%gO` zRgdL?Yv5;mQH88i6iCktG7j1UGo2MqXB!E0qhy`45* zcM**!aIGch5*eO8@&`hLJFvssgm4jKWB)1?gpFKwjS2-lR!GqmYuqWCAM`^k9B~uE zV>=U@jw7IgStbS{>Zx4t{ZWOKGBU$rTT6@Gy(EfY+HVLovoph$wIQp>$oC6q=)#t> z!TMXnl#0Wbyc$+wlnV~#r$a%B61&pFNe#snVO$^Q z1QWW0Ct!_bVj65^u|D4_0Kv3#2rcdVG|49wHCttFZ2@d8u$=aHc@pbly146d7c`EU zkPAp@1LjuCUbf~W5iP2xKYdLhW!XOuh*kojq++1nYIJHmBGdIddlMk>efba}pN{E$ z_Pf#w&ENIurNsCHcoI^=?oN`FH+7|_^tNWS0?;pRpi-{PS5)1K;HVc~cDmjIV|{3@ zJCWr4WQg#Y60Lnr{6bG+&C zrk;?Cs1-@7&#Jbn2}P&+eqTdtZ|ymdROe%bQ?qXN;dQ&t0=zlLGv6##XG=9o`i1&{ z5p$zH=Y#`}4K#XcvlQ;EK~orytj(~>#G+;QD|7-uXP7Q%1UDy{c?dZ|xPp}Lc*|kN zr3pDUyF*%wxz)Iry@>C>p=>xRQTB0ZiyclemVMi3w2t}fb|k&Qc?4j+l0ymYpJ25r zLyz&@bpxWa>}6{BR+Uc8K^h-3tr9lEG`VYMv>i++?5YwB5zo?uI$RX?09^7w?1I&s z0xuAXAloBtyak;4vF6?y*1??ZV?Fl7LJsSw^fd zs)1hmH19C^PUTc@m}70WK9}&$1E4hdM}4N2cUKwVc&`P6Q^ItWZM0_|62d>e&3>hh z^8$=n`jWtV7Ki-!6E~IPH^Q{JMJ}BgG~+;G_5=+ApM}pgDcNB?9!Kd*W4W}V-g!Ch z=$|Ezh~E;ac1br)Q*t4yD95UJ!*qn5ynge8Q+Hi>3KAt)FnehW1gYCTyQcYBlJEIu zuV!o7sGx}7b({-V1_z`G<>ELS@1|fE6e*N3I}d#Y6SS|6IOw;?<15E(iat?s58e)0 z?Id5Wa|z*_^HCX$$a$3oxW>DI=9oMR=`rW~IOu~>@M|8$0UEUG0mUEtsvbtMv)8s7 zW=uM(J!$(SbS7fGKe(eOd<^M1P>B8yyvL!oDH~xq>`5D8CChniOnjd)1 z6SbKou_Sup7A}EBj8Fn$%7+(6FEV@oN~J17hoDs!#EqcF&f5N`N;(PHr%GcUpW?`A ze<4P8G)R<@W8|EEB$D@6fpEzlopRTGv3d7^PW9E-#EqHu3)yy;$*}>T4jLtZZAUDE zUG1_3W!~IuYe#HIQOGNiu)*o%SK*<>Is&ZzdCr;(GN*f0@))4cJ$Nv_ZKZA6%hpF& zzKs-rwXqOr(2Lf;@iG)!y@IdWq3vWCYWl{%qFy7Hd$q<|xaG+3&5#J$(EBBH+m`gQ z$;XMmWh(Xjz5-BaqV)>%lQ>5xU8SHx$*{8LT4mpkx`=Vw7gH;#7vAmGxJtb>;2LFiO5qasL$LAf z`D;%R^%ujfEye4IR+qwPZL`Ary>hjNRRGj4;JWI=NS6=&S$YA|bopU2?HnUdqWNQ> z0H{CaotfM{i^4)rwVB49ffn|!L1X>Oy)3m}RRDfxbU_ahs#cn8a&d(gONw0?Momu5 zS|tBY7nXh;zyA=-r%(A=1m1|hoeJ@{lTGT<-HxYGvW8q~$u*)sW9VuS8XF~)=Ua}lox)HM~MK1|Ll~0+ptHx z+A&3LFgZD!%%{S!->TlBsbZeHFRe0GO|7?>ejJ@SPXyJajYZT?3=PF8^S*PiFwZRg zL8P9@4S;^?l(vA48m-|L3??OftCmb9Mnx(YTt7^lG7;4soC)dxa= z$lxmdJw7lV1)geNG zwq_+y00yF^^BS^6S+s*+0QgI#VKDY;(4@V(t*94Y@N%q@1MoTq%n(qj9ZZpagPJA} zkg8k#TUhHD(zz{YtbMiSsxCmIOgJ#hM+U>@62z+=4207mQd|$>c3vY!u6|1T6mCT@ zNg$uiZSYotfKgA1l3Rg*zY*iaCzQaW;MYaO8@$X2zfAx}{3bvd^Bg9;EPoy8Zj67i zfnjXdWmxTK0sK>)866E*eMvDpON~mGwC|Em{ZR(+tZJDXu6dtyGr{7nL)9Y8qq86! z-)MVva)Q;*7Cq_3jFM}sx_t5(9lEs}R2_cHJEjN?cdNc+c@wOaY;mh?L6=wVLKOlpWp=7= zoe-(TrsI;&m_{#Ot6)^0Gj8AyUEk3O)IyGWcI%;*t;a-a6Et1>&y5Q&J9&I?8n4kk$Q;RPb?wcJ19EGH?q}CO0E6*R!iG+ zzeROnIHy78PLIaLZv;LWUozW&)R{lj`42nCGiVQTR5k9D0{|WDJSH&K zA`Yj7>+BuoQYc!63&C&xrQ+b@_@}$>m5_<=w%7VJ_G<`8iFOoW2=lND@0*rhBS8LZ zed7O;|7-uZB9w;!IL|h{F5B#$XwUAf^o7A`U&Bc5^8K<(& zX-GRAgm+z=1j5SS(f*)|BE;LP&p%Etaco4I59(0oT8QczZtt|KBWFaHdl=46x%uBY z@Vl3>9I?{LRP3tUg0$nT`Y4aEI$gb~fhIaRliRf&wz?b*ah~`=5wVDtOd64Jz%X{? zu-?O>q9j*(_DlskCKJn@(jd!Z4%Cyg)-7_AWm|U+SoXI!PR7?Wn(Zp3ZivDD@NQz~ zwZff)1mtnCo;FM^Fd$KL+*Z5j%*#UF(IoWzS~UgFMxY zQUtWRGR$ZFT}G7yhW8BCmLkbk3}-U-zxpmd9+(?xZL7Y4s^Fk|bc!=Ku5avXjtBR} ze&bLyY9YCSS>vHED5R<2KMPy%W7%{FWwKZ0FFbOAdCh5L)F5_s{rhN=!Rm2Nf(e)U3r)_l zheB0{8-41(1uflo1Dz1&^B4nPu5V_lARCn(D&rKdxcc=}5HUI#SoouJ%Reo0{i|Ru zBW228a)DKrSMt@Qtk}sC)a|U746FYduo6L*Lsb!S8JvuKFAvU@#Bx5<4Cvb-cm3m6 z-lMmzg~ivq_uI8(IE*>p^_DY9JrjB!okfZa{;7KRYkA_|@|y-E{sARxP)3aN!!(ok z`ICQig;ANeA|Z0;M`;cQspuD#(JN{o84-u&o;_)M{`RVR0HKRfkY_V=~m=SB| zThrvsm7m}hbAzG29eq_Dd&?=e1Fw?@^4xdm^$BJY{B877L|$zcr*$RlefFsq?eWH| z6K{@xmCyKLr%vu+aWr>WDkExBVxa&;$A1{~^SEdqI&S~I;v43Y&bot*ZV;f#&q-<}SI@wz>UvSZ} zP+xyP1y)bK^Qk82v7<%7qI3VMgKIxd0vDg18pjOLv37pUo;f1%%I+VD;wAH=-X9;1 zMn*Lf4ZZQwhMaZ*Cn^d?p{2_3?uB1kMLPM$j^@+Y;JH@$^CDpPaNVOs&-`8vnKia2 zMytJ#|B^88~EQQ<^?`*EGT&Z{8@QUs{-=~Ef@XU18vFrmzo zX8Ga2S}SyiT>~LZWkcbtB>x4feY1^?(uNKFjTlYE`4gmx(om|h)1&Jr zw~^Hesn;{)Bdx|vdrPL#*dspVSz?nelEgsNyw(`9zkOoU;Od_=UIv%4-9RC|+?VqZbo|{5 zubSiwocc%k^MM-dHNqxGmku(rhR4!dPw(MsAYv{Lo-~4@E?vYz^zKz`udw8|^E`v{ zj}^s{@nD!ckJ|f|%eS=R_%FiXaW-z&ZBC@FLoV?zqXH{`ZX`0YpWU9@COMwV$IBN6^mt0zKjBke=Dx_0C) zOQL8~ZP4iwiXh23k&zZ!ib@fmKufw6+q&durgV@z_o6ug=}=I~k@@(Cw$Yt17>6`Z zECf2qTZ=PxjtWHM{OmN?@0k9Xgncm7mKQreb&Y0`s z*ip!OXGZy5aAn=vfugqybj2@L=5?NE{Bk4b_b0S(OamBdy!;9+bQ}4dw$cS6iv;NI zYOXnpg?3wl#h-6XU%zpQ*%^opxv!a~S80|PTl$t*Q!j}>yOtG&Tr2#fUg5%&lyV2< z35l7DHM>WYZRHeBe+hh8*sLb+Beaaz!eJ)1Cs9vHEsw#C98=d6?cFPX@%IDtks1=1= zyUgJcvebOe`A)yyl0H0e%HP0Ffd*&XGSbeIpa$0h?uXL0a&Uusm4p=7%!-r23EMXh z84q$QFXCBn^^%iFqc1uaH{5DE%@lf%{XKVIebZ%w&S}&}Oy{i{E1GXGGr4J!;yN`QafVgLS;{rN2EGP + + + + + +extended + +Creation Of Child Extended Public Keys (Key, Chain Code) +(Hardened Child Public Keys Cannot Be Created From A Parent Public Key) +cluster_norm + +Normal Public + +cluster_n_public_extended_key + + +cluster_child_extended_key_norm + + + +n_parent_public_key + +Parent Public Key + + +child_public_key_norm + +Child Public Key + + +n_parent_public_key->child_public_key_norm + + + + +n_parent_chain_code + +Parent Chain Code + + +hmac_norm + + + + + +One-Way +Hash + + +n_parent_chain_code->hmac_norm + + + + +child_chain_code_norm + +Child Chain Code + + +hmac_norm->child_public_key_norm + + + + +hmac_norm->child_chain_code_norm + + + + +i_norm + +i (Normal) + + +i_norm->hmac_norm + + + + + diff --git a/docs/img/dev/en-hd-root-keys.dot b/docs/img/dev/en-hd-root-keys.dot new file mode 100644 index 000000000..1731b4d35 --- /dev/null +++ b/docs/img/dev/en-hd-root-keys.dot @@ -0,0 +1,42 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ penwidth = 1.75, shape = "box" ]; +edge [ penwidth = 1.75 ]; +nodesep=0.2; +ranksep=0.2; +splines = ortho; + +entropy [ label = "128, 256,\nOr 512 Bits\nOf Entropy\n(The Seed)" ]; +hmac [ label = "512-Bit\nOne-Way\nHash", style = "diagonals" ]; + +entropy -> hmac; +hmac -> private_key [label = "256 Bits" ]; +hmac -> chain_code [label = "256 Bits" ]; + + +subgraph cluster_y { +style = "invis" +public_key [ label = "Master\nPublic Key" ]; +private_key [ label = "Master\nPrivate Key" ]; +chain_code [ label = "Master\nChain Code" ]; +} + +style = "invis" + +subgraph cluster_x { +extended_private_key [ label = "Master\nExtended\nPrivate Key" ]; +extended_public_key [ label = "Master\nExtended\nPublic Key" ]; +} + +private_key -> public_key [ style = "dashed", constraint = 1 ]; +chain_code -> extended_private_key; +chain_code -> extended_public_key; +private_key -> extended_private_key; +public_key -> extended_public_key; + +label = "Creation Of The Master Keys" + +} diff --git a/docs/img/dev/en-hd-root-keys.png b/docs/img/dev/en-hd-root-keys.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe2884c0eb1ea2481b5d7a392f0463b793bf02b GIT binary patch literal 6874 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%0Au>xvx_WH*lp603mZ<4%Te4tRs(z#4 zw9u4<3KGiW522ZW-@#~RAE`UnTf}t?Y3BX@tMlIsfe8ziBqFukcNafT>Bp$Pc;c4o z-CBW6aaOGOV!_%;19t+~59%KOHEOw{&`jG_wG*!cB2^C0k9P4Vx~f|vt}2zh`UGhO% zCKn4K5cr?9c+|Uw`$SMaz*}XGN?GNnt*+>&@F^Gi4RZJ^Bn3WPuJl_L4SBo{aS!(e z=P=%I_iq6J4uQ9|P0`ap^XoM?v4JYQaB~$$KCAezRYe;U?i@9t^@&1c=IoY~@49q) zg5Oy0SUuqeb*I@CL;g#MH2O)FoUB{SN4PY`gQl@eLw~*UW9*P&3*Dq}Q)`y}MAC%f z4ra{2<0pTM$Ye}9QwoxzS{m=l(0B14*yR-LP;0Zb6yoVyoxAOFaPv~M-py(cCxGqB z%L=#tR_bhgVd<~60f8IveUUmd$_wrvU;b6NLfnJiVp%`aw1|4{_PN|LDY8phF722X zzY0F$@0Z~opoZ{@^2Ft#|Bg%IbMJfM={pX(|Q(j1}>ux&v zn-iyiPHVp+Z9<6LKd<@|e=X<(M-cHpP+!YY#n*}`>gShrovS-c0`_Md@1T|c47-9q xI*{#H=xUn%v+08f`)AYVs`byNPg>LkOOUESyl!Yy{+~@Nn2L^axgsL`e*pC!7jpmr literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-hd-root-keys.svg b/docs/img/dev/en-hd-root-keys.svg new file mode 100644 index 000000000..f5c623cf3 --- /dev/null +++ b/docs/img/dev/en-hd-root-keys.svg @@ -0,0 +1,111 @@ + + + + + + +extended + +Creation Of The Master Keys +cluster_y + +cluster_x + + +entropy + +128, 256, +Or 512 Bits +Of Entropy +(The Seed) + + +hmac + + + + + +512-Bit +One-Way +Hash + + +entropy->hmac + + + + +private_key + +Master +Private Key + + +hmac->private_key + + +256 Bits + + +chain_code + +Master +Chain Code + + +hmac->chain_code + + +256 Bits + + +public_key + +Master +Public Key + + +private_key->public_key + + + + +extended_private_key + +Master +Extended +Private Key + + +private_key->extended_private_key + + + + +chain_code->extended_private_key + + + + +extended_public_key + +Master +Extended +Public Key + + +chain_code->extended_public_key + + + + +public_key->extended_public_key + + + + + diff --git a/docs/img/dev/en-hd-tree.dot b/docs/img/dev/en-hd-tree.dot new file mode 100644 index 000000000..8e42723ef --- /dev/null +++ b/docs/img/dev/en-hd-tree.dot @@ -0,0 +1,66 @@ +digraph extended { + +size=6.25; +rankdir=LR; +penwidth=1.75; +node [ penwidth = 1.75, shape = "box" ]; +edge [ penwidth = 1.75, style = "dashed" ]; +nodesep=0.15; +splines = ortho; +ranksep = 0.70; + + +subgraph cluster_0p { + m0p [ label = "m/0'" ]; + M0p [ label = "M/0'" ]; + m0p -> M0p [ constraint = false ]; + + label = "Hardened" +} + + +// DEPTH 1 +subgraph cluster_0p_0 { + m0p_0 [ label = "m/0'/0" ]; + M0p_0 [ label = "M/0'/0" ]; + m0p_0 -> M0p_0 [ constraint = false ]; + + label = "Normal" +} + +subgraph cluster_0p_1p { + m0p_1p [ label = "m/0'/1'" ]; + M0p_1p [ label = "M/0'/1'" ]; + m0p_1p -> M0p_1p [ constraint = false ]; + + label = "Hardened"; +} + +subgraph cluster_0p_0_0 { + m0p_0_0 [ label = "m/0'/0/0" ]; + M0p_0_0 [ label = "M/0'/0/0" ]; + m0p_0_0 -> M0p_0_0 [ constraint = false ]; + + label = "Normal" +} + +subgraph cluster_0p_1p_0 { + m0p_1p_0 [ label = "m/0'/1'/0" ]; + M0p_1p_0 [ label = "M/0'/1'/0" ]; + m0p_1p_0 -> M0p_1p_0 [ constraint = false ]; + + label = "Normal" +} + + +m0p -> m0p_0; +m0p -> m0p_1p; + +m0p_0 -> m0p_0_0; +M0p_0 -> M0p_0_0 [ label = "Normal extended\npublic keys\ncan derive child\npublic keys" ]; +m0p_1p -> m0p_1p_0 [ label = "Only derivation from\nextended private keys\nis possible for\nhardened keys" ]; + + +label = "Hierarchical Deterministic Key Derivation" + +} diff --git a/docs/img/dev/en-hd-tree.png b/docs/img/dev/en-hd-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..7e02298e005f112dfbd054c65f5eb4250c0b6f77 GIT binary patch literal 11029 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 Fe*k>u&iViV literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-hd-tree.svg b/docs/img/dev/en-hd-tree.svg new file mode 100644 index 000000000..3cbb4cc41 --- /dev/null +++ b/docs/img/dev/en-hd-tree.svg @@ -0,0 +1,142 @@ + + + + + + +extended + +Hierarchical Deterministic Key Derivation +cluster_0p + +Hardened + +cluster_0p_0 + +Normal + +cluster_0p_1p + +Hardened + +cluster_0p_0_0 + +Normal + +cluster_0p_1p_0 + +Normal + + +m0p + +m/0' + + +M0p + +M/0' + + +m0p->M0p + + + + +m0p_0 + +m/0'/0 + + +m0p->m0p_0 + + + + +m0p_1p + +m/0'/1' + + +m0p->m0p_1p + + + + +M0p_0 + +M/0'/0 + + +m0p_0->M0p_0 + + + + +m0p_0_0 + +m/0'/0/0 + + +m0p_0->m0p_0_0 + + + + +M0p_0_0 + +M/0'/0/0 + + +M0p_0->M0p_0_0 + + +Normal extended +public keys +can derive child +public keys + + +M0p_1p + +M/0'/1' + + +m0p_1p->M0p_1p + + + + +m0p_1p_0 + +m/0'/1'/0 + + +m0p_1p->m0p_1p_0 + + +Only derivation from +extended private keys +is possible for +hardened keys + + +m0p_0_0->M0p_0_0 + + + + +M0p_1p_0 + +M/0'/1'/0 + + +m0p_1p_0->M0p_1p_0 + + + + + diff --git a/docs/img/dev/en-headers-first-flowchart.dot b/docs/img/dev/en-headers-first-flowchart.dot new file mode 100644 index 000000000..bed9abcac --- /dev/null +++ b/docs/img/dev/en-headers-first-flowchart.dot @@ -0,0 +1,37 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=TB +splines = "true"; +ranksep = 0.2; +nodesep = 0.9; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "none", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +fsbc [ label = "Fully-Synced Block Chain?", style = "filled" ]; +fshc [ label = "Fully-Synced Header Chain?", style = "filled" ]; +more_headers_than_blocks [ label = "More Headers Than Blocks?", style = "filled" ]; +listen_for_new_blocks [ label = "Listen For New Blocks (Inv)" ]; +request_blocks [ label = "Request Blocks (GetData)" ]; +request_headers [ label = "Request Headers (GetHeaders)" ]; + +fsbc -> fshc [ label = " No" ]; +fshc -> more_headers_than_blocks [ label = "No" ]; +fshc -> request_headers [ label = " No" ]; + +fsbc -> listen_for_new_blocks [ label = "Yes", constraint=false ]; +fshc -> request_blocks [ label = "Yes", constraint=false ]; +request_blocks -> more_headers_than_blocks [ dir=back, label = " Yes" ]; + +//request_headers -> fshc [ style = "dotted", constraint = false ]; +//request_blocks -> fsbc [ style = "dotted", constraint = false ]; + + + + +label = "\ \nOverview Of Headers-First Initial Blocks Download (IBD)" +} diff --git a/docs/img/dev/en-headers-first-flowchart.png b/docs/img/dev/en-headers-first-flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..8a475527e6a4ec166ee8dd59d2a7d19e8e6825aa GIT binary patch literal 8792 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-headers-first-flowchart.svg b/docs/img/dev/en-headers-first-flowchart.svg new file mode 100644 index 000000000..f087ab601 --- /dev/null +++ b/docs/img/dev/en-headers-first-flowchart.svg @@ -0,0 +1,78 @@ + + + + + + +%3 + + +Overview Of Headers-First Initial Blocks Download (IBD) + +fsbc + +Fully-Synced Block Chain? + + +fshc + +Fully-Synced Header Chain? + + +fsbc->fshc + + +  No + + +listen_for_new_blocks +Listen For New Blocks (Inv) + + +fsbc->listen_for_new_blocks + + +Yes + + +more_headers_than_blocks + +More Headers Than Blocks? + + +fshc->more_headers_than_blocks + + +No + + +request_blocks +Request Blocks (GetData) + + +fshc->request_blocks + + +Yes + + +request_headers +Request Headers (GetHeaders) + + +fshc->request_headers + + +  No + + +request_blocks->more_headers_than_blocks + + +   Yes + + + diff --git a/docs/img/dev/en-headers-first-moving-window.dot b/docs/img/dev/en-headers-first-moving-window.dot new file mode 100644 index 000000000..9fde043f3 --- /dev/null +++ b/docs/img/dev/en-headers-first-moving-window.dot @@ -0,0 +1,45 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size="6.25"; +rankdir=LR +nodesep=0.2; +ranksep=0.3; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir=none ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_verified { + graph [ penwidth = 0 ]; + node [ style = "filled" ]; + + block0 [ width=0, style = "invis", label = "" ]; + block1 [ label = "1\nDownloaded\nFrom Node A" ]; + block2 [ label = "2\nDownloaded\nFrom Node B" ]; + + + label = "Downloaded And Validated\n " +} + +block0 -> block1; +block1 -> block2; +block2 -> block3 -> block4 -> block5; + +block5 -> block6 [ minlen = 2 ]; + +block6 [ style = "invis", width = 0, label = "" ]; + +subgraph cluster_download_window { + block3 [ label = "3\nRequested\nFrom Node A" ]; + block4 [ label = "4\nDownloaded\nFrom Node B", style = "filled" ]; + block5 [ label = "5\nRequested\nFrom Node B" ]; + + label = "Download Window\nBlocks Not Validated Yet" +} + +label = " \nSimulated Headers-First Download Window (Real Window Is Much Larger)" + +} diff --git a/docs/img/dev/en-headers-first-moving-window.png b/docs/img/dev/en-headers-first-moving-window.png new file mode 100644 index 0000000000000000000000000000000000000000..290d3c7081ca6c9072fb689b6cf3d7add0ffd4ea GIT binary patch literal 5651 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 BheiMZ literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-headers-first-moving-window.svg b/docs/img/dev/en-headers-first-moving-window.svg new file mode 100644 index 000000000..25d74d265 --- /dev/null +++ b/docs/img/dev/en-headers-first-moving-window.svg @@ -0,0 +1,86 @@ + + + + + + +%3 + + +Simulated Headers-First Download Window (Real Window Is Much Larger) +cluster_verified + +Downloaded And Validated + + +cluster_download_window + +Download Window +Blocks Not Validated Yet + + + +block1 + +1 +Downloaded +From Node A + + +block0->block1 + + + +block2 + +2 +Downloaded +From Node B + + +block1->block2 + + + +block3 + +3 +Requested +From Node A + + +block2->block3 + + + +block4 + +4 +Downloaded +From Node B + + +block3->block4 + + + +block5 + +5 +Requested +From Node B + + +block4->block5 + + + + +block5->block6 + + + + diff --git a/docs/img/dev/en-ibd-block.dot b/docs/img/dev/en-ibd-block.dot new file mode 100644 index 000000000..1503cf47d --- /dev/null +++ b/docs/img/dev/en-ibd-block.dot @@ -0,0 +1,49 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.5; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> block:f1 -> sync [dir="back"]; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +block [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + // Serialized block value not changed to Dash block + + + + +
Block Message
Message Header
Start String
bf0c6bbd
Command
block
Size
215
Checksum
934d270a
Payload
Serialized Block
010000006fe2...58eeac00000000
>]; + +label = "First block message sent to Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-block.png b/docs/img/dev/en-ibd-block.png new file mode 100644 index 0000000000000000000000000000000000000000..c28fa8a7012f44b3b25a1a6fa6ee9e0385b90d07 GIT binary patch literal 11595 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 D_+4LE literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ibd-block.svg b/docs/img/dev/en-ibd-block.svg new file mode 100644 index 000000000..078f05513 --- /dev/null +++ b/docs/img/dev/en-ibd-block.svg @@ -0,0 +1,56 @@ + + + + + + +%3 + +First block message sent to Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +block +Block Message +Message Header + +Start String +bf0c6bbd + +Command +block + +Size +215 + +Checksum +934d270a +Payload + +Serialized Block +010000006fe2...58eeac00000000 + + + +ibd->block:f1 + + + + +sync +Sync +Node + + +block:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-getblocks.dot b/docs/img/dev/en-ibd-getblocks.dot new file mode 100644 index 000000000..f95649cae --- /dev/null +++ b/docs/img/dev/en-ibd-getblocks.dot @@ -0,0 +1,59 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.4; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> getblocks:f1 -> sync; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +// Genesis block hash - 00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6 + +getblocks [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GetBlocks Message
Message Header
Start String
bf0c6bbd
Command
getblocks
Size
69
Checksum
f5fcbcad
Payload
Protocol Version
70208
Header Hash Count
1
Header Hashes (Highest-Height First)
b67a40f3cd5804...140b59fd0f0000
Stopping Hash (Zero Is "No Stop")
00000000000000...00000000000000
>]; + +label = "First getblocks message sent from Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-getblocks.png b/docs/img/dev/en-ibd-getblocks.png new file mode 100644 index 0000000000000000000000000000000000000000..385dd96379a793e8f9fcdc1741086377e093870e GIT binary patch literal 11968 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ibd-getblocks.svg b/docs/img/dev/en-ibd-getblocks.svg new file mode 100644 index 000000000..1ac6c973a --- /dev/null +++ b/docs/img/dev/en-ibd-getblocks.svg @@ -0,0 +1,65 @@ + + + + + + +%3 + +First getblocks message sent from Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +getblocks +GetBlocks Message +Message Header + +Start String +bf0c6bbd + +Command +getblocks + +Size +69 + +Checksum +f5fcbcad +Payload + +Protocol Version +70208 + +Header Hash Count +1 + +Header Hashes (Highest-Height First) +b67a40f3cd5804...140b59fd0f0000 + +Stopping Hash (Zero Is "No Stop") +00000000000000...00000000000000 + + + +ibd->getblocks:f1 + + + + +sync +Sync +Node + + +getblocks:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-getblocks2.dot b/docs/img/dev/en-ibd-getblocks2.dot new file mode 100644 index 000000000..b1bde6b1c --- /dev/null +++ b/docs/img/dev/en-ibd-getblocks2.dot @@ -0,0 +1,60 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.4; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> getblocks:f1 -> sync; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +// Block 500 hash - 000007248b1005ffdcf3f41f3a5630b5cb0078ca5733d931223839821f7f5faa +// Block 501 hash - 000003ad8ae16fd93d5ba05c902168b21a54855c98d1fcd5351308e0f05d59ab + +getblocks [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GetBlocks Message
Message Header
Start String
bf0c6bbd
Command
getblocks
Size
677
Checksum
52be83ef
Payload
Protocol Version
70208
Header Hash Count
20
Header Hashes (Highest-Height First)
aa5f7f1f823938...05108b24070000
ab595df0e00813...6fe18aad030000

......18 more header hashes......
Stopping Hash (Zero Is "No Stop")
00000000000000...00000000000000
>]; + +label = "Second getblocks message sent from Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-getblocks2.png b/docs/img/dev/en-ibd-getblocks2.png new file mode 100644 index 0000000000000000000000000000000000000000..93d0d0f31740e723676bc3fc5236f5ee6e0abed9 GIT binary patch literal 13574 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 + + + + + +%3 + +Second getblocks message sent from Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +getblocks +GetBlocks Message +Message Header + +Start String +bf0c6bbd + +Command +getblocks + +Size +677 + +Checksum +52be83ef +Payload + +Protocol Version +70208 + +Header Hash Count +20 + +Header Hashes (Highest-Height First) +aa5f7f1f823938...05108b24070000 +ab595df0e00813...6fe18aad030000 +......18 more header hashes...... + +Stopping Hash (Zero Is "No Stop") +00000000000000...00000000000000 + + + +ibd->getblocks:f1 + + + + +sync +Sync +Node + + +getblocks:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-getdata.dot b/docs/img/dev/en-ibd-getdata.dot new file mode 100644 index 000000000..da9ad7fd9 --- /dev/null +++ b/docs/img/dev/en-ibd-getdata.dot @@ -0,0 +1,73 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> getdata:f1 -> sync; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +getdata [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GetData Message
Message Header
Start String
bf0c6bbd
Command
getdata
Size
4609
Checksum
33e41222
Payload
Number Of Objects Requested By Inventory
128
+ + + + + + + + + + + + + + + + + + + + +
Objects Requested (Inventory Entries)
TypeUnique Identifier (For Blocks, A Header Hash)
Block434341c0ecf9a2b4...d654121dd9070000
Blockbddd99ccfda39da1...ce1e57ccaf0b0000
...............126 more inventory entries...............
+
>]; + +label = "First getdata message sent from Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-getdata.png b/docs/img/dev/en-ibd-getdata.png new file mode 100644 index 0000000000000000000000000000000000000000..01ee30040fdf93d471e59a190cf843c49506dd67 GIT binary patch literal 17126 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 aesVa94LSo7!M?ZxL0Vivto)tf$NvKk&&GQI literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ibd-getdata.svg b/docs/img/dev/en-ibd-getdata.svg new file mode 100644 index 000000000..ef6f77afe --- /dev/null +++ b/docs/img/dev/en-ibd-getdata.svg @@ -0,0 +1,65 @@ + + + + + + +%3 + +First getdata message sent from Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +getdata +GetData Message +Message Header + +Start String +bf0c6bbd + +Command +getdata + +Size +4609 + +Checksum +33e41222 +Payload + +Number Of Objects Requested By Inventory +128 + +Objects Requested (Inventory Entries) +Type +Unique Identifier (For Blocks, A Header Hash) +Block +434341c0ecf9a2b4...d654121dd9070000 +Block +bddd99ccfda39da1...ce1e57ccaf0b0000 +...............126 more inventory entries............... + + + +ibd->getdata:f1 + + + + +sync +Sync +Node + + +getdata:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-getheaders.dot b/docs/img/dev/en-ibd-getheaders.dot new file mode 100644 index 000000000..00c4a75fd --- /dev/null +++ b/docs/img/dev/en-ibd-getheaders.dot @@ -0,0 +1,57 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.4; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> getblocks:f1 -> sync; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +getblocks [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GetHeaders Message
Message Header
Start String
bf0c6bbd
Command
getheaders
Size
69
Checksum
f5fcbcad
Payload
Protocol Version
70208
Header Hash Count
1
Header Hashes (Highest-Height First)
b67a40f3cd5804...140b59fd0f0000
Stopping Hash (Zero Is "No Stop")
00000000000000...00000000000000
>]; + +label = "First getheaders message sent from Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-getheaders.png b/docs/img/dev/en-ibd-getheaders.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7da0bbc493ddb770e98c199b6bfa5474551d44 GIT binary patch literal 15877 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ibd-getheaders.svg b/docs/img/dev/en-ibd-getheaders.svg new file mode 100644 index 000000000..a2d10058d --- /dev/null +++ b/docs/img/dev/en-ibd-getheaders.svg @@ -0,0 +1,65 @@ + + + + + + +%3 + +First getheaders message sent from Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +getblocks +GetHeaders Message +Message Header + +Start String +bf0c6bbd + +Command +getheaders + +Size +69 + +Checksum +f5fcbcad +Payload + +Protocol Version +70208 + +Header Hash Count +1 + +Header Hashes (Highest-Height First) +b67a40f3cd5804...140b59fd0f0000 + +Stopping Hash (Zero Is "No Stop") +00000000000000...00000000000000 + + + +ibd->getblocks:f1 + + + + +sync +Sync +Node + + +getblocks:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-headers.dot b/docs/img/dev/en-ibd-headers.dot new file mode 100644 index 000000000..a80550be2 --- /dev/null +++ b/docs/img/dev/en-ibd-headers.dot @@ -0,0 +1,70 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> inv:f1 -> sync [ dir = "back" ]; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +inv [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Headers Message
Message Header
Start String
bf0c6bbd
Command
headers
Size
162003
Checksum
a65b2b77
Payload
Number Of Headers (Max 2,000 In Reply To GetHeaders)
2000
+ + + + + + // Block headers not updated for Dash + + + + + + + + + + + +
80-byte Block Headers + 0x00 (The Empty Tx Count)
010000006fe28cab...ff001d01e3629900
010000004860eb18...ff001d08d2bd6100
...............1,998 more block headers...............
+
>]; + +label = "First headers message reply sent to Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-headers.png b/docs/img/dev/en-ibd-headers.png new file mode 100644 index 0000000000000000000000000000000000000000..4eaf1b3170b5eae580bd405c13692bb6890b2056 GIT binary patch literal 16127 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 S`oM0q17su=#mnD--~WGv!E12< literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-ibd-headers.svg b/docs/img/dev/en-ibd-headers.svg new file mode 100644 index 000000000..f84568a99 --- /dev/null +++ b/docs/img/dev/en-ibd-headers.svg @@ -0,0 +1,61 @@ + + + + + + +%3 + +First headers message reply sent to Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +inv +Headers Message +Message Header + +Start String +bf0c6bbd + +Command +headers + +Size +162003 + +Checksum +a65b2b77 +Payload + +Number Of Headers (Max 2,000 In Reply To GetHeaders) +2000 + +80-byte Block Headers + 0x00 (The Empty Tx Count) +010000006fe28cab...ff001d01e3629900 +010000004860eb18...ff001d08d2bd6100 +...............1,998 more block headers............... + + + +ibd->inv:f1 + + + + +sync +Sync +Node + + +inv:f1->sync + + + + + diff --git a/docs/img/dev/en-ibd-inv.dot b/docs/img/dev/en-ibd-inv.dot new file mode 100644 index 000000000..fdd57e133 --- /dev/null +++ b/docs/img/dev/en-ibd-inv.dot @@ -0,0 +1,76 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans"] +graph [ penwidth = 1.75, fontname="Sans" ] + +ibd -> inv:f1 -> sync [ dir = "back" ]; + +ibd [ label = "IBD\nNode", shape="none" ]; +sync [ label = "Sync\nNode", shape="none" ]; + +// Block 1 - 000007d91d1254d60e2dd1ae580383070a4ddffa4c64c2eeb4a2f9ecc0414343 +// Block 2 - 00000bafcc571ece7c5c436f887547ef41b574e10ef7cc6937873a74ef1efeae + +inv [ shape="plaintext", label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Inv Message
Message Header
Start String
bf0c6bbd
Command
inv
Size
18003
Checksum
25173c57
Payload
Number Of Inventories (Max 500 In Reply To GetBlocks)
500
+ + + + + + + + + + + + + + + + + + + + +
Inventory Entries
TypeUnique Identifier (For Blocks, A Header Hash)
block434341c0ecf9a2b4...d654121dd9070000
blockbddd99ccfda39da1...ce1e57ccaf0b0000
...............498 more inventory entries...............
+
>]; + +label = "First inv message reply sent to Initial Blocks Download (IBD) node" +} diff --git a/docs/img/dev/en-ibd-inv.png b/docs/img/dev/en-ibd-inv.png new file mode 100644 index 0000000000000000000000000000000000000000..ba281e21bab9e96f2cdde62d75469a2852618221 GIT binary patch literal 16915 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 + + + + + +%3 + +First inv message reply sent to Initial Blocks Download (IBD) node + +ibd +IBD +Node + + +inv +Inv Message +Message Header + +Start String +bf0c6bbd + +Command +inv + +Size +18003 + +Checksum +25173c57 +Payload + +Number Of Inventories (Max 500 In Reply To GetBlocks) +500 + +Inventory Entries +Type +Unique Identifier (For Blocks, A Header Hash) +block +434341c0ecf9a2b4...d654121dd9070000 +block +bddd99ccfda39da1...ce1e57ccaf0b0000 +...............498 more inventory entries............... + + + +ibd->inv:f1 + + + + +sync +Sync +Node + + +inv:f1->sync + + + + + diff --git a/docs/img/dev/en-masternode-sync-initial-dip3.png b/docs/img/dev/en-masternode-sync-initial-dip3.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6f2bec97494d097b05340207a3cddf84f99280 GIT binary patch literal 17838 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 f3kzd{_!ayQjF`cQhc& + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sporks(getsporks) + + + + + + + + + + Governance Objects(govsync) + + + + + + + + + + + + + + + + + Governance Votes(govsync) + + + + + + + + + + + + + + Masternode Synchronization (Initial) + + + + + + + + \ No newline at end of file diff --git a/docs/img/dev/en-masternode-sync-initial.png b/docs/img/dev/en-masternode-sync-initial.png new file mode 100644 index 0000000000000000000000000000000000000000..538b23b2bd5742ee84b249e7d6b84875f78eabe5 GIT binary patch literal 35145 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�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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-masternode-sync-initial.svg b/docs/img/dev/en-masternode-sync-initial.svg new file mode 100644 index 000000000..6b2686fd9 --- /dev/null +++ b/docs/img/dev/en-masternode-sync-initial.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sporks(getsporks) + + + + + + + + + + MN List(dseg) + + + + + + + + + + + + + + + + + MN Payments(mnget) + + + + + + + + + + MN Payments(mnget) + + + + + + + + + + + + + + + + + Governance Objects(govsync) + + + + + + + + + + Governance Votes(govsync) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Masternode Synchronization (Initial) + + + + + + + + \ No newline at end of file diff --git a/docs/img/dev/en-masternode-sync-ongoing.png b/docs/img/dev/en-masternode-sync-ongoing.png new file mode 100644 index 0000000000000000000000000000000000000000..948e64a00ba84995d3a3191666ea54bdfad687ce GIT binary patch literal 130682 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 QA45^Ow@OlF5+4Hp3$8wavj6}9 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-masternode-sync-ongoing.svg b/docs/img/dev/en-masternode-sync-ongoing.svg new file mode 100644 index 000000000..72e912e98 --- /dev/null +++ b/docs/img/dev/en-masternode-sync-ongoing.svg @@ -0,0 +1,780 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Masternode Synchronization (Ongoing) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MasternodePayments + + + + + + + + + + MasternodeList + + + + + + + + + + Governance + + + + + + PaymentVotes + + + + + + + + + + + + + + + + + + + + + + mnw + + + + + + PaymentVotes + + + + + + + + mnw + + + + + + BroadcastsfromStarting MNs + + + + + + Recurring Ping(15 min) + + + + + + + + mnb + + + + + + Relayed MNBroadcasts + + + + + + Relayed MNPings + + + + + + Relayed MNVerifications + + + + + + MN ListRequests + + + + + + + + + dseg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mnb + + + + + + + + + + + + + + + + + + + mnp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mnp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mnv + + + + + + MN Pings + + + + + + + + mnp + + + + + + PaymentSync Request + + + + + + VerificationRequests + + + + + + + + + mnv + + + + + + + + mnget + + + + + + Governance SyncRequest + + + + + + Governance Object + + + + + + GovernanceObject Vote + + + + + + GovernanceObject + + + + + + + + govsync + + + + + + + + govobj + + + + + + + + govobjvote + + + + + + GovernanceVote + + + + + + + + + + + + + + + + + + + + + + govobjvote + + + + + + + + + + + + + + + + + + + + + + + govobj + + + + + + + + Relayed message (to all peers) or sync response + + + + + + + + + + + + + + + + + + + + + + + Communication with an individual peer + + + + + + + + + + + + + + Periodic send to all peers + + + + + + + + + + + + + + + + + + + + Deprecated by Deterministic Masternode Lists + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/img/dev/en-masternode-sync.odg b/docs/img/dev/en-masternode-sync.odg new file mode 100644 index 0000000000000000000000000000000000000000..9e65c5e9ffd32b6664c16a9c299a8435df100085 GIT binary patch literal 17364 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-merkle-tree-construction.dot b/docs/img/dev/en-merkle-tree-construction.dot new file mode 100644 index 000000000..32f75cea7 --- /dev/null +++ b/docs/img/dev/en-merkle-tree-construction.dot @@ -0,0 +1,42 @@ +digraph { + +size=6.25; +rankdir=TB +//splines = ortho; +ranksep = 0.2; +nodesep = 0.3; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +{ + node [ shape = "none" ]; + txids [ label = "Row 1: Transaction hashes (TXIDs)\n(A is coinbase; C can spend output from B)" ]; + row2 [ label = "Row 2: Hashes of paired TXIDs" ]; + rootrow [ label = "Merkle root" ]; + + txids -> row2 -> rootrow [ style = "invis" ]; +} + +txid_a [ label = "A" ]; +txid_b [ label = "B" ]; +txid_invis [ label = "C", style = "invis" ]; +txid_c [ label = "C" ]; + +row2_ab [ label = "H(A|B)" ]; +row2_cc [ label = "H(C|C)" ]; + +root [ label = "H(H(A|B)|H(C|C))" ]; + +txid_a -> row2_ab [ weight = 1 ]; +txid_b -> row2_ab [ weight = 1 ]; +txid_c -> row2_cc; +txid_invis -> row2_cc [ style = "invis" ]; + +row2_ab -> root; +row2_cc -> root; + + +label = "\n Example Merkle Tree Construction [Hash function H() = SHA256(SHA256())]" +} diff --git a/docs/img/dev/en-merkle-tree-construction.png b/docs/img/dev/en-merkle-tree-construction.png new file mode 100644 index 0000000000000000000000000000000000000000..11d4e42d9a53340cf509abf92e639426a0fdd48c GIT binary patch literal 6134 zcmZ8lcOaGD|9|YQ>@AzDY$03r9@m59+FX%tB$U0Akxlj$amy9T2=|ihl38S>$jB(! z>wD9u&-eTL{d1q^Irp6Rd7tFH{j0{}jVdv74c{Q#^J z*ecuu-^oBn3pk5S9%usqrfNMcb<6ux>-oWc^j5FC0yz2d2}#M~Nn_p-`jPdpaikBU zN!3&Ev{GXi?1i%$Rm2t7#F?&2d)@IDk4w`2#y`zMk0IIzq{Fo6xtD1-;v$Ni!hk*t zUoO&oYO<6Ed&!j+-=0>!^a~i#3&=e=Nky3Cw+uahdC6+LTz-cJM7mx4VTX1?fs~Ao zFithh$cj-DLDo`5_mW&~{z{+O7NwbNg?txOdy(E4^TSQUx)QVao497Sv1|o?3D6O5 zt(c{FHRudF!w4^t#8N|GJ$G|c`=QY!$ZhWKfnOIU5>n{AVfRo?QJi;mEF-Qv!brjz z1EM6hD%@F+j3kfZo-|`CVMX0t7#9i&dMR^9!YW~}LaEf1J$&GqF$oKuVK3X8lAF8Y zLoeM>w(O!syKAY^tjlJgw$TY%&rvxI4^)J#o8Rrw04RJaB+>Y=3vJ5xT^_^xY%$R5 zfap9Z2z7iTH**@(kq=B$jJaR(oF}CNOz#-8@6KjSo(_iM)geQFGVJB!3wOB-Qr#bg zIVejg1f&K=@Wz?B1gHgaM+~q-j#fi@iQ3wPa`B)GY*Pc&0W(SK3bEX1eBV3ou8Ghv znmD3(2q1QE^J;%gcRiI|{=q=~j-%r>=b#12B%1Xe>2mG!!}9KD1Y>tg_dbqYMu#zp zc&X-bP0g*nov@QMx=G$C1PM@!XXqVZFF6@iDLfQTSW0jMdgiK4JV)#2>}zR+!H-j) z^rIfmFe7_zkPFT)(E^*)m@l0|Ne)rvg`|`d;@jhs>|ytStCKVyfIjrn8S)~XD+_PD|mFJ>(P%P-YsQD;MbMihr^mgYr7Y!-d0o6 zuDe>l*oGKtVh$CzmuA>IRY9Jd9L>7W^n=6amC4$V+yGEfn@ZW<7eFUX>*GyCmx{zD zB5P*=P zE?-nkrrx$zbU0-{X{BTW(JNyf_+GR7TQ|sUiX(US;l~F*Q28~xr#hDTH9@ysQ9Ohb z(Q962lRFyO8#QroY8^VTK%ZDd1DbJ6j81vj7$ln z5(|r>5G5aLgc{5bIPD0T=4XbYZc0_QZ9KeuE318Fm~i5tP`U1?J!db{-baEWn-vW6 z{MlHFAxdE+5NTDZ80cCx3sV$3gYL`#z{mIU*W@?7$=!}h$V4sA_WbqMwcj%Ff!cU! zuK~?4+l9IyD13v*MxrcTZ@7KKo19UpuS_c^y&u14HN3a+5&NQTN@PMEPxAL|TlKsR z3hYY%0a#e_HSry7CDMbRM@qQUWm)7vujP$+i@;)L!(i^?@e_c&ztysandWm8v>kEY8|Ef3MQPTdiY8qM>E`>=Y7&^+A1qjoT6wAufhN z{;~bdQu@-ZzrK%un~(+cdsHqlh)R!9A?J2-)KBS8Pz9lQK{9Y@cbu2FY9*_kyc?eq zPe0z`8J*}y^s5X58&~rXCbh%|gK)9)RrZvK$)i?}Bdop=_On!mJQBA~#vk*P1l6bC zwrzl6G@l;R3f98)FK0i2zQ8kuSGC;G7fXYS49PaAu3Lg-~xNpiZhn37a#tM z=pt`n=?x0FX)5Gv&0%__{N~bwXNJm<`saf2ed5xVb-7qY&~`nGL)3XkNG+c+l7U&& zVdCZyZfUUiG&6-VdP6-Fj=BS(<7U63t-`Sofah|~RR44@b!y>}gln&cN~#v&kqU(t zqp#8q#dysoU1Jg;wKgOMRVO28+A5u3)_S!*sHYJ(gG4mKF|WN5e`>n8Qd@pigoBu3 z_(e}7gDxdwWG7S-e4>88?KsG|5;p9FVM~rqC&me}}q8T`Mm;VMcC+btWf#)wwPg zsba_Siu3WFsGor1!o*2_1Kaf7_1m*8N8b9!rQDly&6JR+Uk9=>KVyr6tw+C-Vz&qE zEw^keL;aj4!5lqnB*p7(&mak@+UZ=Kv=IEr@ya?WX&*NuU;E_urK#DDGf&@*@ej9t z?0_%(a_<}pR}=)V^pXy2z9Vf4k!MCuls9F4LcC>1?T2h0w+$BevZ>6?wbve@=&-jE z)`%h*)V@}do^EKfo+mR>cXgU_)sh^kr@Ay- zE=WUDR^a(uLD|onDv8njtObg)t(onO%L^1z{_M7AurTeylfd@DoNg**DbUv&^8S)2 zGty&xR(*^=b!sqR-E=l7Zbbggdp~1W+A{vS(AwU3+ze~&J+HOK?v;DR4r=*X8DQOR zNznwhhe<{nR~#*8T-QI=!dpe3Vtz)t(F5 zx=E?tlMqPTr;i+;vO4%s{G5X>PH4wDi_?GQ&UG=F92)O9A?5m^+Bqpul51{?M9~dl zmig%eobJn4~#PN)A92K zUMuLNgd{Eliwq15RBQI&SL=>yF}SsZ?W*DZ^d`pWm*MhBLc+qUCZX;qCt{?7{9B%3 z^y`dMOb}u?&88n}F9!|BI7#BFyK^j^7kMaVQDR)Jhb#FYE*Nq*KlxzVg#1w9Q_RST zd)jxX^2WC_*0s}H@8l&T(d8%_$f^;`@8cKV$3T}-msOf(ktc0OkI_i1HVAV zbVR^DHrMS!?(q)m8b>l9legGaL35RY-;of54{PI8=xFJPGvEBtdm)Abxqqm=k@`ai zOGSYv+EA>0?b55=txu6U6I!aE+!@QrwFhNX23t@u4vKMjjLaEJjzkF*uUk?5V>J5) z;rz`am7}=teu|^2U=weGjD#eI5q$uIbn~Kxle`tT+Q&>%JBD$hPS#((AJ#t>+yx(Q zEqBsv%kXAZ5cV&rYUajP*Ey1LBI9qX)j#FNhH48W%7ETw_PWW{zFZs3uXjup*Ly8$ z`)5Wu%tQ(3K6~)YSlv<)@XfB&{X|QHY$_6pyxp|h>?NlWT(UkfTbXL$7x8=D*beI{ z6yXKPX-LJ;q~Ln-k(49iN;Dn9zUQ9`ZG2%$&%_HFufz#d@+P=KdDx8*%?a3ULTU>J zPdlE7ahIN|6C6lo~6CQc3MOY;+)c5jlU1lW< zj~|rI#D>PmT$r23yy8!Up~AL51*!60Xt}bcH5LE;l6hI_EQMy(=S!k9G@U`P=EX#( z#;S%$*JmkDo*#`dSZTb-$Lqm$FKI8V5bgY9DdH&mw+ljcJmBx8iKh zzFj+&Mg;Ebvt?fNnRSSTDQM=NB^ok2qI~x>aAt=(nZ9)Hf4d$_C0|hEn$=vcR02ZD zbm&%ImgJ@O|p7E@AXaoI{2mtX$ZI&P=<9~4}o zM19vlrS<&~vpLI>&yR~6+$S;!&`Kp1cvc#}@UkQ)6~N_cvCoazOI*n53qqlb>e!`5 zZMB!9`7LK|s)6M>5XL(KOq>~YAKC;LgM%rDP9`#7V^AbW5<_4c+0Oo;aZ7HXe)C?R>)ZF=~@ zsA#VKSd;~)*=_H|>d||cKG|u?FZZ`Jd$lkL5Xt4| zC^S>3p@|>xG%HR8%O z{CT(zXE)r}%~;6n{oVwf$nejrfR9YNz1{U6znaR7Z(sVdyVu_(}5VG%RqI2llc+;F-lY zM8m8;?9F3Zcewgt?9tIpiM-EL-<8|%3hj{pv$5us?J2nL$=#UlAc$r^m5R`06Eo< z9@H^i5J#v`h~Uj8N_6hN;<+RHH`bTzTcxg%i=m#xW3b1=c<0vIfXW2 zvg+lvm^9&026h@)#QWt|!5Bten{c!_B9D^TQBjvFI<53*nfXvZmH{8+zN7;C{@Lvu z9OG}H(H7^NtT~6wIYZAO^S2SghY^1MsAv$k=~FlS`PZx&pX&M=K*uJMZm5qZ(o<3ZN@^;s>lI18uqIcsbz0-1q zyW=S-mXz(9{S0y()oHt;Jfe%J^YdFxuSo?P=;R=B zeuZPPE`Ape!Dp_`(~#(L*Ye3TJ-M={cT$9~xxl>NGx*hSNz!N8`!Tdt5oKKkgO;Z6 zH6I@^r@_LdCyJk%)YQ*2zjwFTF-bNeS*gx}LcO!hR_){4nJ}z+b(l`Y-N%z|h)_rIL#CPO@hp-aIzqx1l?0*m=Upg$opPWEB0;WUvsN za+RGwnBy$iXlsKCFx2$5deo#9#3YXYiCJnelIYHD0`wl;t9V+VGIk&D{NT7!&xg(N z3lNaME3j5HCXDlk5zNFG=d;M3Um`tnwy)ycOCMDPlT6=8XMVJn_Rl|IhlcaNuHdD) zq5VohxG^Hy!hmzF@XSP3Ems!rzGr$vC^$#wVet!la69HKOBdE9tXWwjMZXq2rD?~C zET=mo0b&MKf__|kj!Ri4)=Mv2dS%1VXUTAih7LFXM44%T4-e2>(56(H{rwWKMw;UT zRHOlvWM}iwQ(7M}*;Im=IS1{E_It^#HCqz=`tO&+#*Yi&t{Ed%pyv|Gv=IyKb!YQUe + + + + + +_anonymous_0 + + Example Merkle Tree Construction  [Hash function H() = SHA256(SHA256())] + +txids +Row 1: Transaction hashes (TXIDs) +(A is coinbase; C can spend output from B) + + +row2 +Row 2: Hashes of paired TXIDs + + + +rootrow +Merkle root + + + +txid_a + +A + + +row2_ab + +H(A|B) + + +txid_a->row2_ab + + + + +txid_b + +B + + +txid_b->row2_ab + + + + + +row2_cc + +H(C|C) + + + +txid_c + +C + + +txid_c->row2_cc + + + + +root + +H(H(A|B)|H(C|C)) + + +row2_ab->root + + + + +row2_cc->root + + + + + diff --git a/docs/img/dev/en-micropayment-channel.dot b/docs/img/dev/en-micropayment-channel.dot new file mode 100644 index 000000000..b3bb080c3 --- /dev/null +++ b/docs/img/dev/en-micropayment-channel.dot @@ -0,0 +1,54 @@ +digraph paymentchannel { +size=6.66; +rankdir=LR; +//splines = false; +nodesep = 0.1; + +edge [ fontname="Sans", minlen = 4 ]; +node [ fontname="Sans", style = invis, shape = box ]; +graph [ fontname="Sans" ] + + + +subgraph cluster_alice { + label = "Alice's Computer\n(Server)" + rank = same; + //atx2v1; + atx2v1s; + atx1v2 [ label = "Bond\n(2-of-2\nmultisig)", style = unfilled, bgcolor = grey ]; + + //atx2v2; + atx2v3 [ label = " \n \n "]; + atx2v4; + atx2v5 [ label = "Refund v45\nBob: 66\n Alice: 44\n(No Lock)", style = unfilled, bgcolor = grey ]; + +} + +subgraph cluster_bob { + label = "Bob's Computer\n(Client)" + rank = same; + btx2v1 [ label = "Refund v1\nBob: 100\nAlice: 0\n(Locktime)", style = unfilled, bgcolor = grey ]; + //btx2v1s; + btx1v2 [label = " \n \n \n "]; + + btx2v2s; + btx2v3; + btx2v4 [ label = " \n \n \n "]; + btx2v5; +} + +btx2v1 -> atx2v1s [ label = "B: Please sign refund version 1,\nwhich is a full refund of the bond\nthat can't be spent for 24 hours" ]; +atx2v1s -> btx1v2 [ style = dashed, label = "A: Signed; please send me the bond to\nprove you funded the account" ]; +btx1v2 -> atx1v2 [ label = "B: Here's the bond; please start working" ]; +atx1v2 -> btx2v2s [ style = dashed, label = "A: Some work done; please sign refund v2\nreducing your refund by 1 mDASH" ]; +btx2v2s -> atx2v3 [ label = "B: Signed; refund now pays Bob: 99; Alice: 1" ]; +atx2v3 -> btx2v3 [ style = dashed, label = "A: More work done; please sign v3\nreducing your refund by another 1 mDASH" ]; +btx2v3 -> atx2v4 [ label = "B: Signed; refund now pays Bob: 98; Alice: 2" ]; +atx2v4 -> btx2v4 [ style = dashed, label = "A: [...]" ]; +btx2v4 -> atx2v5 [ label = "B: [...]" ]; + +atx2v5 -> btx2v5 [ style = dashed, label = "A: I'm done for the day. I'm\ngoing to broadcast refund v45" ]; + + +label = " \n \nAlice broadcasts the bond to the Dash network immediately.\nShe broadcasts the final version of the refund when she finishes work\nor before the locktime. If she fails to broadcast before refund v1's time lock\nexpires, Bob can broadcast refund v1 to get a full refund.\n \nDash Micropayment Channels" +} diff --git a/docs/img/dev/en-micropayment-channel.png b/docs/img/dev/en-micropayment-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8d3dbb11bf54ed264177460a29bf6a1e1f0a1e GIT binary patch literal 53198 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 W15w+TL@5FUDjiJ&jUsis;Qs-dYVN}T literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-micropayment-channel.svg b/docs/img/dev/en-micropayment-channel.svg new file mode 100644 index 000000000..c3cbaec95 --- /dev/null +++ b/docs/img/dev/en-micropayment-channel.svg @@ -0,0 +1,128 @@ + + + + + + +paymentchannel + + + +Alice broadcasts the bond to the Dash network immediately. +She broadcasts the final version of the refund when she finishes work +or before the locktime.  If she fails to broadcast before refund v1's time lock +expires, Bob can broadcast refund v1 to get a full refund. + +Dash Micropayment Channels +cluster_alice + +Alice's Computer +(Server) + +cluster_bob + +Bob's Computer +(Client) + + + + +atx2v1s->btx1v2 + + +A: Signed; please send me the bond to +prove you funded the account + + +atx1v2 + +Bond +(2-of-2 +multisig) + + + +atx1v2->btx2v2s + + +A: Some work done; please sign refund v2 +reducing your refund by 1 mDASH + + + + +atx2v3->btx2v3 + + +A: More work done; please sign v3 +reducing your refund by another 1 mDASH + + + + +atx2v4->btx2v4 + + +A: [...] + + +atx2v5 + +Refund v45 +Bob: 66 + Alice: 44 +(No Lock) + + + +atx2v5->btx2v5 + + +A: I'm done for the day.  I'm +going to broadcast refund v45 + + +btx2v1 + +Refund v1 +Bob: 100 +Alice: 0 +(Locktime) + + +btx2v1->atx2v1s + + +B: Please sign refund version 1, +which is a full refund of the bond +that can't be spent for 24 hours + + +btx1v2->atx1v2 + + +B: Here's the bond; please start working + + +btx2v2s->atx2v3 + + +B: Signed; refund now pays Bob: 99; Alice: 1 + + +btx2v3->atx2v4 + + +B: Signed; refund now pays Bob: 98; Alice: 2 + + +btx2v4->atx2v5 + + +B: [...] + + + diff --git a/docs/img/dev/en-nbits-overview.dot b/docs/img/dev/en-nbits-overview.dot new file mode 100644 index 000000000..b6023babd --- /dev/null +++ b/docs/img/dev/en-nbits-overview.dot @@ -0,0 +1,29 @@ +digraph { + +size=6.25; +rankdir=TB +//splines = ortho; +ranksep = 0.0; +nodesep = 0.0; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "none", fontname="Sans", width = 0, height = 0] +graph [ penwidth = 0, fontname="Sans" ] + +nbits [ label = "0x181bc330 → \n \nnBits In\nBig-Endian\nOrder" ]; + +significand [ label = "0x1bc330\n \nSignificand\n(Mantissa)\n " ]; +times [ label = "*\n \n \n \n " ]; + +base [ label = "256\n \nBase\n \n " ]; +exp [ label = "^\n \n \n \n " ]; +exponent [ label = "(0x18\n \nExponent\n \n " ]; +minus [ label = "-\n \n \n \n " ]; +negative [ label = "3)\n \nBytes\nIn\nSignificand" ]; + +base -> result [ style = "invis" ]; + +result [ label = "Result: 0x1bc330000000000000000000000000000000000000000000 " ]; + +label = "Converting nBits Into A Target Threshold" +} diff --git a/docs/img/dev/en-nbits-overview.png b/docs/img/dev/en-nbits-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..1274195757b679b517f7535e412acace0030c62c GIT binary patch literal 5443 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-nbits-overview.svg b/docs/img/dev/en-nbits-overview.svg new file mode 100644 index 000000000..1dc577aa8 --- /dev/null +++ b/docs/img/dev/en-nbits-overview.svg @@ -0,0 +1,83 @@ + + + + + + +_anonymous_0 + +Converting nBits Into A Target Threshold + +nbits +0x181bc330 → + +nBits In +Big-Endian +Order + + +significand +0x1bc330 + +Significand +(Mantissa) + + + +times +* + + + + + + +base +256 + +Base + + + + +result +Result: 0x1bc330000000000000000000000000000000000000000000 + + + +exp +^ + + + + + + +exponent +(0x18 + +Exponent + + + + +minus +- + + + + + + +negative +3) + +Bytes +In +Significand + + + diff --git a/docs/img/dev/en-nbits-quick-parse.dot b/docs/img/dev/en-nbits-quick-parse.dot new file mode 100644 index 000000000..425ade01b --- /dev/null +++ b/docs/img/dev/en-nbits-quick-parse.dot @@ -0,0 +1,122 @@ +digraph { + +size=6.25; +rankdir=TB +//splines = ortho; +ranksep = 0.0; +nodesep = 0.0; + +edge [ penwidth = 1.75, fontname="Sans", style = "invis" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", fontsize = 60, width = 1.3, height = 1.3 ] +graph [ penwidth = 0, fontname="Sans", fontsize = 60 ] + +byte_length [ label = "Byte Length: 0x18 (Decimal 24)", shape = "none" ] + + +subgraph cluster_n { +node [ label = "0" ]; + n24; + n23; + n22; + n21; + n20; + n19; + n18; + n17; + n16; + n15; + n14; + n13; + n12; + n11; + n10; + n9; + n8; + n7; + n6; + n5; + n4; + n1 [ label = "" ]; + n2 [ label = "" ]; + n3 [ label = "" ]; +} + + + +subgraph cluster_l { +node [ shape = "none" ]; +l1 [ label = "1" ]; +l2 [ label = "2" ]; +l3 [ label = "3" ]; +l4 [ label = "4" ]; +l5 [ label = "5" ]; +l6 [ label = "6" ]; +l7 [ label = "7" ]; +l8 [ label = "8" ]; +l9 [ label = "9" ]; +l10 [ label = "10" ]; +l11 [ label = "11" ]; +l12 [ label = "12" ]; +l13 [ label = "13" ]; +l14 [ label = "14" ]; +l15 [ label = "15" ]; +l16 [ label = "16" ]; +l17 [ label = "17" ]; +l18 [ label = "18" ]; +l19 [ label = "19" ]; +l20 [ label = "20" ]; +l21 [ label = "21" ]; +l22 [ label = "22" ]; +l23 [ label = "23" ]; +l24 [ label = "24" ]; +} + +l1 -> n1; +l2 -> n2; +l3 -> n3; +l4 -> n4; +l5 -> n5; +l6 -> n6; +l7 -> n7; +l8 -> n8; +l9 -> n9; +l10 -> n10; +l11 -> n11; +l12 -> n12; +l13 -> n13; +l14 -> n14; +l15 -> n15; +l16 -> n16; +l17 -> n17; +l18 -> n18; +l19 -> n19; +l20 -> n20; +l21 -> n21; +l22 -> n22; +l23 -> n23; +l24 -> n24; + +subgraph cluster_s { + node [ shape = "none" ]; + edge [ style = "", dir="back", arrowsize = 3, minlen = 4 ]; + + + significand [ label = "Most Significant Bytes (Significand)" ]; + s3 [ label = "30" ]; + s2 [ label = "c3" ]; + s1 [ label = "1b" ]; + + n1 -> s1; + n2 -> s2; + n3 -> s3; +} + + + + + + +byte_length -> l19; + +label = " \nQuickly Converting nBits 0x181bc330 Into The Target\nThreshold 0x1bc330000000000000000000000000000000" +} diff --git a/docs/img/dev/en-nbits-quick-parse.png b/docs/img/dev/en-nbits-quick-parse.png new file mode 100644 index 0000000000000000000000000000000000000000..517d508bed2abefd096b4e6162cb2631c0d0fc5b GIT binary patch literal 7053 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 XnKW+c8oLl(|7TNG1OdwwpuztE25wKI literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-nbits-quick-parse.svg b/docs/img/dev/en-nbits-quick-parse.svg new file mode 100644 index 000000000..e5e0f08f4 --- /dev/null +++ b/docs/img/dev/en-nbits-quick-parse.svg @@ -0,0 +1,298 @@ + + + + + + +_anonymous_0 + + +Quickly Converting nBits 0x181bc330 Into The Target +Threshold 0x1bc330000000000000000000000000000000 +cluster_n + + +cluster_l + + +cluster_s + + + +byte_length +Byte Length: 0x18 (Decimal 24) + + +l19 +19 + + + +n24 + +0 + + +n23 + +0 + + +n22 + +0 + + +n21 + +0 + + +n20 + +0 + + +n19 + +0 + + +n18 + +0 + + +n17 + +0 + + +n16 + +0 + + +n15 + +0 + + +n14 + +0 + + +n13 + +0 + + +n12 + +0 + + +n11 + +0 + + +n10 + +0 + + +n9 + +0 + + +n8 + +0 + + +n7 + +0 + + +n6 + +0 + + +n5 + +0 + + +n4 + +0 + + +n1 + + + +s1 +1b + + +n1->s1 + + + + +n2 + + + +s2 +c3 + + +n2->s2 + + + + +n3 + + + +s3 +30 + + +n3->s3 + + + + +l1 +1 + + + +l2 +2 + + + +l3 +3 + + + +l4 +4 + + + +l5 +5 + + + +l6 +6 + + + +l7 +7 + + + +l8 +8 + + + +l9 +9 + + + +l10 +10 + + + +l11 +11 + + + +l12 +12 + + + +l13 +13 + + + +l14 +14 + + + +l15 +15 + + + +l16 +16 + + + +l17 +17 + + + +l18 +18 + + + + +l20 +20 + + + +l21 +21 + + + +l22 +22 + + + +l23 +23 + + + +l24 +24 + + + +significand +Most Significant Bytes (Significand) + + + diff --git a/docs/img/dev/en-orphan-stale-definition.dot b/docs/img/dev/en-orphan-stale-definition.dot new file mode 100644 index 000000000..6de8537c3 --- /dev/null +++ b/docs/img/dev/en-orphan-stale-definition.dot @@ -0,0 +1,43 @@ +digraph { +// This file is licensed under the MIT License (MIT) available on +// http://opensource.org/licenses/MIT. + +size=6.25; +rankdir=LR +splines = "false"; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +subgraph cluster_mainchain { +block0 [ label = "1\n←Parent: 0" ]; +block1 [ label = "2\n←Parent: 1" ]; +block2 [ label = "3\n←Parent: 2" ]; + +style = "invis"; +} + +block0 -> block1 -> block2; + +block0 -> block1_1; + +block2 -> block5 [ style = "invis", minlen = 4 ]; + + +block1_1 [ label = "2 (Stale)\n←Parent: 1", style = "filled" ]; + +block5 [ label = "5 (Orphan)\n←Parent: 4", style = "filled" ]; + +subgraph cluster_toplabel { + node [ style = "invis", height = 0, width = 0, label = "" ]; + graph [ penwidth = 0 ]; + a -> b -> c -> d -> e -> f -> g [ style = "invis" ]; + label = "Orphan blocks have no known parent, so they can't be validated" +} + +label = " \nStale blocks are valid but not part of the best block chain" + +} diff --git a/docs/img/dev/en-orphan-stale-definition.png b/docs/img/dev/en-orphan-stale-definition.png new file mode 100644 index 0000000000000000000000000000000000000000..f84ca701f489b7ce88103aa7818eae0b4c2cb5b2 GIT binary patch literal 6635 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 IMM&^}0egO?IRF3v literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-orphan-stale-definition.svg b/docs/img/dev/en-orphan-stale-definition.svg new file mode 100644 index 000000000..dab784ff5 --- /dev/null +++ b/docs/img/dev/en-orphan-stale-definition.svg @@ -0,0 +1,80 @@ + + + + + + +_anonymous_0 + + +Stale blocks are valid but not part of the best block chain +cluster_mainchain + +cluster_toplabel + +Orphan blocks have no known parent, so they can't be validated + + +block0 + +1 +←Parent: 0 + + +block1 + +2 +←Parent: 1 + + +block0->block1 + + + + +block1_1 + +2 (Stale) +←Parent: 1 + + +block0->block1_1 + + + + +block2 + +3 +←Parent: 2 + + +block1->block2 + + + + +block5 + +5 (Orphan) +←Parent: 4 + + + + + + + + + + + + + + + + + diff --git a/docs/img/dev/en-p2p-control-messages.dot b/docs/img/dev/en-p2p-control-messages.dot new file mode 100644 index 000000000..2c9e41c10 --- /dev/null +++ b/docs/img/dev/en-p2p-control-messages.dot @@ -0,0 +1,29 @@ +digraph { + +size="6.25"; +rankdir=TB +nodesep=0.2; +ranksep=0.3; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +version -> verack; +ping -> pong; +getaddr -> addr; + +filterload -> filteradd; +filterload -> filterclear; +alert; +sendheaders; + +ERROR [ style = "invis" ]; +ERROR -> reject [ style = "invis" ]; + +sendcmpct; + +label = " \nOverview Of P2P Protocol Control And Advisory Messages" + +} diff --git a/docs/img/dev/en-p2p-control-messages.png b/docs/img/dev/en-p2p-control-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..8443f697c6b6e66f45218f8bb511a15223dcfb6a GIT binary patch literal 8533 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 + + + + + +%3 + + +Overview Of P2P Protocol Control And Advisory Messages + +version + +version + + +verack + +verack + + +version->verack + + + +ping + +ping + + +pong + +pong + + +ping->pong + + + +getaddr + +getaddr + + +addr + +addr + + +getaddr->addr + + + +filterload + +filterload + + +filteradd + +filteradd + + +filterload->filteradd + + + +filterclear + +filterclear + + +filterload->filterclear + + + +alert + +alert + + +sendheaders + +sendheaders + + + +reject + +reject + + + +sendcmpct + +sendcmpct + + + diff --git a/docs/img/dev/en-p2p-data-messages.dot b/docs/img/dev/en-p2p-data-messages.dot new file mode 100644 index 000000000..72e090ac6 --- /dev/null +++ b/docs/img/dev/en-p2p-data-messages.dot @@ -0,0 +1,39 @@ +digraph { + +size="6.25"; +rankdir=LR +nodesep=0.05; +ranksep=0.1; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +getmnlistd -> mnlistdiff [ minlen = 3 ]; +getblocktxn -> blocktxn [ minlen = 3 ]; + +getblocks -> inv; +mempool -> inv; + +inv -> getdata; + +getdata -> tx; +getdata -> block; +getdata -> merkleblock; +getdata -> notfound; + +getheaders -> headers [ minlen = 3 ]; + +{ + node [ shape = "none" ]; + label1 [ label = "Request For Help\nGetting Up To Date" ]; + label2 [ label = "Reply With\nInventory" ]; + label3 [ label = "Request For Specific Data" ]; + label4 [ label = "Reply With\nRequested Data" ]; + + label1 -> label2 -> label3 -> label4 [style = "invis" ]; +} + +label = "Overview Of P2P Protocol Data Request And Reply Messages" +} diff --git a/docs/img/dev/en-p2p-data-messages.png b/docs/img/dev/en-p2p-data-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..9b511c8d4184c71c93621242ed1bd8f7f3207ab0 GIT binary patch literal 22625 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-p2p-data-messages.svg b/docs/img/dev/en-p2p-data-messages.svg new file mode 100644 index 000000000..38ba1556d --- /dev/null +++ b/docs/img/dev/en-p2p-data-messages.svg @@ -0,0 +1,146 @@ + + + + + + +%3 + +Overview Of P2P Protocol Data Request And Reply Messages + +getmnlistd + +getmnlistd + + +mnlistdiff + +mnlistdiff + + +getmnlistd->mnlistdiff + + + +getblocktxn + +getblocktxn + + +blocktxn + +blocktxn + + +getblocktxn->blocktxn + + + +getblocks + +getblocks + + +inv + +inv + + +getblocks->inv + + + +getdata + +getdata + + +inv->getdata + + + +mempool + +mempool + + +mempool->inv + + + +tx + +tx + + +getdata->tx + + + +block + +block + + +getdata->block + + + +merkleblock + +merkleblock + + +getdata->merkleblock + + + +notfound + +notfound + + +getdata->notfound + + + +getheaders + +getheaders + + +headers + +headers + + +getheaders->headers + + + +label1 +Request For Help +Getting Up To Date + + +label2 +Reply With +Inventory + + + +label3 +Request For Specific Data + + + +label4 +Reply With +Requested Data + + + + diff --git a/docs/img/dev/en-p2p-governance-messages.dot b/docs/img/dev/en-p2p-governance-messages.dot new file mode 100644 index 000000000..e8d28513d --- /dev/null +++ b/docs/img/dev/en-p2p-governance-messages.dot @@ -0,0 +1,34 @@ +digraph { + +size="6.25"; +rankdir=LR +nodesep=0.05; +ranksep=0.1; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +"govsync" -> "ssc (govobj)\ninv (govobj)"; +govsync -> "ssc (govobjvote)\ninv (govobjvote)"; + +"ssc (govobj)\ninv (govobj)" -> getdata; +"ssc (govobjvote)\ninv (govobjvote)" -> getdata; + +getdata -> govobj; +getdata -> govobjvote; + + +{ + node [ shape = "none" ]; + label1 [ label = "Request For Help\nGetting Up To Date" ]; + label2 [ label = "Reply With\nCount/Inventory" ]; + label3 [ label = "Request For\nSpecific Data" ]; + label4 [ label = "Reply With\nRequested Data" ]; + + label1 -> label2 -> label3 -> label4 [style = "invis" ]; +} + +label = "Overview Of P2P Protocol Governance Request and Reply Messages" +} diff --git a/docs/img/dev/en-p2p-governance-messages.png b/docs/img/dev/en-p2p-governance-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..45b72386d6044d33727c400af1ced580a5f5fead GIT binary patch literal 21628 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 + + + + + +%3 + +Overview Of P2P Protocol Governance Request and Reply Messages + +govsync + +govsync + + +ssc (govobj)\ninv (govobj) + +ssc (govobj) +inv (govobj) + + +govsync->ssc (govobj)\ninv (govobj) + + + +ssc (govobjvote)\ninv (govobjvote) + +ssc (govobjvote) +inv (govobjvote) + + +govsync->ssc (govobjvote)\ninv (govobjvote) + + + +getdata + +getdata + + +ssc (govobj)\ninv (govobj)->getdata + + + +ssc (govobjvote)\ninv (govobjvote)->getdata + + + +govobj + +govobj + + +getdata->govobj + + + +govobjvote + +govobjvote + + +getdata->govobjvote + + + +label1 +Request For Help +Getting Up To Date + + +label2 +Reply With +Count/Inventory + + + +label3 +Request For +Specific Data + + + +label4 +Reply With +Requested Data + + + + diff --git a/docs/img/dev/en-p2p-instantsend-messages.dot b/docs/img/dev/en-p2p-instantsend-messages.dot new file mode 100644 index 000000000..37dfda53e --- /dev/null +++ b/docs/img/dev/en-p2p-instantsend-messages.dot @@ -0,0 +1,28 @@ +digraph { + +size="6.25"; +rankdir=LR +nodesep=0.05; +ranksep=0.1; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +ix -> "inv (txlvote)"; +"inv (txlvote)" -> getdata; +getdata -> txlvote; + +{ + node [ shape = "none" ]; + label1 [ label = "Client Requests\nTransaction Lock" ]; + label2 [ label = "Masternodes Reply\nWith Inventory" ]; + label3 [ label = "Request For\nMasternode Vote" ]; + label4 [ label = "Reply With\nRequested Vote" ]; + + label1 -> label2 -> label3 -> label4 [style = "invis" ]; +} + +label = "Overview Of P2P Protocol InstantSend Request And Reply Messages" +} diff --git a/docs/img/dev/en-p2p-instantsend-messages.png b/docs/img/dev/en-p2p-instantsend-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..f32d5531f4d9221a88a29a3684f15132cdf1c7e1 GIT binary patch literal 10657 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-p2p-instantsend-messages.svg b/docs/img/dev/en-p2p-instantsend-messages.svg new file mode 100644 index 000000000..83f480646 --- /dev/null +++ b/docs/img/dev/en-p2p-instantsend-messages.svg @@ -0,0 +1,69 @@ + + + + + + +%3 + +Overview Of P2P Protocol InstantSend Request And Reply Messages + +ix + +ix + + +inv (txlvote) + +inv (txlvote) + + +ix->inv (txlvote) + + + +getdata + +getdata + + +inv (txlvote)->getdata + + + +txlvote + +txlvote + + +getdata->txlvote + + + +label1 +Client Requests +Transaction Lock + + +label2 +Masternodes Reply +With Inventory + + + +label3 +Request For +Masternode Vote + + + +label4 +Reply With +Requested Vote + + + + diff --git a/docs/img/dev/en-p2p-masternode-messages.dot b/docs/img/dev/en-p2p-masternode-messages.dot new file mode 100644 index 000000000..8873c01bb --- /dev/null +++ b/docs/img/dev/en-p2p-masternode-messages.dot @@ -0,0 +1,41 @@ +digraph { + +size="6.25"; +rankdir=LR +nodesep=0.05; +ranksep=0.1; +splines="false" + +edge [ penwidth = 1.75, fontname="Sans", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +// MN List +dseg -> "ssc (mnb)\ninv (mnb)"; +dseg -> "ssc (mnp)\ninv (mnp)"; + +"ssc (mnb)\ninv (mnb)" -> getdata; +"ssc (mnp)\ninv (mnp)" -> getdata; + +getdata -> mnb; +getdata -> mnp; + +// MN Payments +mnget -> "ssc (mnget)\ninv (mnw)"; + +"ssc (mnget)\ninv (mnw)" -> getdata; + +getdata -> mnw; + +{ + node [ shape = "none" ]; + label1 [ label = "Request For Help\nGetting Up To Date" ]; + label2 [ label = "Reply With\nCount/Inventory" ]; + label3 [ label = "Request For\nSpecific Data" ]; + label4 [ label = "Reply With\nRequested Data" ]; + + label1 -> label2 -> label3 -> label4 [style = "invis" ]; +} + +label = "Overview Of P2P Protocol Masternode Request and Reply Messages" +} diff --git a/docs/img/dev/en-p2p-masternode-messages.png b/docs/img/dev/en-p2p-masternode-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..5aec56fa8a258e7ed4647b01a2df03abfaa43889 GIT binary patch literal 20144 zcmchVQLimZ%`B72lkl4O-VG8;q*B|;?< zm2B7Z==^@~-+g_r-{Zco>!0g5&xcexj?d>kUa#kReioTgW)oxk4aI%h4+zFXD3W4?iuM8u#(}&K5i*6&|S%@I4o44 z%oNI~)v&2)bv=1Db)-i02z|U3{fo~f-L+mX6#sM&%U19E^C34VN04+ugsV&^ikL{> z5QNFpsqo7-hXy**-&|$A7=m9KvbL~s;aACm|DV6U5zW)LxbyPm%P(HMh=_>TyLYej zjr+&;lgA|)NA&WE<+`$P48-@ z=$V_xa2)nq{Lzshu#@9(i+*Qk=iQU(!c!gxeA~H?yPqMF)w1Z`cFeQ8qW-Mp==uG( zpFUlQU=Wy}pSKa&t)nDZZ;Br`F*3TwaWgTIW%q8TUAsOBRXV>P`_?`6$C4>z{@bQs zG!t)+JztKgsiT|UKJfGBPenz=OP4Nv^;n+!)E04CX?-y_A%P+KsJpAHhPHOwx)9a6 z1+5kxUs*-PK~d4}&d%efPQ4u(S{bf(uhJ^CNXpC4mzS4+ZNLBAxz8N_i$Mj3Mn-R{ zTt8jEe*N*|$9ZvDADFpWSy{h+{VFalzMu7ZN5|Lkjs(3^`A*?JmEmWDG!ppF)Og=W z?(OZhwzGRSdXb#w=h{6nA)$8C@)s=9ri_Z{A2r zNfj3tk3TvcbT*Y4<6ul zwHRDYgp0IJo{ULPKXd;4*P%)mO-;?2>FN2OKj-wX?c^{wF&XUX;VLv%NY4{%ai=49 zy?BvxaH=y&WbNSbtv8mPxk?G*KYQxiC(Rzeq()T zaPUc4+3VikM`dLUYCYGkZ4nR<(Cy6SejpmmiOaZi=Z=|pWntm@(WcOzo*wIWp$=KQ z5`J0psYI{rDBr7Y7ZVpA9sNA@kjszZh6ZKks8Eg%wZ3oL+9+2PedcXeJ&C&e4;?zy zEl%WqJupy}ogK95;c60;DeXGeGCXWnV~o4Y%;fOzEHu$lY15|V z3yJjHzu&7`ljUUB)YjfBDtb7ACFAMo8OyFnf2Vt6_2ovIQUJSJPkem5&(FzhK{>DQ zX4AWGq@*mpJD0gtSmM_qskz3hl#5pG?q${0)dhn|)L&XVV_E;~b&!v_t{!40e(2Dl zw|#xT!Z`dJ+{Hvi7awHayvcmi*3NF>twq2nU#XOg@X=k|H&T+5?X9dz-6lHq^G~iV zea=+X7I2~9xO?|5+m5h;yuv~u|IVjgvv~|r`3a9hXWxvLC8eaCRyv_~Jg?65n5gpp zzEGN7%wi@XYlpqQr`6XhMM&qLOplC;I-OP$qW#9nO;3D+}Enad+RBVQy&HdWs@K ziyQC2&(ALy>EP&CAFyHGYhwCFKBD;tUinl{rmUt+@sM=q;0VNt)xDNMJm|LC;L#+po}Wx z<7iJzIO^yDK>Jq>Ny+`M@+Ihh63fi-$^bQC*4 z$T(CmB{VdYjEoFLi)>3&o2YJnCs_X^+dx)6>#o*cF9e z2(8`Zx*O#{lgZQ4f6>E3!GG1e-cUq9Z$yljnKsd9@rM;_^ukpCJ^$abSC${g#GF)7 zAk_BafC70k%68ei$WdhJ?oVIFUwE$<^`J-uEO zBWY>r@gjOo#;Q|E+rP+<+v^t-2<;hYCP%_{ysr<)bWkHGx3Z*Np=9IAa<;d(9~c<0 zv9Z~<=iqgRGX&)%md95pKUkulqQ8d!N575OYh`HIk2Qtf`TN(eU%!8=UuP-x_^LN{ zaD1~mdv?(l`n|VGY6SCWt?li=qqui(diIg9qeNn2 zVxmq?$4jM+>B-4!f);W6Ch|*4W?Lc{68KL%s;IczV~8<>PG- zYa)-a)|ZHQ2fj1?n@cpO+~*iJ)>meimzObKF>JE&Hn+S^_lq2itNSz|8UbXO1ZUru`(Nvc@E{R+g!Bfh5>vORI
n)$aMVsGj$}p|y_$Y}A&N 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 + + + + + +%3 + +Overview Of P2P Protocol Masternode Request and Reply Messages + +dseg + +dseg + + +ssc (mnb)\ninv (mnb) + +ssc (mnb) +inv (mnb) + + +dseg->ssc (mnb)\ninv (mnb) + + + +ssc (mnp)\ninv (mnp) + +ssc (mnp) +inv (mnp) + + +dseg->ssc (mnp)\ninv (mnp) + + + +getdata + +getdata + + +ssc (mnb)\ninv (mnb)->getdata + + + +ssc (mnp)\ninv (mnp)->getdata + + + +mnb + +mnb + + +getdata->mnb + + + +mnp + +mnp + + +getdata->mnp + + + +mnw + +mnw + + +getdata->mnw + + + +mnget + +mnget + + +ssc (mnget)\ninv (mnw) + +ssc (mnget) +inv (mnw) + + +mnget->ssc (mnget)\ninv (mnw) + + + +ssc (mnget)\ninv (mnw)->getdata + + + +label1 +Request For Help +Getting Up To Date + + +label2 +Reply With +Count/Inventory + + + +label3 +Request For +Specific Data + + + +label4 +Reply With +Requested Data + + + + diff --git a/docs/img/dev/en-p2p-privatesend-messages.dot b/docs/img/dev/en-p2p-privatesend-messages.dot new file mode 100644 index 000000000..2edeae183 --- /dev/null +++ b/docs/img/dev/en-p2p-privatesend-messages.dot @@ -0,0 +1,33 @@ +digraph { + +size="6.25"; +rankdir=LR +//nodesep=0.05; +//ranksep=0.1; +//splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] //,style="dashed", dir="none" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans" ] + +"Node" -> Masternode [ label="1. dsa", style="dashed" ]; +Masternode -> "Node" [ label="2. dsq" ]; +"Node" -> Masternode [ label="3. dsi", style="dashed" ]; +Masternode -> "Node" [ label="4. dsf" ]; +"Node" -> Masternode [ label="5. dss", style="dashed" ]; +Masternode -> "Node" [ label="6. dsc" ]; + +// Relay to network +Masternode -> "Network" [ label="7. dstx" ]; + +{ + node [ shape = "none" ]; + label1 [ label = "PrivateSend\nClients" ]; + label2 [ label = "Selected Mixing\nNode" ]; + label3 [ label = "Transaction\nBroadcast" ]; + + label1 -> label2 -> label3 [style = "invis" ]; +} + +label = "Overview Of P2P Protocol PrivateSend Request and Reply Messages" +} diff --git a/docs/img/dev/en-p2p-privatesend-messages.png b/docs/img/dev/en-p2p-privatesend-messages.png new file mode 100644 index 0000000000000000000000000000000000000000..5b13cff298c4087ad6f06a024ea04d6021265999 GIT binary patch literal 26006 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-p2p-privatesend-messages.svg b/docs/img/dev/en-p2p-privatesend-messages.svg new file mode 100644 index 000000000..dfb96304a --- /dev/null +++ b/docs/img/dev/en-p2p-privatesend-messages.svg @@ -0,0 +1,88 @@ + + + + + + +%3 + +Overview Of P2P Protocol PrivateSend Request and Reply Messages + +Node + +Node + + +Masternode + +Masternode + + +Node->Masternode + + +1. dsa + + +Node->Masternode + + +3. dsi + + +Node->Masternode + + +5. dss + + +Masternode->Node + + +2. dsq + + +Masternode->Node + + +4. dsf + + +Masternode->Node + + +6. dsc + + +Network + +Network + + +Masternode->Network + + +7. dstx + + +label1 +PrivateSend +Clients + + +label2 +Selected Mixing +Node + + + +label3 +Transaction +Broadcast + + + + diff --git a/docs/img/dev/en-p2pkh-stack.dot b/docs/img/dev/en-p2pkh-stack.dot new file mode 100644 index 000000000..4fd184f32 --- /dev/null +++ b/docs/img/dev/en-p2pkh-stack.dot @@ -0,0 +1,146 @@ +digraph blockchain { + +size=6.25; +splines = "false"; +//rankdir=LR; +//ranksep=0.1; +//splines=ortho; + +node [ fontname="Sans", shape = box ]; +edge [ fontname="Sans", style = invis, minlen = 1 ]; +graph [ fontname="Sans" ]; +//fixedsize +nodesep = 0.05; +//concentrate = true; + +subgraph cluster_alice { + bgcolor = grey; + alice_opchecksig [ label = "CHECKSIG" ]; + alice_opequalverify [ label = "OP_EQUALVERIFY" ]; + alice_pubkeyhash [ label = "Pk Hash", shape = "" ]; + alice_ophash [ label = "OP_HASH160" ]; + alice_opdup [ label = "OP_DUP" ]; + alice_pubkey [style = invis, label="PubKey", shape = "" ]; + alice_sig [style = invis, label="Sig", shape = "" ]; + + label = "Instructions And Data Provided By Alice In Transaction #1's Pubkey Script" + /* label = "Data Provided By Spender 1 To Spend Output" */ +} + +subgraph cluster_bob { + bgcolor = grey; + bob_opchecksig [ label = "CHECKSIG", style = invis ]; + bob_opequalverify [ label = "OP_EQUALVERIFY", style = invis ]; + bob_pubkeyhash [ label = "Pk Hash", style = invis, shape = "" ]; + bob_ophash [ label = "OP_HASH160", style = invis ]; + bob_opdup [ label = "OP_DUP", style = invis ]; + bob_pubkey [style = unfilled, label="PubKey", shape = "" ]; + bob_sig [style = unfilled, label="Sig", shape = "" ]; + + label = "Data Provided By Bob In Transaction #2's Input Signature Script" +} + +alice_sig -> bob_sig; +alice_pubkey -> bob_pubkey; +alice_opdup -> bob_opdup; +alice_ophash -> bob_ophash; +alice_pubkeyhash -> bob_pubkeyhash; +alice_opequalverify -> bob_opequalverify; +alice_opchecksig -> bob_opchecksig; + +subgraph invis { + node [ style = invis, label="", width=0, height=0 ]; + invis0_0; + invis0_1; + invis0_2; + invis0_3; + + invis1_0; + invis1_1; + invis1_2; + + invis2_0; + invis2_1; + + invis3_0; + + invis4_0; + + invis5_0; + invis5_1; + + invis6_0; + invis6_1; + invis6_2; + invis6_3; + invis6_4; + invis6_5; + invis6_6; +} + stack7_opchecksig [style = filled, label="OP_CHECKSIG" ]; + stack7_pubkey [style = filled, label="PubKey", shape = "" ]; + stack7_sig [style = filled, label="Sig", shape = "" ]; + + stack6_opequalverify [style = filled, label="OP_EQUALVERIFY" ]; + stack6_pubkeyhash [style = filled, label="Pk Hash", shape = "" ]; + stack6_ophash [style = filled, label="Pk Hash" ]; + stack6_pubkey [style = unfilled, label="PubKey", shape = "" ]; + stack6_sig [style = unfilled, label="Sig", shape = "" ]; + + stack5_pubkeyhash [style = unfilled, label="Pk Hash", shape = "" ]; + stack5_ophash [style = unfilled, label="Pk Hash" ]; + stack5_pubkey [style = unfilled, label="PubKey", shape = "" ]; + stack5_sig [style = unfilled, label="Sig", shape = "" ]; + + stack4_ophash [style = filled, label="OP_HASH160" ]; + stack4_opdup [style = filled, label="PubKey" ]; + stack4_pubkey [style = unfilled, label="PubKey", shape = "" ]; + stack4_sig [style = unfilled, label="Sig", shape = "" ]; + + stack3_opdup [style = filled, label="OP_DUP" ]; + stack3_pubkey [style = filled, label="PubKey", shape = "" ]; + stack3_sig [style = unfilled, label="Sig", shape = "" ]; + + stack2_pubkey [style = unfilled, label="PubKey", shape = "" ]; + stack2_sig [style = unfilled, label="Sig", shape = "" ]; + stack1_sig [style = unfilled, label="Sig", shape = "" ]; + +bob_sig -> invis0_0 -> invis0_1 -> invis0_2 -> invis0_3 -> stack1_sig; +bob_sig -> invis0_1 [ style = "dotted" ]; + +bob_pubkey -> invis1_0 -> invis1_1 -> invis1_2 -> stack2_pubkey; +bob_pubkey -> stack2_pubkey; stack2_pubkey -> stack2_sig; + + +bob_opdup -> invis2_0 -> invis2_1 -> stack3_opdup; +alice_opdup -> invis2_1 [ constraint = false, style = "dotted" ]; stack3_opdup -> stack3_pubkey -> stack3_sig; + +bob_ophash -> invis3_0 -> stack4_ophash; +bob_ophash -> stack4_ophash; stack4_ophash -> stack4_opdup -> stack4_pubkey -> stack4_sig; + +bob_pubkeyhash -> invis4_0 -> stack5_pubkeyhash; +bob_pubkeyhash -> stack5_pubkeyhash; stack5_pubkeyhash -> stack5_ophash -> stack5_pubkey -> stack5_sig; + +bob_opequalverify -> stack6_opequalverify; stack6_opequalverify -> stack6_pubkeyhash -> stack6_ophash -> stack6_pubkey -> stack6_sig + +bob_opchecksig -> invis5_0 -> invis5_1 -> stack7_opchecksig; +bob_opchecksig -> stack7_opchecksig; stack7_opchecksig -> stack7_pubkey -> stack7_sig + +invis6_0 -> invis6_1 -> invis6_2 -> invis6_3 -> invis6_4 -> invis6_5 -> TRUE; +stack7_opchecksig -> TRUE [ style = "", minlen = 2 ]; + + +stack3_opdup -> stack4_opdup [ constraint = false, style = "" ]; +stack3_pubkey -> stack3_opdup [ style = "" ]; + +stack4_ophash -> stack5_ophash [ constraint = false, style = "" ]; +stack4_opdup -> stack4_ophash [ style = "" ]; + +stack6_pubkeyhash -> stack6_opequalverify [ style = "" ]; +stack6_ophash -> stack6_pubkeyhash [ style = "" ]; + +stack7_pubkey -> stack7_opchecksig [ style = "" ]; +stack7_sig -> stack7_pubkey [ style = "" ]; + +label = "Evaluation Stack Over Time During Succesful P2PKH Script Validation" +} diff --git a/docs/img/dev/en-p2pkh-stack.png b/docs/img/dev/en-p2pkh-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..f383f58b2a8b15d62ada2d393f4ba4a37d1580a7 GIT binary patch literal 18084 zcmZs?byyrv&_B4iyGw8hu($;e8XSTy78Z92?iwt(yIb(ZU4wgYClK5rxZdXbzW2N5 z?z#PEc4n%ps;g_NKh@P8p{o1|1C<aOfeB<}le zIBec2We5j)eEi6a4KD$J?}3E{!@xiS0sx?o03a2B5E~nS_Cq|7SC$evJi<#f6%FW1 z4E<-D3nltr8m&TDG_@v-1GE#>2bh2iHV}3pVvwm66UF!9XqGwS9;cB(>K_lkvlDy^ z;Lw8dv{o`L-7tPVAVr*D;?3sCzF#`m=zudlN5O{S18qO`?eP`u{!RbV1OoY#c*9P(CVD*_>kwviiJzlvj70EvR zcYzx;4VPl8y5!Tp}BQYsq1Nof&?4-^${ zNiOB6CPMb#t{nz;KhG0hAu^0RP=_$^Xmxaw@9MU zmGW|P*rYW-gYd{Wj@8IeL9=KJx1n2Z5f)rommUHZC^V+r#j3>8EH%O^WJibx8Q2O- z+ep2}Ea$@P)Sy;YNON(7FM{ExlgoLIffm=+p$LL6+jx(zd!p`RtD5|l@)c;V*>I$b(V)L5= zuh)1&|ARJsrP3yE7!NXczqgN8L3YqN27lH{@s47uMgy@?;k&+g#1X0m6IKq{=cenE z=EEHWJh0K^_CLEJYq5<`s)>X{%~lLLNX8Qif=!`9eqKR#OI$?^^$J5KrxC!g_%wO8 zFL%O{+96I07kTf$WawVxc$D`Ul}HXYvH|95zXg%B)#Q0V0|Lp1*vuXJyk2K`sAL!6 zg<|w+k;U0H2!%$I<3pxlh8!mlg-*Er7x5u6zceu!R4(OSFOJ251#pp0Cjrb+wu#8F z{xCRvu$4b@!r(DcvIdii<<_-n5yx(N(u>?O!XA=O8=Iz)JWY;2f8$}Tof{R}91CrO zxmuV)@%(!Ehg}Bka)c>-h~fMc_b;RPH|-})rOa}nWE+68NGBSQAAS0zrxbkV%ITo;rH2ilkW-9 zIg&QX3TGd$Qf{UKfVOZxi_z$n1R{DqWLt$JSbiEr6UzraO9wW{d+ZY&mLWG;r=fpJ9R{#mGuZMiReDXS}}8cnYc3$_~>hwpXg-E003PM4%l>6Yco z-s$+vr7ucPA776i18jynLmaPHY4L^cMUTICBSCh+r6A^8Y7x5CYJU0}%cv z?EF6g1rEk$KA_i@7d@H#JMY*y}46B{upL0$aB9Mdk9Q{NAgM8fK>E(Sbx!fuPC zkj9B^1RVo5`o~z3axv=r z_W-m2dc4XRcz)JM`gY>r&mA@qAq)NeY5+oj0xGDT(K zf4YPXCD(DQw~dJNci;yg^xz_~NDTcgqDfI!e20tB0}GA_aP2qNk11%XGpOPMKwCMz zU$k=24sE16mHo$=c$8l2x|EQrY;~q`qFx`fr(6u;cktJh^7@ORdbi5V0io5er)72;vC=U$|b?B5HJSlRCn$Sq?-NCu||fZ+Jjq3A4uO)Ob``rWCMf@--0U|!FZ72&~9p9_B+yk9D{lH9g4`qAZ zcw3r_TDOu@5QSRzXesL;Il0dB2-9e`{*h! z4bFDOxd&MM-x7=UB;Zog>YtM{{zu@2x%v_h1;akUuhF7waYrT%W(=TpEIsIC_6A!q z1`9QXs$ENx67`q8KwkjE0|g(xn{cS2x1jn$LYPDZSs{B64;M!Y)WnsdA&y2YwfU-_ zwl67iZbLfYXxhnmGNki;!q_oP=2~eI5R%V59dC#iRM8A`CW;go2o2dn zJ$Wh318UrVo~**3x9(f56DjU}F^jP*G4>gcJ~*Vrm--wq#TLB(Js-(Ng6GgB_*=%d ziHfQN#(NOR$Ox6(*0)xRQ!&S+_kzY75!_4t(sd^7+!om2q4iIA|3QC*ix%O>+nqDF>L|^xnDFnopT>i9iPLo2wv~k`xi+Z z^Ea0<$WskYFiu_gA_&n-0YCuZL&n`ZlbdIqVoK2l)v1VQ4@xL$q*to)q&&A>?2?2h z5Pwj4p3hLa^ZCE<)n3El-kF(lmK0v7*fgmxCapcjN~7%}01b}P-i$784b97dm#@zL zOC88e z`Xat4o^67T4M<0r?sr(L3=c)E8_x)a8oJ1!$k==ySTk7y)xq zkL+Z#C~EHOAq=ybu(PF@DBT^RkLE@t@*7=&V2gqwxOhO*l7lr>1$Y88?ZIm)#wgP>?X@{eaub?l6nL^xHFmkWWXehPs37yQ!sUx z*u=H@MOQQ3S3U6?J$NCMWZ6!o_oB>g8T-V|!;wYB)Hh}RtxF*^0?Q}rk?xu)WNW(` zDMSIh20-_0A_XeO$jE&_!||rMRjH)qnl+A$A>}7x$fG$yVf_~G)oH6#iQdI&M8+=n zA>i~Kp-V#Fb!`};k>=K_v^#LzbHE*^hSy4Rj@yTze>3De*LNN&2n0Gzq@ZoR&`yF| zP@FR%x}N8*=St6{GuWevTX%d^XbSCto94#{bHE!MXHlbk5Qf&z3;9o1xP5?cNezTS z(#rqz*=`T2`N=)I9cf#Fj~XV?N3r}LhP`jsp@oR`54PBK&}{)I@r)IW9zkdw%&_eT zF$jh1o6;Q%MHpYFrZut6hyXxg4B&0L2O3&Jhr|JEj-Au5tllyM`AHW!=}4=+zSiMf zH%kWPSEK@eT`+*rPtWUi)#aZW#w^Xz*g&T~o$w{RO#+{HDd{PoIfgKvA)1qT*6Y!T zfk54dQ>GL4oP`ufbSfP=HjF}=s1`R?1?p$gO-=;h-2ZCfgdlz24v?gdMMB3ZC0(PFI43xFWCur6jv7lwq}z)5g8%47R!K2lR_d?RMw1QMn9B! z%%QS1wz3Op3aP4w;$QK(!J*lqtKJ~F<*&7BJFFMFiF`#Kh&?pBKL%!d`ZB^09He{d zt|ss50=FFBWxL+Xe)ExejUrD^76^I^Jji{H-{SrUMLEn+>;V#As)~c9PjW$FW+n85 z%U<|fY*+6f`5@$MI^Bqd}mS|&I-xi zYGkkr_hbN|ZHDY^m7xFg#|7E?ztWb4;mP~ATsRqj@iKfqsBYlN76q1e#Y}Ok%SPOS^-}K18tZ`Ocfgi1T=T5 z^2j~gg03Im4o$Eun;*Lx^LV;UD)DO({A>f}Ga9J((g8ppBA?aY@MXdYH?%I72Mvgh zYN;EpVj`O7umSX+AGnMwaNzk>Aym;Y?a%=6ziBU^!mj~~=RKf8GzK*g0II~tB85gj zXgK&UJ^n9{Sb+)XS<|++!M3*i3%+i))#O6#^08m`P6Z|hdMB5bmS&8ij!jj%8-?nY z76%*f8!Sy=Z1znJe4F#`v%~6~xzz9$y-1Hg*d?rYcwRb(9$Fp>D(m6kHJj|`M`dMY z{Rx|KW9Sc={K`qfF>UO$gu~Z(i3sM!geXtUlO(E27`XAdUiB~`6`wdwCHxYUQSZBz z^SkO>Hp$#u!Kh1XJ>;>>D?!%UvOVpA6)dFx{D`MKeRejESlT;D{Y2~vWHjlxVNEd) zO0huE;jFCAtXhz)CJ<;3{F)+uoW_%X? z3kT;e&jioOr3r2%Z_p}4vQdN`ffs8;!JuMJFl7omBEzN}%IN{V%uWP#X$UowWp(As2~6n`84rm2JytOTv`G{Qd8QqCP@;(O zFILc@H&7HLMVj=+8vH<_E^B2Z%RHB?nQ8RtVG0ApRRVn^M1HJeLWVNMEx67l~D-b zbiSo`MKH!TNY*YWPJBm-+G>}^)VfGh5sOev{X2)!cIBB+L=+Pu54PvG{|u9i8Rw!C zY^jVt`FY1|gr{}AKmo0O671HhiP5*+ZuH)plB-B}Znkw1o)G*t+#mHNPF zKBrLt>%2x!5I=yTsLA6TcPvCvhQOYRK=z$*j|aaq}4NJULo# zzFyDi208)6#-9pGN{0^c1=`pjAvggDKfUe77iY45F-KDtiOzbiEMF@%V|VZb6l*}sxw{de6U z2>J-aJ0qawM_~yBq@X5wBJ=!D+AaamZ~%8+BL2tgT>C$={EIL2|HznQP))?4FjOOt z$UkuKzo?mpU%rkAWr+$I7tagO;Kc8$_Wx9|89WH<3?%qLRe1@&K5{WuJ|ziAky>Z9 z76$8RIClTgF9(2>Bmls!GXOCFR1O$J?*a6vA%GYG=zvNY!J$VhAt>@JhF$-T0R9i+ z<)y=bZje&Q0>tUT(l<|Sn}|E?@Vtu?J0^g98ZDWE+}8dv`}ZLp-d%sBcP2t&_8&rU z;3P5s9AD5+ejYBBC2~b#A@0dTg{ZZicXd2v;wOcDr+NniDoS2YlmkaEI&F1l*Wr5V za7wEZZ-2phClwIF+H!5cz;Dt+&w)QWSN}YSl=7A4DghkT>)2R~47!((!LGD9Rc>mP zubev78>u=;l!T4+uA(Oap1p3AdQk$LfrzDKKBSbOQ}#SKUGK`D)Hk5}gU}jVMtGK$ z92=qmq$$ye_Ic%h8KTRuBz0;#q*W}fgL}HPG@1lx`rSpUXsA!SNnCVu+sT0%t%~of z3G2hLdR41ddq@aQ3L=rZ7to$w1Et5hz!~_5by%UG78`L?HM~kHv~QAL-(F7Jz6?BnDF@qfd%!SDH6PkzAVqurc(fI&8F;zv(``71e#IS0Q{y~ zMS$1G;e}%+@YktZCL0fMAZ5O$a~pNR=Hd%YO92=su_)Y+6x*w9D@#2LQ+dC2#cKG; z#qRa-IGCknM}RPujHi4nuo$uYp&ciPUV-87rwv818 zMcC6OOz;Z?05|{|IRPw$6dh#ozdqnqj}2W|Q48F7gn>Z4xE!VeHvoZ7I>irddBlmL zVxnQ5uo4G=Xm+GVq2P*X)V%KPieLj5ApTBcd9bbbegz!b*X9eTM3`t3K>#z60UZ-k z7SXJ6(0bIGzVLfiGq-(=;{%|{E??OoiW{8sFhlr!VJCFo5(B?r!}I=i&;Un!qpdV< zxT@Fl7O=U3-)mH7_-OTdr>Eo5a&vFOK$2J-HHQDNc20x!?LL6B;q@<5^x?rUWgjEi z__-jHzVOlIm{;91!#z$9NId0&mRs{Ohzl5w6bh_6+L(JFd7@$F;Xe~K05Fq3F+l&) z#{mEd(8z1$hXH+Lp3WMD67L}8eV!MuZ-Fic8ccmGEDtt+g%6b|W+9y zN&NMgJ^!zvRW~$e(V(hnhf<%$ibJV|{cTLa2(PH5n(ufT%i{x!F^xGKd|wsmy#|(s z-oA9GZcW{=8+xq6ftd{U>dt8ncJok|qY~=IR>Z1J?NF{L4lTL+)&|#p{ra`hzp>(X zAAT8GaGSjG`TFsCs@qU79-CvncVlf~Dai!-v$r&|x3W2Jqp}uzKK2HraB0wx0VR`7 zQ<=%+x|^H#oA1*c^@(ICh2QS$L7M{;%M?3ig<^a=_i$SCz6ONnMtSESdp!|bzrGPCSG7Z=ETk;E$X^ZQ zv&v81?v;Y!D+2ZV-{^b1Iwm~^Q3#zG?Tc=Tf^>C?&%%zBl$ldEhYDW@)#Z;!i9!C! zsr%V1>@|xOi8W>gqt)&Z=Jhbj`<^D;wE-C>wL*`H0sC3kCVO))l9G9z_Ym*|Te#rD zLTP4Mm2R{B`b<+!ua~e{fw4Px$9GN<;Md*Guhm2NPS<_LlM$itggH^h%AIWwO=R1W zt5IGE6>O8wS$zbajdPdOFXT@cA=;IoMlES=)RwaIuJ zE->yI&T`g;e!@m#Xu|=PZaC0AZw?!`TsWnb{6A5d=Yl|7aGRC;%NT;M?p@W z9A&?3@m}5e1tk;R>Ie^ZD;N57{H8q&z*<>p{|H}srZ>h;>yHM9kxl*Rsa4_-3{w#p z4q$2hbd)S2l0Y9o@H_N58^5Pffu*}eQ31VDr*|>vrd6L3x`3#Tti`)uNC)vqe>qq0 zJwosP0(sW^eC1W zki1d+=|lgjK;Hax;x+iigpLdT+c$amNV55ga9Ay=p=vbhvkXzzM%=?*K|2s!j~WJu z`GdHwNnyuzZtfs{gfg#U4D-ag6I$bN09uc+$KH$kEM@Y}?i0#3zw0KyZ~>h|%~I(l z0AvUcoC$2B=_Ys;0m?8D39s{Qs?=ZCnhmp>IVM{zC9{81&wfRa#Y<%2w?<>@cl-eQMS`MK z22AxGRJET{Wmxo&U!$sEwd1@F9NzLo?O=Km{$|`Ei3gh#)qcqFC$>>kCU-#90=1q!M=rO9&-#V3ZG|}9y9-z$ z4)JQP=Nv*i>}t5RUd1NK(4Q0UtG!m5`9zeF0c1(AiEG2-SM#<7Tc@8mYo+5*cxCO< zTc?F~j|6E}V}rtv{N(hGepv9^X>Lc1`G-e;t#QazHss$N7@lKkOPXNyZ)|pFhs@Tx z{KeRCYH3iLJ5*qFuQcRwy;qIV9*?ztOly@v(4r*TlwD=Zfbott^RKm+=NY&>X2g_`aIsa%=lm!h3LH}dqZPvIcH4eCp2NzXkm^@)SK zHgEp62syj&t)yb$V+o-bM7-Z6s9KM2bZf;P{&U8SzJObvAIH9c6t6MdAmG8`TrqJ< zdFfQ6NPZ1049L3btt&9k-d_Rqun%w8m^G5*8k#5S3IMul>DnM$Q?Pz@E%_QxDtL+@ zuDTxy0P<3zP|GS@J$5s;zE#+Z`kzGzijV{pPY!*1JDw@lyVIJv+BJ8MsYsvQU!_uZ zx4AU?{&B5#C7yU*6 zC1LR;`x!(OT{yotGmfwb03B6}tfr?tLk7hSa>Nd`F?-b9i_gGcnq~xbMc8~Z3}K)T zP80SuB$OIjb$QCpG5(3!XKVfbW{P)T`yF5k z{b$X$RKVmmG}|&*o!Qy==8y7w%*%OYpAVq0p4^Z+Amg8x3RplFRWnqcx`$flY^5!B z-aLJ<^rxc*0*Ody{TC~kC>$VMw zHr)p(jhhYhZLVRr+*XeVtYW>PgQHD8MsmLqzuwmLEpPJ1Nyf^W01z2%J-QUhmOaMJ zv@7{%mrL61N;S`pXkrqI=VIVHVR9X@XspY#Uh5tb0_03=*4P0s**`zHo1 zRM5zNA|4!Tf2^bqmey6sr=Az6356wGj>4|2bm+rBsHNH%lA@gt3~8^Ff*b^ATun?? zJp38qB+!XMkh3t-k@C15za(UCjvF=>mbLp1 zAM&9V!{fcJKaB6=7w-m!#Ssz0RPS1PdgQ*w$wfotMwrtnA(y-L_kd%;x8vBCTz9KU z4z{8Qk*!sx0verFc&iRaMo;fb6;SNW()(O7zJk7ug}z|VY`;oBo=l`FzeIsJ0#M7? zKcp}f@&7>z|CC{FN;1v4rv*hJS!sH&9=2cpZWLa85A6|_01f5>E888Rlz~v+%IEit z!iuabQLO{HkURtgu))q3+p&=6HX*8iZ>C z_JBXyQ9iFdPnEs)F(IvM?7A-R*90H}MZMYi+-5{X%==o_!&rm@KVXA?h@^lyDd^5x zStGkLqk~;33Tpx}Lo7dKSpvCAvC%`a6mmLVubwQVQ$@}gS4P^ zF-b{)f~vXJlXl+Uk)ypOz8EAUgF5TQI%HlqR3KM-0dt2 zYHzUBExGG9t>;xtnZw#V!o8{o$vf26wGff-Et8XG1IlX+frIJ5-fgqnZWV+I?q@HQ z{=c1izWMci;IDtY2-JFy;@mt*`?Hh0P5hBsdkV0QVshH6cU7?AA{&S?5)5=72F!Ht zwcC$N>b~P)-~;X9olME8z3{(9iQFHCIxD{u{E(dryKpE{^P`mPLQJo{QAaAHgZBK{ zn=sqmdJ*jbmvq%>IcQ*Y@eKx{@|sPgk9uPgrYbZ?gB)nDQA2|Y!g<%u_N~R{v0+X= z2@Uv|=fv-G=W3WSi%~Qn8`tzzx1m`ef=Hgvc6rp4|AY9b;^I&?yv0Uux_fajf|XQ2 zu1f|5sEF3?LNC9r#~4@RUq$j`?Ei1HAQc0N!9uzKATd4($m^-?d!`Lw7S_iO>_yz?h0xls}KdqeOaNtn~N$EIwCjA8h^b}0KGwM#_rz$jjFt+ zTpVI0d_UYzaIiMfgO1Z@%!|!-&YwH#GO$5#`S$GMKPy1Z?Gm)pzl>~WVUEA>|Co21 zzG7ZL#dtmzdQD}3Tga%Pk|k>BDE}mZ{Psx5X2%7#g4Xa(MJ>HFW4~b+g>{s1d#_6M zw1sIsR8URdGHZV1eqH3Z*T#ck(W+M{WqbD&+@yU9qxOkzG~@Gdd#aYw-j6u`TSKUn zMQ+CJi4!y>#7fR7@%9S+w-#&%dkbK>8QWOo4Y!U&5nQGx@NW5(BI9| zNLyxbv*;GZ4+g|mEa2a3MZzw2&k8UFQA7(LB0EBUB*MHHE z;_o-1>oaBtO<22sx{#qyx%#uEABG>1B%wP9rJK#w#gKBK3m#13{QGKRVx(2dV3Dde zgD+Y>T-@CCEk)1f^LQc3A3MAKYo49Helai6v%lQE+APO^WP1F2u9>`BJP>Zd_}w4a zZEzFo#H|1F7+_*Ide4u5zRt-Ki}J99oE zu!kq?11C|~Tw2s$jg}?$bGuse5S;Zm{rqTe87+EBfUXs&dBU>R_Oy|~Nit+H7( zlB4cvZa98*DG5xa@azG)ac&+9BAzpMC_T+C{>@z0O9hckEV(Il$ z7_3kZy|sA>_b&Fkyi%}Lygue;K{zEDznzPC$71HTiLq0z3TK+sa=h&8B4pS;x%ir# z|7J}$a}oGnoh^@&>mat&=)O_m1$W%sUn|*(%RcsuIR8>NwK*=l(=i9`5EOKdTMx1` z>E&n^MrL7*#POxcc9t$Xf=Oiu zb$=*`9?^{@MkGb&Vq)2nKYOIizt*bm+vngxB+AM-f*m~p<-Jgb-hG>HVbEK@UX8JDWrU!!ngfUOi!1lK`@#L6gtm;;z%~k`94`0MFEhmTpyde{qpp~9 zIf3fLE)u)rxW0QEtSO2*s;~z$1XqIi6xzFCcalD_uO&^rt>}_IzXH7N|9tBmW9|lm zn)jEAgcH5_GPpf8l;2I{5!ig#|FJf5qWnl=pLg7ZI;1?F@Pu2vUv?|1CJAz$b~BGy zD_l*S*c+qZicri*c1VZb{){dO9A|_yTVzzRCen70BEWIV=Q?AeI(?317Gb?zfojEk^saqIC0u2m7~)=3Pp#&mxRTlO$fnM! zC6qE`mXS`&(<7X2Ces(mA3t;JG8Dxs)n2D%*l;`6YjUfdAgD@b@2&5vK2iBwo8YjW z9_mLOQQGy1t+y_mCKpt%a}$lF+IxzVU5Y;v&TpE5wB;6r1o4JuhiLKK_*WUN+zTe-;@#~01Q{ee+v)I~fe`J><) zhijvJuh-89gYmgf*R^LfRqpLmm}QBRwfoazk&EAby_vto>JkMd-zcTciP~UVSNeEF z^Gv0+-Nxd$3c6bI1*4Af=~+n%;mPZi;~%HKqgScfJV@mT=Q4-A};q=%j7ClJOriw$2^P0;Y4*| zW^o7qLmv4tORR!zU1PjrK@<{6AD?CYu_0CLnBX0fQh{pMlyCTw1@4 z1+Wv{35SdlwGyq;_(Kt@W9vIrleGqzOk72?J8Mentd7FOc|WWiZ?}`&2p2_Vp0JREN?!kzZ_Ey-3+6ah zS24iL^Yp{HYHjkX$tA64h+{9OX^Ndb>pXO<*WanUUN1T_5HO5u{noOY*qauqEE|=U zTfnMHT{1lz`Zv~2zdVIUgQ!%NScHK*_jwYK>R9M>{#1IXe;M-iU?g8R()PihlH6U* zRwo~2bZ*a8*sMisU*e^6^zMh+xF1JpXXs%4N2UeCOxdoqKW$3%PgEADSV>wT71!`q zkPd;x{2I$WpW+nIozu_X9a);8JT(0&2HX05k3LU6W-U#A5yLx+zf*9>7nBuB#B56Z zwNVyq)-dIlX&kFz#rH0-AZiokny6Z**KvY513%#xVysxMX zU*5=h^&Pn-N2Xm6S_MC7On(-k>@1PtT>PS}OJl#4qf;Kl`ZjD|-|s3$MyWRa=#auy z_tWPK?>71Bh1Nly7_k;xqlMdBghc9uDG7z9>EBhi3c2Vz%bh3|RIsbvB*zTO-PCav z3&GdZB%ITF$<0Z3&ELl4UrsSithz&=_qh+*5h@pL`P!M=N3Qwmqd6XfjZ&oF|8%G{ zCVK4DH+9drS+ogF9A0zIeI2a;vKUa9Cdt1`JOAKWtLy?2>{FSkN1fDRH(I@KOi!^f zC0EX_1>GbS-%LGC@N=X;b?Ae;5)GmvE3X)0wz+a(n3tY5a;=&YrB|9)jGIwX`?1ot z!zM>9)OTAMg!=1WdSfOLfYn6ax#q|0#d_sJ)}p7lndjh+0n%l6vIPo`bj``W$9l`Z zvL!_Go4NMHliO(etrZoWZM*!W+{qji+dMW-@4KLoTnffx*yMP%y|Y|xh;=fu zJRoNz(o6O(#Y*qC;XGFe3i)ANT&vENs&jtv^h>90w!YXD&$rDrEq{~3e74Hw@Kxp( zMQyMoqa(eIJBA~ZXnuX;(7NFnmG%`=WyUb==LtnZ#`g)@@x@_oVE6LAIfO2DIXJky zre6?L)y?Rih(L^vCNy%=p(WSx1ZFQ9Ir>o3%>fFhD4pbR(RV#)!Z$vm*q2e9abE{f z{{;@TKLgNyGEsZ8%a@%Nzf_cxX0Rvw=4z}@v|K*oEt-iX!M>IXg~5Fy@i_My?&!;9 zuOzeDA#v7S8R((3FJf=xPIp&*eY&sk*XIuU(|H)xz`Chf#8$^^;P~w{|KZR2tc%@V zzo|j0le*Dm6TL}TR5W!4&}}Fc32mOzlZ-(xZAlSr-M6IRh~yXlVwZ>G@pJERE3Hzr zK~M}wx5M3f@lGorV%BHTUOh~URDA|(uVT9W;RQpbmkMG?vQR3Ij(ofGg*DqpsqiF8% zN{xI?8H9S{uThGw(knCZgA9{sCb3`IUhe6|*! z@dztdvvpKM4YU%6syb9%j19-@%9=tEO|;@OPeP<$0;GAg2|Cz~4_z!2OcWUkg$b*b zN8TcKPZ|9UM7lgfrasuf=`U1^!dwnjKaZTvon)>ewD&!W$YgF;>wNHLH|V}Qarj>H z(c^P^J!`+iDDql4=k}kggW!FN`S*-DZyUoKq+FZ6AB@(`*Tw^)!=}W_K075=>Fo%t z;735*7~u-H&i+ceP4g~~JKrD^ss=9vEvP9+=;xyLz#12~eaUz#u55aR3qa_XS#0}Q zqNY_^g9L`Djc12xw3A+CI;PAv6Espm9uH-+ioBq(IE{@^$5L=fF^{4p3saw!SJnR_&s(e`oF*a z?W6B6`Wi5y<@e@Sa`uXEDkRXtx%~^LxK>03^hm@w+?qjWD3zmJ} z=#clEL6~#=duxY@5hXX#b}w_e^7=WW*3JNY-$YBVg3mu#CsTJ_chX<|qX*IthtR#i z+})Y`<{?baS;zNWNk>d#hc=`^;R;A)5n@@MqS#4sdC_3F5H zF_#~gu(9b5R>bY-5UZOW9A#&qFZ^-epK}lX#9hPc52-m%o}Xk$TyR*=RnPLKVlu89 zS&BnDiLR}T2d=Lk*mLpmP>WQwTnxt?q!VI})m0=fZg<<>Z}bZQzdC4r?cLhJ;2sY{ z!uQeQ(m0PDZ|1l}2h}r~Y4<&TG$fl$lKREaeyAq%ORz;Tp(IHT?)as*HszB4{pO*& zS^nd!io)CAT=L``S`bs!O)J+g^SLf}TjpoS&aEVLYxbKVPWIqN&B}tIYN#z}mKVM* zzWW~i_MH&Jz(tcu>D4xJeo15w|6=OzODJ1=zHs@GdHQb^#PzJ7 zOTV3%!1HIkx{|3AwP$@k$CSlO9j5%HQPtUJRopAAcgUCLH0_-(hp`(J#C+!tp3${c z@#wx$yZy5_L%a`(*$ymgd*=(8w)qNOTG=8-+XnPsT}MWJ*$p1=o~6Cot&=epJcUN4 z)crsB&cLBmQYxn#eom|S!|MfmcI_Jl?g-0)%+X_ckV| zx6oS`T@dRQLCMMz=@>WWZ5F60q;nfAV!dyNtJmb)c4Cqoj7NN{bEjyArK~dUXTD?z zbsF@}TIkHs!*PqhI!mNgS6|*u;U_~~ov>!Que5QX3$2tc*n(%Y>=w)1GU1@Lh+50600;%;ox} z?_TW4<>xn@nM0JQt3tNbA=}X3V@3F5q$4v%{^l0>wmRADN)LgbYsq3z$(=}Fhu=>< z{cx6tu8F;K%H^oFQCKBkNniSMME@;*WIOYhownIfPd)RKpt*9Cv6IwPoeY=8gy+b( z?X(|Z^y|XGJMLq&dQfnqXq1mrZ>DQY3R415Vo#8x(UioesW~H2@qQ;O@Osgj zwmJUmHSLL%mdiS3yorz2Tl70aZH75Y z^(3cm%jk~?lZ>ItK72`bQD)JmBTtCx^@XoV-Sb1*oQ?KBZ*3RM+_{9I1%TLyNy-&3 z!s0(Gq>4y{=LRg$LkudO7vp=%%41XD;w(u+1a&lvgxtMWSF8#1hSe9Ar;Yr#(91Nz zEt)57S*VN9C+e1%|I{HTb|U@+mS$3bG*vSGtS|38y#J;fu@fPnJ zigLK``B@|wky+oBbk18&UY#?U z8g2_)ku87%#7{Oq%6-2H_-N0EsFkU(7CBc&7={Q$=922J#pWWbHkmQe`JNr+wUW~% zlRB(If+hg9h91NZr(0br0q-h!ph3n7dOYfc;-R;k7s@l96(nwq)ep3xMFMqnlTVWs zw9`rso{JC%?8qFe;uMB=xT^ z?hA^D;1G3+zgae`b+c)?(`xR~yhP3Um}fi6M}0mS6PC?mSP2Feg`}a%bDU`%^-zO& zI;Lm1ntydI_)A-|@NP*I<|GJ-B*!j`@YGJ(7`%&Vb$TOq)wYw|0KUX!qz-QQv_F|M zMKWGnt)Pf{X_Xkg6a3eDghW=V>93Jv_Qs5U=-?#R2g!dQn9KX9{AGVuorcF4CG@H{ z(JXrHj-z~jx@_Fet{}lG>JBi)?h-FLq(8&mC$ZT4Yu@0?{Jcg;pNj^da%P~K9=J|{9*z47zHX;$pOA&Xq zEED+hxtUXdBF9bDRBqu;(GPExJ2KwpjYI^jdgLx?9&2U}WkD8YboK7Ra_9_qcj{J= z?bP3)^pM`{_sjEF)71o(e9SN+Y zdD6MqlwLo$x6M)Jovqpx8+6S+5|zE&t{pm&yRCDsvbg$&jtQaNGVpLQlcHS$MWMwj8IyWg)&St8r%Ps0|LJXNNZv$6+ z9}k`8A5II55^4@#t*#Xx{Cv!GXi3VWx#NXLUwPf7k|nBM1!fetJ&86F4^5IC@7T^m zC!+o)K+4xR=#*4d<(mCFV{1z~|9-#oj=I!hx*N)ZeD_gQ7=fuUdmGg|+${0RDa>r1 zH%Q}@KWo=ohR#K$jmD;gr|7>^ss5seWWG@Pm+I?o`svyy52(k)WU{iBoK_Vm5hi9R z%7Ll>CKPR{*GoO-4tdMOPQ|S}{I!lzA#eSgA6{n59@cMR%j|2@Dt)18ZCb%1!J49P zVe&7yQDn;KOo>Q}lxp4`n?G4e%eNA}8nx_7qP>8>xL&%=PZ8BOu|t}!#>{e^0--vT2}2#&-A87*s=Qs>SzVik^0w=< zZu?)hDo2hxxes13dN;?(Sq5Wa=}+WdQ|i?@4o@4?etuF;GJd_a4QT+PV4Mo+%#*z& z=8_D9K`N%CmK}c;e>s!#_oDN|Bw87O_#sfQT>}m_18$cusNF??M6KZ{`-2n z0L`~Dtm2iEdYz3I2rA3vt?`7d#I>Sgz_NR>9P4X$H;HMWRHTVz=E*Poy*9WRVwf`7 z{|=U61CApf^I|q*5qH5^IOJuMpX443YJxo$_Lb}SjK_P{3B91TS^pyb zR}TA+ea1R9@VWB6 zBNmYYNRD759|~{ws;TZ($>W{YYXN;l0t^2vh)ai;ycZpL& zf&5#b_+asO&>3ki4IcDTZ2E>8MgMpA)KCu_VRshGZm`4K^ z)WR4`Ot)+3Gr=clP46nvNfB-xuh~n1D=#|;OO%f0jXFaOU;CGscY;Nv08%2@$mdvg zhYz8*6!p&j@ERL2G(Pj*L;TO8U{T$~@2}&R#lxTd9dQ|f9s0}cNjt#~I{hJ1N%9@x z`2S9Skk?^DA>oZkS?Vo)h#N#P5?F+-`w3QFkcb_j7YT#^B2T>5_PH-U+eWP8HRI8O z#WOl(Kn|Y}EWsiQSZXqv{sQ|uYHp5RZqgZky#xz`R_5Ea5dSl;-F>1b4}BdxfgBd% z{yJ`twLEq9hXZscicHrgp^s$F@u<#=I;x}io$vfeVNLk@6eS{lC zG0X+*g|Ov&xB5b7NW_ldPXxvlX<>NZ2NbXf>qN~67m!GdBLahJujU?d_=s2uB1jEj z(*O&fOVsq~gWjK<-la!47Mbi`?IR%mXWrU&{JEzlI(ZkmN!(wDt;fqg8P*&#u&@6E ztVG(t<^$2ozK9(>_w3j|Q#x395!|!v*b8B6=YUp2PeLMg zNFySmH{^xu`aK|nMOf$8j3=DD;}u8s$?zjNe8R~)zK9yYCIME1mdGuApqT(z%88Z8 zEq$Pw09Zf(EFb_D5D)+h2!I6yzybmSU;zQJfEu{|57ncE{%N^;8~^|S07*qoM6N<$ Ef>L78zW@LL literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-p2pkh-stack.svg b/docs/img/dev/en-p2pkh-stack.svg new file mode 100644 index 000000000..7ab80ca2f --- /dev/null +++ b/docs/img/dev/en-p2pkh-stack.svg @@ -0,0 +1,306 @@ + + + + + + +blockchain + +Evaluation Stack Over Time During Succesful P2PKH Script Validation +cluster_alice + +Instructions And Data Provided By Alice In Transaction #1's Pubkey Script + +cluster_bob + +Data Provided By Bob In Transaction #2's Input Signature Script + + +alice_opchecksig + +CHECKSIG + + + + +alice_opequalverify + +OP_EQUALVERIFY + + + + +alice_pubkeyhash + +Pk Hash + + + + +alice_ophash + +OP_HASH160 + + + + +alice_opdup + +OP_DUP + + + + + +alice_opdup->invis2_1 + + + + + +bob_pubkey + +PubKey + + + + +bob_sig + +Sig + + + + + +stack7_opchecksig + +OP_CHECKSIG + + + +stack6_opequalverify + +OP_EQUALVERIFY + + + + + +stack5_pubkeyhash + +Pk Hash + + + + + +stack4_ophash + +OP_HASH160 + + + + + + + +stack2_pubkey + +PubKey + + + + + + +bob_sig->invis0_1 + + + + + + + + + +stack1_sig + +Sig + + + + + + + + + +stack3_opdup + +OP_DUP + + + + + + + + + + + + + + + + + + + +TRUE + +TRUE + + + + +stack7_pubkey + +PubKey + + + +stack7_opchecksig->TRUE + + + + +stack7_pubkey->stack7_opchecksig + + + + +stack7_sig + +Sig + + + +stack7_sig->stack7_pubkey + + + + +stack6_pubkeyhash + +Pk Hash + + + +stack6_pubkeyhash->stack6_opequalverify + + + + +stack6_ophash + +Pk Hash + + + +stack6_ophash->stack6_pubkeyhash + + + + +stack6_pubkey + +PubKey + + + +stack6_sig + +Sig + + + +stack5_ophash + +Pk Hash + + + +stack5_pubkey + +PubKey + + + +stack5_sig + +Sig + + + +stack4_ophash->stack5_ophash + + + + +stack4_opdup + +PubKey + + + +stack4_opdup->stack4_ophash + + + + +stack4_pubkey + +PubKey + + + +stack4_sig + +Sig + + + +stack3_opdup->stack4_opdup + + + + +stack3_pubkey + +PubKey + + + +stack3_pubkey->stack3_opdup + + + + +stack3_sig + +Sig + + + +stack2_sig + +Sig + + + + diff --git a/docs/img/dev/en-payment-processing.dot b/docs/img/dev/en-payment-processing.dot new file mode 100644 index 000000000..e34080d68 --- /dev/null +++ b/docs/img/dev/en-payment-processing.dot @@ -0,0 +1,29 @@ +graph unique { +size="6.66"; +rankdir=LR; +//ratio=fill; +splines=ortho; + +overlap = false; + +edge [ dir = forward, penwidth=1.75 ]; +node [ shape = box, penwidth=1.75 ]; + +submit_order [ style = invis, width=0, height=0, label = "", ]; +calc_total [ label = "Price\nOrder\nIn\nBTC" ] +request_payment [ label = "Request\nPayment" ] +verify_payment [ label = "Verify\nPayment\n& Fulfill\nOrder" ] +issue_refund [ label = "Issue\nRefund\n(Sometimes)" ] +pay_expenses [ label = "Disburse\nIncome\n(Optional)" ] +rebill_recurring [ label = "Rebill\nRecurring\n(Optional)" ] + + +submit_order -- calc_total [ label = "New\nOrder", minlen = 1 ] + +calc_total -- request_payment -- verify_payment [ weight = 100 ] +verify_payment -- issue_refund -- pay_expenses -- rebill_recurring [ style = dashed, weight = 100 ] +rebill_recurring -- calc_total [ style = dashed ] + +label = " \nPayment Processing With Bitcoin (From A Receiver's Perspective)" +} + diff --git a/docs/img/dev/en-payment-processing.png b/docs/img/dev/en-payment-processing.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ba6b95528ababfe077c08a9924943edf5e2ec1 GIT binary patch literal 6129 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 I6`Roi0XA + + + + + +unique + + +Payment Processing With Bitcoin (From A Receiver's Perspective) + + +calc_total + +Price +Order +In +BTC + + +submit_order--calc_total + + +New +Order + + +request_payment + +Request +Payment + + +calc_total--request_payment + + + + +verify_payment + +Verify +Payment +& Fulfill +Order + + +request_payment--verify_payment + + + + +issue_refund + +Issue +Refund +(Sometimes) + + +verify_payment--issue_refund + + + + +pay_expenses + +Disburse +Income +(Optional) + + +issue_refund--pay_expenses + + + + +rebill_recurring + +Rebill +Recurring +(Optional) + + +pay_expenses--rebill_recurring + + + + +rebill_recurring--calc_total + + + + + diff --git a/docs/img/dev/en-payment-protocol.dot b/docs/img/dev/en-payment-protocol.dot new file mode 100644 index 000000000..7c9c03612 --- /dev/null +++ b/docs/img/dev/en-payment-protocol.dot @@ -0,0 +1,56 @@ +digraph paymentchannel { +size=6.66; +rankdir=LR; +splines = true; +nodesep = 0.4; + +//edge [ minlen = 2 ]; +node [ style = invis, shape = box ]; + +subgraph cluster_client { + c0; + c2 [ style = "", label = "Pay 10 mBTC\nTo example.com\n(VERIFIED)\nExp. In 10 Min.\nMemo: [...]" ]; + c3 [ label = " \n \n \n \n \n \n " ]; + + label = "Spender" + +} + +subgraph cluster_wallet { + w0; + w1; + w2 [ style = "", label = <Payment

TX1
[TX...]
Memo
Refund
address(es)> ]; + w3; + + label = "Spender's\nWallet" +} +subgraph cluster_merchant { + subgraph cluster_payment_request { + label = <Payment
Request
> + m1 [ style = "", label = <Payment
Details


Outputs
Exp. Time
Memo
Pay URL
Ref #>]; + sig [ style = "", label = "X.509 Sig" ]; + } + m3 [ style = "", label = "TX1\n[TX...]\nMemo" ]; + + label = "Receiver" +} + +uri [ style = "", label = "Pay Now\nLink/QR Code" ] + +uri -> c0 [constraint = false, label = "bitcoin:\n ?r=http://example.com/pay/123\n \n \n \n"]; +c0 -> w0 [ label = "I clicked a\nbitcoin: URI", weight = 100 ]; +w0 -> m1 [ label = "Send the\ninvoice from\n[...]/pay/123", weight = 100 ]; + +m1 -> w1 [ label = "Here's the invoice" ]; +w1 -> c2 [ label = "Do you agree to\nthe invoice terms?" ]; + +p2p [ style = "invis", label="", width=0, height=0 ]; +c2 -> w2 [ label = "Yes.\nPay the invoice" ]; +w2 -> m3 [ label = "TX(es) attached\nwith refund\naddresses and\na memo" ]; +m3 -> p2p [ label = "", style = dashed ] + +m3 -> w3 [ label = <PaymentACK
Thanks!
payment accepted
for processing> ]; +w3 -> c3 [ label = "Payment accepted;\nyou can go do\nsomething else" ]; + +label = "\nThe Bitcoin Payment Protocol As Described In BIP70" +} diff --git a/docs/img/dev/en-payment-protocol.png b/docs/img/dev/en-payment-protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e5603c4e4fb11d0f3f66eaa807fd31f7944d61 GIT binary patch literal 17220 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 VJ06#h{96ogO<7B+@UlhF{{c16f7Sp1 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-payment-protocol.svg b/docs/img/dev/en-payment-protocol.svg new file mode 100644 index 000000000..3a0ca67ac --- /dev/null +++ b/docs/img/dev/en-payment-protocol.svg @@ -0,0 +1,164 @@ + + + + + + +paymentchannel + +The Bitcoin Payment Protocol As Described In BIP70 +cluster_client + +Spender + +cluster_wallet + +Spender's +Wallet + +cluster_merchant + +Receiver + +cluster_payment_request + +Payment +Request + + + + +c0->w0 + + +I clicked a +bitcoin: URI + + +c2 + +Pay 10 mBTC +To example.com +(VERIFIED) +Exp. In 10 Min. +Memo: [...] + + +w2 + +Payment + +TX1 +[TX...] +Memo +Refund +address(es) + + +c2->w2 + + +Yes. +Pay the invoice + + + +m1 + +Payment +Details + +Outputs +Exp. Time +Memo +Pay URL +Ref # + + +w0->m1 + + +Send the +invoice from +[...]/pay/123 + + + +w1->c2 + + +Do you agree to +the invoice terms? + + +m3 + +TX1 +[TX...] +Memo + + +w2->m3 + + +TX(es) attached +with refund +addresses and +a memo + + + +w3->c3 + + +Payment accepted; +you can go do +something else + + +m1->w1 + + +Here's the invoice + + +sig + +X.509 Sig + + +m3->w3 + + +PaymentACK +Thanks! +payment accepted +for processing + + + +m3->p2p + + + + +uri + +Pay Now +Link/QR Code + + +uri->c0 + + +bitcoin: +  ?r=http://example.com/pay/123 + + + + + + diff --git a/docs/img/dev/en-pooled-mining-overview.dot b/docs/img/dev/en-pooled-mining-overview.dot new file mode 100644 index 000000000..a71608798 --- /dev/null +++ b/docs/img/dev/en-pooled-mining-overview.dot @@ -0,0 +1,25 @@ +digraph { + +size=6.25; +rankdir=LR +node [ shape = "box" ] +splines = ortho; +//ranksep = 10; +nodesep = 0.5; + +p2pnetwork [ label = "P2P\nNetwork" ] +asic0 [ label = "ASIC" ]; +software [ label = "Mining\nSoftware" ] +pool0 [ label = "Mining\nPool" ]; + +pool0 -> software [ label = "Prototype\nBlock→" ]; +p2pnetwork -> pool0 [ label = "TXes→" ]; +pool0 -> p2pnetwork [ label = "←Blocks" ]; + +software -> asic0 [ label = "Block\nHeaders &\nTargets→" ]; +asic0 -> software [ label = "←Headers\nBelow\nTarget" ]; + +software -> pool0 [ constraint = false, label = "←Shares" ]; + +label = "Pool-Based Dash Mining Workflow" +} diff --git a/docs/img/dev/en-pooled-mining-overview.png b/docs/img/dev/en-pooled-mining-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..3a719f7d5d65293c481e41301c11de451635e1e0 GIT binary patch literal 5512 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-pooled-mining-overview.svg b/docs/img/dev/en-pooled-mining-overview.svg new file mode 100644 index 000000000..16cf0e11d --- /dev/null +++ b/docs/img/dev/en-pooled-mining-overview.svg @@ -0,0 +1,78 @@ + + + + + + +_anonymous_0 + +Pool-Based Bitcoin Mining Workflow + +p2pnetwork + +P2P +Network + + +pool0 + +Mining +Pool + + +p2pnetwork->pool0 + + +TXes→ + + +asic0 + +ASIC + + +software + +Mining +Software + + +asic0->software + + +←Headers +Below +Target + + +software->asic0 + + +Block +Headers & +Targets→ + + +software->pool0 + + +←Shares + + +pool0->p2pnetwork + + +←Blocks + + +pool0->software + + +Prototype +Block→ + + + diff --git a/docs/img/dev/en-qr-code.png b/docs/img/dev/en-qr-code.png new file mode 100644 index 0000000000000000000000000000000000000000..51c4bc42bdbb8a8dbd1f11df6ec8ab772622146b GIT binary patch literal 6583 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 + + + + + + + + + image/svg+xml + + + + + + + + bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=.1 + Low + Medium + Quartile + High + + + + + + diff --git a/docs/img/dev/en-signing-output-to-spend.dot b/docs/img/dev/en-signing-output-to-spend.dot new file mode 100644 index 000000000..7c49e928c --- /dev/null +++ b/docs/img/dev/en-signing-output-to-spend.dot @@ -0,0 +1,90 @@ +digraph blockchain { + +size="6.25"; + +splines = "false"; +rankdir=TB; +ranksep=-0.1; +//splines=ortho; +overlap = true; +nodesep = 0.1; + +node [ shape = box, penwidth = 1.75 ]; +edge [ penwidth = 1.75, minlen = 2 ]; +penwidth = 1.75; + +subgraph cluster_tx1 { + tx1_txid [ label = "TXID" ]; + tx1_vout [ label = "Output Index Number" ]; + tx1_script [ label = "Pubkey Script" ]; + + label = "Transaction 1 (TX 1)" +} + + + +subgraph cluster_sig { + node [ style = "invis", label = "", height=0 ]; + + sig_tx1_txid [ width = 0.7 ]; + sig_tx1_vout [ width = 2.3 ]; + sig_tx1_script [ width = 1.6 ]; + //nil_pubkey [ width = 1.3 ]; + sig_tx2t_script [ width = 1.65 ]; + sig_tx2t_amount [ width = 0.95 ]; + signature [ width = 1.25 ]; + + + label = " Signed Data" +} + +subgraph cluster_tx2 { + tx2_tx1_txid [ label = "TXID" ]; + tx2_tx1_vout [ label = "Output Index Number" ]; + tx2_script [ label = "Pubkey Script" ]; + public_key [ label = "Full Public Key" ]; + tx2_amount [ label = "Amount" ]; + tx2_signature [ label = "Signature" ]; + + label = "Transaction 2" +} + +subgraph cluster_bob { + private_key [ label = "Private Key" ]; + + label = "Bob's Computer" +subgraph cluster_tx2t { + tx2t_script [ label = "Pubkey Script" ]; + tx2t_amount [ label = "Amount" ]; + + label = "TX2 Template" +} + +} + +{ +edge [ arrowhead = "dot" ]; +tx1_script -> sig_tx1_script; +tx1_txid -> sig_tx1_txid [ style = "invis" ]; +tx1_vout -> sig_tx1_vout [ style = "invis" ]; +tx2t_script -> sig_tx2t_script [ style = "invis" ]; +tx2t_amount -> sig_tx2t_amount [ style = "invis" ]; +private_key -> signature [ style = "dotted" ]; +} + + +sig_tx1_txid -> tx2_tx1_txid [ style = "invis" ]; +sig_tx1_vout -> tx2_tx1_vout [ style = "invis" ]; +sig_tx2t_script -> tx2_script [ style = "invis" ]; +sig_tx2t_amount -> tx2_amount [ style = "invis" ]; +signature -> tx2_signature; + + +tx1_txid -> tx2_tx1_txid [ constraint = false ]; +tx1_vout -> tx2_tx1_vout [ constraint = false ]; +tx2t_script -> tx2_script [ constraint = false ]; +tx2t_amount -> tx2_amount [ constraint = false ]; + + +label = "Some Of The Data Signed By Default" +} diff --git a/docs/img/dev/en-signing-output-to-spend.png b/docs/img/dev/en-signing-output-to-spend.png new file mode 100644 index 0000000000000000000000000000000000000000..bec0cb9a4e614fa74f99c3f9dbadc22ec99ecfa5 GIT binary patch literal 8761 zcmZ{KbzIY5)c;0@bc2LQNk}&+Akrx?Cgmihr5gr_G$_JQNYC>z2~0K`+TDHbW}-*7>NJ?0ExPq@)H063k(1N$p|n5fF_rf z5zG&krKYMf;5ss~uN45ev#+kKXy`k+l^GOBJ>Jmuk(^EQ>(tMPUCMU~1Z+=u+$%=N z*wnBrP<+{x%~7Csx@;5j{Ayla_8hiPV_{=TuFj7Y9dLoMv^34e@L6`j*Lu$Yp&VH3 z5Z~UUHy7Ki9s_+J`Uh-%JO-RTXUwgRHhz#k$neNIu<`cxUOgtSuBMLiB&rqzn=tYV zkicLtJWb8;{Cw2N$Oy#V9${&r+UY=eR)eRR^dN7u#l%dY(*f}*v__p9W%!H)LmZAF zh1etR?+iX=gsT8)DQa#v4u%xB(*%_29&A38VB-=8$7A!)_f=hnL2G2aW+pCu91&vR zh1TQDLqLnYz5QrlHttqZus_8spL2f^V*v8U3Y^nbxX$@pk~pdS1nEEwRZzw;9PHoM zk;CWJN*sllAKAfAu|p^PI61#RB<$f6=nr62i2NQD$qiIMQ=pUT-kY?D?4kBkE`3e$ zV0&{N4fwj+?}3a)1%u$!OL5wo3+i7_Zc*EW$Ao^F0F?V?0aNC!1pH#(?GCG-Q2LrO zf#o0IC)k9MuGJ|8bv7b=h31O^ymD+y50Qm=?>w&X08cqFDxzqUZ)gP;m(um9^x`qT zi0}|_vV$)=0TlWRjsQYOk6T4yxUgZg2aA-3!fk-(waICWBZ9G?!BPF${9bcXQjRY4 zbt;TBgc7;cK_}^j1D&zo7~K9yP#S?@^G0TP;Jb3Md9gw{{m$JMCz=5}%8L}jdm;*LiI+NnM{#}fQMBYntXeMv<1wx5N+ywDWkA9S+Q0ijEr`twu zbJ#@{kkR7s@kas2>2DicTHVT&xc*1-%v?cq8fV2VQI8Me9=n^Q$rA5WUCqi>ql=2WzCyIfpZh~aNJb;P z-@(^y$7Hj_jF*QE(%A2*fKx}CZ!QZ9(p@8_|5|HosckML+=3ajB3W#;b>9HdZVhK; z-(1=zDd-5F-$T;jf|^utX(dT{bn%&S2kH)>7w=}R3hE;Itoa8{QiDFu&mvJGaxCA> zsE1c_hC>fQ$F>ZE=@14T94FHitF_s-4(EwNB~%iW#IT;(L!=?ubuRr-0P5Npa<}%L z_5-h{VK$s!>;1eyCx$N?{;LlMME(1yRoFI5-cECGbAvBKD2_3U< z-(B}tUiu%8%7|JgQdL$gBzHPfk~bFeoHyVkTLO&F=~Jl<*k~T{qyZvj4+&oKDkDsu zNUakBu#4~5ivg+)CLXO$LImDSKW+q|S2aexBmrU-s?cjf8n}9s(swm%cxV%2f@kJcxB@Ckgy9%f;#{W;&>u}W zZOTAR`WhXSO5i>Va-XE*QS^+rT35o3jY@KTK)-Hs`%6_&TXuYCK+X`7Qub40rxqZl zB2dy0VW`!~3eU*cy?UzZ*|}e3$_~{#HBy{n)`4v4%;>cUdnGC(T)+mp2q;w*-s?u% zuPo9(rzCRAMXg^VHkr|c=t%R2gr{-&mLkCr=bhoDyLCvBE!dBx?)MLS2;mnt09b

FvS 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 G_WuC4?Z_ek literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-signing-output-to-spend.svg b/docs/img/dev/en-signing-output-to-spend.svg new file mode 100644 index 000000000..a0551595f --- /dev/null +++ b/docs/img/dev/en-signing-output-to-spend.svg @@ -0,0 +1,143 @@ + + + + + + +blockchain + +Some Of The Data Signed By Default +cluster_tx1 + +Transaction 1 (TX 1) + +cluster_sig + +           Signed Data + +cluster_tx2 + +Transaction 2 + +cluster_bob + +Bob's Computer + +cluster_tx2t + +TX2 Template + + +tx1_txid + +TXID + + + + +tx2_tx1_txid + +TXID + + +tx1_txid->tx2_tx1_txid + + + + +tx1_vout + +Output Index Number + + + + +tx2_tx1_vout + +Output Index Number + + +tx1_vout->tx2_tx1_vout + + + + +tx1_script + +Pubkey Script + + + +tx1_script->sig_tx1_script + + + + + + + +tx2_script + +Pubkey Script + + + + +tx2_amount + +Amount + + + + +tx2_signature + +Signature + + +signature->tx2_signature + + + + +public_key + +Full Public Key + + +private_key + +Private Key + + +private_key->signature + + + + +tx2t_script + +Pubkey Script + + + +tx2t_script->tx2_script + + + + +tx2t_amount + +Amount + + + +tx2t_amount->tx2_amount + + + + + diff --git a/docs/img/dev/en-soft-fork.dot b/docs/img/dev/en-soft-fork.dot new file mode 100644 index 000000000..830a4a9d2 --- /dev/null +++ b/docs/img/dev/en-soft-fork.dot @@ -0,0 +1,47 @@ +digraph { + +size=6.25; +rankdir=LR +//splines = ortho; +ranksep = 0.2; +nodesep = 0.1; + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", label = "", width=0.3, height=0.3 ] +graph [ penwidth = 1.75, fontname="Sans" ] + +invis1 [ shape = "none", label = "Blocks\nFrom\nUpgraded\nNodes" ] +invis0 [ shape = "none", label = "Blocks\nFrom Non-\nUpgraded\nNodes" ]; + +subgraph cluster_honest { +block0 [ label = "Follows\nOld\nRules" ]; +block1 [ label = "Follows\nOld\nRules" ]; +block2_1 [ label = "Follows Old Rules\nBut Violates\nNew Rules", style = "filled" ]; + +block2_1 -> block4 [ style = "invis", minlen = 2 ]; + +block4 [ label = "Follows\nOld\nRules" ]; + +style = "invis"; +} + + +subgraph cluster_attack { +block2 [ label = "Follows\nOld & New\nRules" ]; +block3 [ label = "Follows\nOld & New\nRules" ]; + +style = "invis" +} + + + +invis0 -> block0 [ minlen = 2, style = "dashed" ]; + +block0 -> block1 -> block2 -> block3 -> block4; + +block1 -> block2_1 + + + +label = "A Soft Fork: Blocks Violating New Rules Are Made Stale By The Upgraded Mining Majority" +} diff --git a/docs/img/dev/en-soft-fork.png b/docs/img/dev/en-soft-fork.png new file mode 100644 index 0000000000000000000000000000000000000000..335c83004cb215168021b4334e176a5132aa6dbe GIT binary patch literal 6798 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 Zl80_BH#6~P`M(dEbTkZZRjR|I{s(Hn=D+{| literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-soft-fork.svg b/docs/img/dev/en-soft-fork.svg new file mode 100644 index 000000000..48bc07f5e --- /dev/null +++ b/docs/img/dev/en-soft-fork.svg @@ -0,0 +1,105 @@ + + + + + + +_anonymous_0 + +A Soft Fork:  Blocks Violating New Rules Are Made Stale By The Upgraded Mining Majority +cluster_honest + +cluster_attack + + +invis1 +Blocks +From +Upgraded +Nodes + + +invis0 +Blocks +From Non- +Upgraded +Nodes + + +block0 + +Follows +Old +Rules + + +invis0->block0 + + + + +block1 + +Follows +Old +Rules + + +block0->block1 + + + + +block2_1 + +Follows Old Rules +But Violates +New Rules + + +block1->block2_1 + + + + +block2 + +Follows +Old & New +Rules + + +block1->block2 + + + + +block4 + +Follows +Old +Rules + + + +block3 + +Follows +Old & New +Rules + + +block2->block3 + + + + +block3->block4 + + + + + diff --git a/docs/img/dev/en-solo-mining-overview.dot b/docs/img/dev/en-solo-mining-overview.dot new file mode 100644 index 000000000..ddf3eebe3 --- /dev/null +++ b/docs/img/dev/en-solo-mining-overview.dot @@ -0,0 +1,25 @@ +digraph { + +size=6.25; +rankdir=LR +node [ shape = "box" ] +splines = ortho; +//ranksep = 10; +nodesep = 0.5; + +p2pnetwork [ label = "P2P\nNetwork" ] +asic0 [ label = "ASIC" ]; +software [ label = "Mining\nSoftware" ] +pool0 [ label = "dashd" ]; + +pool0 -> software [ label = "Block\nTemplate→" ]; +p2pnetwork -> pool0 [ label = "TXes→" ]; +pool0 -> p2pnetwork [ label = "←Blocks" ]; + +software -> asic0 [ label = "Block\nHeaders &\nTargets→" ]; +asic0 -> software [ label = "←Headers\nBelow\nTarget" ]; + +software -> pool0 [ constraint = false, label = "←Blocks" ]; + +label = "Solo Dash Mining Workflow" +} diff --git a/docs/img/dev/en-solo-mining-overview.png b/docs/img/dev/en-solo-mining-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..01d849a5e11704a2e46e41035ee6214a03358531 GIT binary patch literal 5231 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 C=GqJZ literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-solo-mining-overview.svg b/docs/img/dev/en-solo-mining-overview.svg new file mode 100644 index 000000000..4d97fde35 --- /dev/null +++ b/docs/img/dev/en-solo-mining-overview.svg @@ -0,0 +1,77 @@ + + + + + + +_anonymous_0 + +Solo Bitcoin Mining Workflow + +p2pnetwork + +P2P +Network + + +pool0 + +bitcoind + + +p2pnetwork->pool0 + + +TXes→ + + +asic0 + +ASIC + + +software + +Mining +Software + + +asic0->software + + +←Headers +Below +Target + + +software->asic0 + + +Block +Headers & +Targets→ + + +software->pool0 + + +←Blocks + + +pool0->p2pnetwork + + +←Blocks + + +pool0->software + + +Block +Template→ + + + diff --git a/docs/img/dev/en-transaction-propagation.dot b/docs/img/dev/en-transaction-propagation.dot new file mode 100644 index 000000000..33fd6e7d1 --- /dev/null +++ b/docs/img/dev/en-transaction-propagation.dot @@ -0,0 +1,86 @@ +digraph blockchain { + +//splines = "ortho"; +rankdir=LR; +ranksep=0.1; +size=6.25; + +node [ shape = box ] + +subgraph cluster_tx0 { + label = "Transaction 0\n(TX 0)" + + tx0_input0 [ label = "input0" ] + + tx0_output0 [ label = "output0" ] + tx0_output1 [ label = "output1" ] +} + +subgraph cluster_tx1 { + label = "TX 1" + + tx1_input0 [ label = "input0" ] + + tx1_output0 [ label = "output0" ] +} + +subgraph cluster_tx2 { + label = "TX 2" + + tx2_input0 [ label = "input0" ] + + tx2_output0 [ label = "output0" ] + tx2_output1 [ label = "output1" ] +} + +subgraph cluster_tx3 { + label = "TX 3" + + tx3_input0 [ label = "input0" ] + + tx3_output0 [ label = "output0" ] +} + +subgraph cluster_tx4 { + label = "TX 4" + + tx4_input0 [ label = "input0" ] + + tx4_output0 [ label = "output0" ] +} + +subgraph cluster_tx5 { + label = "TX 5" + + tx5_input0 [ label = "input0" ] + + tx5_output0 [ label = "output0" ] +} + +subgraph cluster_tx6 { + label = "TX 6" + + tx6_input0 [ label = "input0" ] + tx6_input1 [ label = "input1" ] + + tx6_output0 [ label = "output0" ] +} +txold [ style = "invis", label = "", width = 0, height = 0 ]; +utxo0 [ style = "invis", label = "", width = 0, height = 0 ]; +//spacer0 [ style = "invis", label = "", width = 0, height = 0 ]; +//tx3_output0 -> spacer0 -> utxo0 [ style = invis ]; +//tx6_input0 -> utxo0 [style = invis]; +utxo1 [ style = "invis", label = "", width = 0, height = 0 ]; + +txold -> tx0_input0 [ label = "100,000\n(100k)\nduffs", style = dotted ] +tx0_output0 -> tx1_input0 [ label = "40k" ] +tx0_output1 -> tx2_input0 [ label = "50k" ] +tx1_output0 -> tx3_input0 [ label = "30k" ] +tx2_output0 -> tx4_input0 [ label = "20k" ] +tx2_output1 -> tx5_input0 [ label = "20k"] +tx4_output0 -> tx6_input0 [ label = "10k" ] +tx5_output0 -> tx6_input1 [ label = "10k" ] +tx3_output0 -> utxo0 [ style=dashed, labelfloat = true, minlen = 2, label = "20k Unspent TX\nOutput (UTXO)" ] +tx6_output0 -> utxo1 [ style=dashed, label = "10k\nUTXO" ] +label = "Triple-Entry Bookkeeping (Transaction-To-Transaction Payments) As Used By Dash" +} diff --git a/docs/img/dev/en-transaction-propagation.png b/docs/img/dev/en-transaction-propagation.png new file mode 100644 index 0000000000000000000000000000000000000000..0c52e5eeadd07b0b9b3f72be4efb3d074761c22e GIT binary patch literal 44781 zcmbTe2RxU1|3CiGGK!28Dk7VZNMw{mMun{GS!S|lNRknf5fWvTJ<4d1C<$eSB$QD^ zR#vk9&#QBv``q90|NnoF-{Zc|ea^Y#^SQ3~^?tuz&-J=O)lVr=Q?XEyNF-|I6AGFn z(mFl-#Y3?P|BnJa&l~)0lewyr0%?u-&)v!gF(lF+lCr{4Ezjg1yLyoq8jpQk+9q32Ij_%>87oi09z-iY z5)plGJuUIiSvH*2^u#~398fO8pHQ&Rs?iG)KSLoCvqAOGPdESH{77CTz9H@YA&-e& zhuwdOxH5GlMMu-U45ohB*Vor_kAnTx-e`Qj%-Qk_yA8@OWEwql52nfNmhztE<>uzD zSm^T!ra4Z*&Kk<8CqL3EP*_njP#aFYTe0-(#6+ZKLyH;l2{Dp-e{RT|d#~Qs8!0J5 z{^wi0;1gA-5e2*LX69=8v?M1dC%)2( z^UW#Usj0p{m38v;F6ZV7kdcukOSy%eynWEj-rlg)jEY?$9}mS_JzjEuM}0@Gu2=un z9sC*NdzB);U`cLrsU}Fea8FN9Gqy$j`t+sx3bUj$=h34_ud|5fylNH32K>GEU%#$> zR!eJJv)r2WyW0}v6HV3GA&U~J`K3kxIE~ z2~|~9dwcr?al7p+OA8PDR(=Q5DB}*qn5)~aJZuWh4l}o~aPsir5f(n}lXvQll&7cX zNM+&OyL-GBCL$6OnJ;=owqQR{Zr=Rf$7H}!K(`=6IfmQ5uOiW9xM{yl8|SfWoI$kW zDV%!VQ+FlzW3kS6E&wucs0ttR=e&ZJ)7B}pI9(xNW=dt@)STEdH^$*QeAE9;A~ z&wqS;bdCL3a7&Tdv2Sk^)8Bu~(a!z#<;vEn+1a7Wg+77eeEI0;=(nkIsb9XBVpmDx z43W+^C9@wse0yr@;%cbBRfJ#jwXk$pyqaoe`6oe~## z85kJiVq((U-oIzOE4%v3LR($^uDQ8+Y;ke%Q>Ve;vXcS=0&z)6IX{2?Y+qiSQMFg) z%S=m8@9>$dd>~VPI#srzu~Bu2Sv@o~w7Z#nD{K3cO{Y(vo_i@Hj=xET}EsP%#NTvKv3R#`p!((BqEXkNngyj*?tbrYuphhV>T3Dr#pSN9E?PFWD8=;tIyV2IraOlXpSp%_qGlnr zRQdahu~5r+&+d_vOKrR*Z1)NKMDpdetvp;@SEmQ-Zgp*cQQh*G`!PniXE-o&M1L49W-KDwn`Z$$mpEz6L`Q1X1QdE4pR&OK5;*~zmzFWpScH`#l zB#}$MU7J#5a`$~IGFyM?_iS}fkKyp~z%vg{nK?S1*4JmL^qy-w8&J|x8@_{*hGx?q zY3bxtzu(z`g$mgGtcgR$^%Ez#aj_^8Z<8e%JUl!|KWApblg~V8>Mc~}%akeeTk+ns zh3UxcgAQE}tv2I3_=@wF)&j&NB!pcm`1tsSzJ85POw5)kJRZJ%d2u+Ecr-Y8ocs2j z9M;1XICPirxkwKlcmLEeEs&V?V(kpbKR$W1Bp|qviUB8va-)>;{UX=Eyw8vWu7?=ZXz)= zGfUNNR*ISEd6F*UKHe=(&%p4+Wtc`OinSxfV`<*u4jzRI8ERh(t3io1U3`3e(ABHa zckaAn^Iz7mH~9GRW5wdP+t@BeuHQ9LqV=BpN>;6{J}cXI`0!zD!o{(|D%anQ@7~qE zdKI+a;&qYtoUOykaeT^SJ+`{vBc6KJcsjoMyi`g~5yL@ls`aM4$9u>89=G(jV zdpI}(XJ=iv@6+G#VmQ^m;G{VR2L}ZurP=E8qM&g_0{&pzCmlQ!)aHt%iDwmSt4p&J zy|;0!z2`K(bVi8?{bjlaLYzpJ}j z)OqMc{62&E7l$UT?CexeoS?XT`LdwV({29#{()Dn*mUM4`c)B7q2`5HPR99Tftjke z9y)%0ZqBnVyg|3h?~>p0w9>9!ySD6BDPCS#sekh(>*wZ19jl3n3D+N8bS5Sy$F6Y% z(MBntJN=(RkRQ=H&L|W-qM|p^T^?QNmD;s?w_8KhF3FlQhffzTUi=azw`$r|WY&E$ zNLAq3=PRS5xv4oLpB$@dYia@|UA_^g`O%{T9uqxgXsVB&J&TEsuJ&JBGC`BBMMGMg zdbt%vsT%A5wei->@3F%59un7B51iX_>>7<#&toUo$-c@HCS1L_j~^cb<_NQI7sS4pgUL> zrMq$C#@hM0yFQG&cjwPfelA?F6Wsdo$CGa{?^3SPir4Oy<0vUD-8b*4u1;I&v+(-u z+byI62M%na*>yrsPcPf*tBq3Xik5i!g+7Vr&wf0u{pe!9ys_V+)%f`xJ8o%?E&TX+W@#qov}}DCqrf50sXf@K zYAMo*XmWQV?oTe<^~r3t9_cDhcQ17(AZct~4SgQ45L&xyq_}N+Ncaxne?HshJ-3wG z=xodIR#xeR=)Fqx+qS*R(nwd?wZg9z?}MJj!?AZSn-n)bDXlE4XhUOH7t`Loz2C%H zs9(Q+of#kZVE3i@GjT)TzB%{TT%~8LijT|8edOKx3tCTL$HD)1AG- z!jsVh1a7u{s^lGBB=+A*AiJDg)vJd;OVXSDa&E@PZbOkRE-LaIIjB=$2pn;;tHSF5 zYPES=hO(f^^NLr$w?1vYC}GxEU*8X)GnD-x#e1Y{!>&UY1J;&@<$`I_+bULnkKwGe z61Z0(GrNc`50KUA_pHqw3xKGKshZ9Iz5y|Z?rk{KqN1X#qs!Q<#r|u4ICa2n)pd2( z7zK2SEb1cZoB0|m8{WKmfkilc_}R5E)#ZISN|RM#C@*kD6 zZSBghr6r<70ll#4dHm=q#&eEEA*rJ0IFJXJVPR!en=I+Vs`sI{_fF*Q!vkYu29(j1 z>+IB@$LgGA#$E#Pbn54Fm@Tk4M#_4W}H>AYj=unPR zEn+!nA5vAdwpUm~ondzT(=Dv7%j}58mDhATc3cCIyKv#crif!W?pZ?o_KCsQwA*xq zO0{t`_RpR%Jb(WDqA^hmowJZS1>(?#kMmzEh$_w5+J*5=6%j{E`!=XcmrU1c2?7Kv| zOYL-R&z?KSO-DyZ)QwlK6!3uZ-k&ox+yxSONK#U}{VQ=x^08U+^m!vA*3K?2#N)c? z!6qs!T*xs8*h)!3VTuNjkeC=97k3rV*r3e5x~3-W)kB^X&vocc+^16v?bn1WXXybV z2T-GDM_SW4gfxg+m!{zDui!b>xv$LebHSql4`o%M4I4MMKJ#z{FCmE>IA8(j2qY1w zzsb~6%X?%!IgRD}`zMEnhDHV-{<-A_wMoj(nyZ_=7QfzV)LNM8e|emBP*PH|*kiI! zvvJ~9Vq)m++dGAy|Kb1uqQ1EBt{l(yp>=E8wF-LT&O)xGFKn>GXM%iWtGO}I(-##N zw@P+qY3#*u)U*A#LbK~oz?CcO0m$(nb$u$Za}^X7Z|7 zn#!gcFK7l*@~WjkZ_6 ze3@Re6dDmxi=AIlA$@n&>n1_$?|;~kYxDkoLPElg=xB}mzrhLyXTQIfsv8&_BTZ#FN*~*`MVxIW?|0>22w)7&Nh0UF*PjXGcRKKh8E}I4Ne(JU4@R7 zH4^xtwYBx}dIpOHMWq52rhp9FgCwmmr<0@y-lc2*l$rXuCK2zYSpmq z&hv`OO0ub+KRHlk4PDp)PnS2A-eYc7^@J!%DWc{0uy& zGVp*Q@Aoqcp}dhUbCPO0lEW|o$(9;Es;s0vqF zj;PyK)a*Dk;jiFVNV8iicCmG(vO$V?nn6O9JbL)pEkGV5O9eg@kDK?%mtd)5BjmN$%wCer}}Y9-u-E zI%`7gAFGm)3z60!`&)q6NqPDC0JisVmw%)rh#S^yW1l{Lj80Cz zURo;t{Q2|8PoEBqk4FH-x(iwMTlk~U)V^PmProYVG4VEB__?0OyITz(KPFyYPtKCz z$UeJ|hv%BxSSK0n_U-pC{n$-MchuYase5@Kz>MK-d$K&EXYu%!8*y>RuhHx-37^_T zPR_u@bmEqf5!iJGs3f4y5uXXH(e(U0D!1bKlp(aq>4k+4i9Dd>X`YNvf8SS3&wleQ z*RV=nYXi>0b|J$zsGFsA+$WPVRu)$mL$3CD4euULt6FHXnw_0}_5S^tB`{R~PRU6? z%zpgU>L=uoV(AbAS_f%P#kYjN;XW?A)I29BtC!!+YX%2?U|_)d{e5a6lDLnhw55vu zY^w`$qT8Y-aER3sL@tx9-^3&pYdeO{Ti4zmi-L|0%FeHq$)!igG2mW=aD&Dw%A*I! zg}qI;d-ut~*AZxDg7XQq0~5Y^Kq4gIXJ&~DyT(72OI*|vzotoLV1UN+(R@TbCm%xB zj1)d90Kp_SMCnjQ=d4;LUlv*4-Q7(Eu$)buVP zYKG|NYqHVBdpOlVj+ns`m|wU+a|EmXYh~ec_$~$%$Dk|~e(7p7&>bifXh#rF3(l1J zE;_%C+^uSE&aw8ZP7Y}5{O{TCoZQ^bV94XQ&)@`Qn!OCJm~B%%9_i)d^T@V?e|4d1 zZ5sVp9bn}Sv4XNX)@ZBI-7~_|MkmLP*9Nn;bu~2p-D3sDe+iA zOA4k|v7tDqnM49`NxO7)b&W60X``j>RlNSC^n-Ca?(o;*qSHtVJ8u4pV){LebVXlu z=k6KZeErPccLN}Ywe!(8Z`PpDTDND>0bh21-yu)2lGU=Iv90YU8mvrF-jGr(JS>$%j2AT7YTXCwf9- zVi-OYnmmA9*gf;^?c1s8X?EcAiQZ>BY)tr$qitb1zLkIWvj9ScXc`7BPODp-O5?q@ zbs$8M*IuCd z;$7l_YmghBx_*}r-@Xs}7%xiK0MyYE$Iq-NZIBicMXjjpJ`{X~8qzTl-kG7yFmCRO z&T^eqh9y%g+Tyg#+%|weV8R=C9)QNhWn~3#8gs;Oem%Xsv_0iCG&H2wmS@Bq`*sCD zErImZg$@b<%+kuLe_)^nc*Aobl!srMmEHC*!Act;RAsL$*7KxV)`l^n64KMszQ{iF zpsU2@Om^cyd!b1xj-;L3WLNQ(I04;J94F}{s*^=;-@RKzGyjFZO6t%-A;*^qcZ1mK z6`Nl@wK5RddpJq^qhjPPWoKtml=0Uc9omHkB=Ayl^tH-T-Q=z=y`J7)H`cG4{tY1m zp82b?LK?&4f%c?jEgc-2l+>VWa;Y|eY`t~QC)bA+RFMC&x?|Z%DgdtpVg|2 z>->+icx?5=4}t=Zd?;j#fUy3>`fAp0{#iORhl|h^A|aKah7^~UW}>+OD$GT*o%uFA z{K)yM%6LUsO)BX5O9-IWT}A9J-`asdCcAYAhe^mcMk6efD$@5G?c**g)Qx~FmWlvPBh5Ge}!@9&YgEG zYGqb|lsO?~;gmT+V5SNuWK)zymmgjGA3k~{kjJL61Z5F|{mZjB`w)rm9LcZB;TIRzKIla!x>G@H*ep*>h6B}$|R*~^|ycu zA7M-ZB8JC;lM$UDt<~DPGw*D%L&k##F3>@-Yi*!H6uSwTJXh1v*$%lw%(~@nm(&g+ zLlW=)_`Ezp{K<7NK42-=Vh6)2zdO*L&Y;@=`0*nwKRtHf+q>H@dbNL8n44#vc|Zdx zUGd51mM07Qwfo)XCO@+Q-bAs=ylHM8#!ev~q@&~307yxYSn+Q}g}?{sT3U3F=S!S} zca#ySn9jGLqZFJGYYwwbHnlMnWchQ##-(j`|-Id6(s&{t2Ih#|D$Hv!8l#x)>Fa4 zo3S$E(rWBMtXbxQdPPUba&!xgYZ(PHV@E$%Rjq4>bgz-QYQtmyKC~8n#jU&OTIl^7N^# z9QmeA{6~hnfG0BoMAsO$ZPPNpzCZ{f3x3A~RMgZ2XNKXC@v5pel6O{C<*D8h8pXYK zgjzvu%z=7h6#1<#Ts=#DBFeksHqNVG$O z*|J+P6qqQsvhq^q0_FdSe&gco-0t!D(gV=6k~$#ThS|@*)5ES`*Mdt{IOP{4Qeu8h z6r}pPCS;}rdWJ`Z&wo>8ZaZ+kNw65ME4K=tvG?~(^Txw&qd}TE?ThPHS66v6QMEln z-JY+^8^mg&F~#Ze$jPx~Zo`uoE~|iW!<(sc$NvC`POPTX=HGFz+uI2dEQN3z*02BG zp3Q((p_SOwLH;+~*5(_FV2meo9qT-~Wc^Sb9j-e5I&UE)dm30)Qm!NF8F_h8a$EnC zJuh6ogo?xDrE3Vsjf2<`aRin&6*I|Pz(DLu$W!)RjN53$`^9-L;w5p#>z zkaQc}2B46Unc14FTWIcYVukkT@=YyCoa|d#+uvCLJH;bMNCG-}FM4|`)zlIeR=U5O3UtWVO-(dlnXncCx3N;O=)&$lx~kFF8X2qD31(jwr5I$ zp3NyTY>zM8iHl=|bknMOT|Q)>-XO@^)Y4J`;%8A=**U0KzH2KB%OG36v#mdRweb&Ce-0A6`#5jCHwot$s{pl zKDPzd*L8KdIKbJ!pxJ?efueIRbEDdG&Hk%r65*jjTjc}IzvHD#D3!WBrEzboa~3UW z;8Z!$>WlIje$D=hoFz79DkBg&h2zJgV`A3dy|ny&a4@~nc&MxI5+W>4f)N1l0 zz;}rUy9)AEyq9gxpRZG5yR_j29J!*>(ysu}FPodAz^z>te}3g~;NszVU+!q)d+E~I zGJ9qs{(*HvA4-8OwlzZWB`BZOv?A!pRm+<`)aqDW99OI87v_hgq(;@2$wzvg9Jq7X zLrBvDV7z;y9vRNxo7WLL!`q+1zC(5V3Q99PUjF$UIJ7jNwN!YpAM9$l8zOF_S~A8^ zVnasd5ou}YhXqfl!-PWzk}d_y++OCufk*V8Ew{mloT=X{&))C_pRJaBC>ot(KU}X! zHaTN+XD+acHx%)-TZ`;I2;m2mAO!yU{vfsF6Fs3Wav{hPLca_abe&Bu1&RuQtJhe5 z`Ig*KINMN_|>l*d-ddd2BBFHa0Ki794;gMLMtwa zT?GLMc@jY?aqB2k5ulzI0g99ha5>V5GSHXyK~5mr8FC!`uRMcq#DO5>gphsMo}kVLUl5`1^k@$(sw3tqxJH zPzr@$eEK3mQhOosO!Ps=KEvFFupix}0-(K!!o+cii^rXoUCijTf6;gU^h>g4 zpHq+H1SQM(ly!3I!SOeRK36f*bQtNN8W;r85aLb*a=ntlcPJbS-eLw#OX~Kz4_e4K zynx@-Vn*^WeAQRxU_h9TME$?=`T(9JD41mn(-yO@4RN@EMwlEq{>y`G8_3Ba^HA+z zV7QW+nu@?rno9JBTzW5{yRToZMnr5QpnQHA96W~pkoQUm%u%zR(?eqrLf#*t9_=*+ zDVVcFKt>@mhE7l;eHVfj#TIq&r)yBH8zGlikKDi`YnK-d2Ujv&p&zzy&9Y&iLjO>+`52{XWYil&F;0E|23X%xmnX6t}U}i=J zp?|Z8+Xhuu%3x2ukKZlnyg^P*E?)3#4U~$|s3@KT2VxL>BHYYUyANBKo`AmHPzp-x zmhxYf1{(vdr-y`@o11&@7=4_=-<%RPMjX|5zim6OvCp`8tmglgv-$EDw58ttoHlJc zVoDn00Ae%MJ^3Gzr-vy`?Jo_*RWtlh~9D5nk+;L!7@mO9q zHipBvE^_=V`>#fIsY)j6IJoNgg_sfNa2i?^)|u&A8n;#M8xfF{|*w z_D}-1B!peLm01Qh-zhREXX38b18dvLpU1LeRUZQF!e1$^d%pZr70qjEZjMlyfh|aA z>OdvrpiSGhZ6lf5+NxMuaz68z1bArQ^FcisH#o`}7?+vjTPWYoDN3%YMG2aA4$=kz z4G8%VI%;hTySBkUbl$MgA@jk5TaTZ&!%Vn$?MAd z9r-J=(Dmt)OMlHql;`3{j|S7DWY?KudlKayX+3J39vr{KLr!T;w?k{6xPGSx3V@K; z^632ON?~g|WRCcD*64OjYKJ5#&%5=9K*vE*nNw z_jb%Jnac!6WPMWgv*_W&0UUX*cw`O|VW{qqltrND{^`_$l?tapMRYd3Z+?ZmXZH%eO74^hA*CeABL)moFhF zb4y9F?AWmbS%8Z!E_-EUcHe#L@b1px^0#BE9j=h);rybWS0lUTi7jT+^LRfVZ?d%4 z&wHQVH8-C}oh`BZKyzei2Iz+g<|@#zWmB>waQcd|>e4B)MdPbkf-14r^*6a1IyyR9 z%-Rphtt~$qeg7cJ8@;px+GL||3Pfy`Q>O}EykUKZvepqq$)J)y)21p6-6>17bol%C zY;??>h*m5vE{^^yE|zom?h!H~uV&yrIb4&vnTo0%^@H&)I7c2X`5u-Ydt;PO90(vY zmfyudg|7pw$8F#hpS`wn7nr@6KXoVPOnJt*34~103=#s3C@-N<_OQb(`YOEeY&2 zE9_f5lz6&A8mbg(#&T|46dax8N0Et5{6asJ7o=SvfZ35N3J0tcdN$Djp)%&#Zu78q9lC$sC6 zO?xWQ4`|B-(%ju_<$%oD4oKY4BlnAocN7ShqFXjR=F$$50ylAXdgYb0@salisM&ZTwP;_M%f{k z1fXdWKpQm!xYh~^$&22&H|s&U+cGytMn;xcw+5oW-?)9d@gH~RQzs7h6X&l~km+1U zT8^G~8GKlVWLd6}i7kE)?3H2HE;ZaE|4JW|O8;Ot(y~)H+|CfJV93^2tWKne8Wopx-r@9B(kIob(JA5fVD}@zbYU*%K&T4J+HtytLvbwfVfl z)k6jd8X&IMzkJ(=O(1mi^mASI99abCv+m(oCQ3N6lHkpHpY1hbNL6ZXa>c-^EXZZL>5L8k$nHJKTb=m%N%Y} z9W(-jFmR603TxiIi-1k%Tq+JPl!i_AIy&E}J*c2#L zBfZZgK)jKQt$6DoDJ6v*1qTr(8?c9svqRW8uVUw!mz+F2E@%bEu4#PtTN;-*c1`^| zDzROy#|pyGOi~;Ekl~yVf~*0t%PtNvkgi|9j_@`ozyOQ_NUW}-JDC~fer2^<7nPTj zzj*m_JNvxSifMRfv39T3W^~Rs6Ro#RykH z_c0zaYH9S;74;eWBAN8tEB`SkFA z5r`05$kUu8B3v4G-t5ZbfA#ilUi(}o^4Zg~v+c0$hf_=C{D0Q-bW{HP<2l?%DgbdjoSd(~Qw=a{kqOy0nC4iBIgy#_&^6hQnG-~v>_;vt zFoNpSdba_j`T-&67dv|#Cu|O^#C}(%v|u9F05SR-{J=wp4--7)4wuvatRaMS07@d_ z_0tmlr7_mDwyy4xY4tinZaF+z@e=BS&4+^BBm$NLvE>;)xd~NaU~hs#_EqEjQJ*P}%m#2<_6C<5u24#rIGm`T3OT&mm46T(= zRgl7>_C3ycB9#7LYPqcQ;m*!Zes=bwTj{jr&fHhi@bmNYwrRxCgRV4|xsRPy(aq7uGj63Y7J{f6pKwkZazU;`NOgEqOyvr6Z1!o`Jz&e?PKWWPtfU`YLa?w6t&- zlyxZl=`mU2Q0HOxT%Lav5kU=uum-yD-*%l##_1H1!5C2QacO94HIh`^D-Hu3C5;zh#F%ed3eD?=@ z%A2MpZpU{+d1^gE9WVpe2Y|C8Bl8ZTVl(t` zsOm)iX3K7=lJ@_|Pko6l*ldcRC2G`7JX?q{+5;oHCpn3xAEM7EAP|m`9GE~EGKBRt zq;XdJu{AD35aN!HV@DRkAd+~hsU0WMHOjsyBwcsrRd8s*y ze@6dG+mNeC#OxH5xA&}eC?+7nQgdx>ZHQ1r%+J)v@W2|NhC1PG%7!yQ{soNccmvGZ zQkTjJZOoGFSniNnsxL69N`XS#3S|)e-O%0y65XD?d)GgHHblf5{t9MIf#9ddrXdEl z^@nQef8?VPiLih($=G&U`(Mj-9>^LCto5wWwm*3O?>6K%_*a^*B=yRbD`4QP;1_o?ti?(kK5c(|xcmnc`@*J3 zRTyzmpBcPRWb+J0URA17zo7F1sI_z#GR-fceg!brj+-1OpqLjUfFYe5s!vg z#;VmhVT>}^7FjjMBQZ~X1TjED#Np-+#?D3}HyopKXh#W2NthWSx|?2=U**BGz~)>? zcOXb1pu5i_d9dPu3HS3zO_-yW5@v~2 z<93HYH%AU+#EC|F`I$>9Vw^9L>zkUH0eingq*Q8ltxL~@#Cnq#GtaCQCAPRefu^bNtsT* zel5x#S2aE3Ipif^i!(~HGBR!qz{n0pw}5+L_%>hNyn}*<2EJ1y+zyHW=y&^}ff52E zO3;auC#?ovg&t?EVoZ|pIhcBBo*Ad24!aW+MKcT{>TTjLJjrz)!|o>&MXzFc$)?bT zadH%}4{%;yAQONXDJ1s1leCDGhyTSn!7eUibFL?JNtD?Hd^`rbh#(#&L~%BjUpz;A zC=%x#wSEvoXM*!dk*qQ~Cp#g_G(C12wC;T>P9hRIudg$UUFb_rvi(%##Upy09+@AUu2w6@A1|*dqViEa zI@rsLkmMT0GmI1enu#%;9;hWoV4XcY9-!U-`u!V8L37N0Z37$QaE$F0z*uHTNJzux zoG@sVX4o8D@s1ctL<$laUv;me9qQ0!5H&z_8Y(hx@O4w|n<#JbzsheX{eV721Yrmi zq4Eem1{^TZ-fMVe+*4>52YVtWo)LVESrAd)vfM{^5-rkUVN6;{r(KtXy1-vIcw6t@z0N5EtnEZvzpbAugoxBGbsQ__ zwxgqcSQ_y-J7I!Q4AkYUirZ(jc{S1y%HxGB@Mj|WFNy7-D-&0eq|5yz5i|MBc_fpw zSZAxIK@%A7A|QMZMe_mbxv_a~VBoqt&1gV6Sbaiu^A24&`nN!)@_ozgj*uGB-ykc_cTC#3Ai=e`RfL_4DrG=F~q!QGda@ zlXy1=ONUMUYdO-z2Jyh0Q>F|i8=DLsINpEYOT=FF0Tzib>3x7Kllb^na)0RvP}1ak~tpQZiscbdEUR?h=Ee3`wG-&U1|xnx8^ z!r=|9|I*)2%rZ2~E(t<4-76*a)X;&E=dbApQ#(6@Z!WCb%IO#{^1n(DbKLUm&qJkB zut-8|e}KV|KzX+DsbWkY2+?=`F}3B1KbB7J(W+jSisO z!boApM4<1^&Ul16w;TAOhgXiLcjLVQ=4)*G3jaMG(IRP#+!YC_s53*!(BF}qW6h~* zQ>nxDS`x&PoJ8-?dPdWU%J1ga>d;km8GeH)hNfq_=b=+Tn&82Z z1#)KJD*~yD%xkG2n?UO)?79-$jxcDf(KvLvO~)xULjNFF>kCkcpsC)+9InRgC8cu{ z`vj2Ix(8hV9SuvifB$~In|U&*-WaE0T)K6iFi*dHQ8%~e;%mfXn>0~W+=S5)u>ZKj zDWfN_iE{XmzXA~o)(peCtMO2>pxP6{4G8du#K+y>M;O=8P?<*CnZgj}ScxRcTdd~s zRX*QmC)#NcEvZIRKtU5hn&u8?C3hlTEP#{>@5A(J+`>^~V^$pOHr7XFWk{A2wgtB5 z`kvk%mKT5{c#i^@sIbF|PfP|LNdM&IT8jfCWc~h+=TrA-oW zPq%@$x7nz&{n-j6A}&^4O$MaSajEkUvr-VBUHkZKvWT~7&hg9VOp5TpfNlFVwxwH# zC?%N}DcTqBLSi@mm2Obh#lR2_x}H}G>$@m5!i@5Y@4impt$Vdym6j}umt}Lk^1T!L z`A?em$t~}%i{lu1_~^xgi;?k1o93QJ7DL|>&rk4R2mk<6)9WxQF@dl!!~X@zeVkG= z_&!A5+vK-l((5;GC zw)>VXTc(;0PilR7nVC(fmqaiNQ=qX@vHAl1{543UJN=q6gSV)$yf%tnlHGCphFVcb z2q)eMat*7_0C~FxE#u;7J0I9|&TD<;BfYl59iL zP4P!DBkd2>l|SFZ)s=V;MXogRP2`_1Ef{6a;dc-D%;!DsK}L;t8x{VG`zz_5R>XGB zaeg=liV#ZK{RocX75F|Ojd+B#8^}KUuT>`S%8kKPDQMqGDV?~%8>Lp86^qG2ygH=q zH?F{TbFvVEoP5##N%{HtU7rTW#smsrXe~@bInnZZi|8~VOqI9&MuwdoRldOjX#g#& z8ibj6I`{a*S5^7PIUen7Z^T6g1MiSdzy64TEhUUKZSMDKMeW3zqDI|rH#>0-o1A)H zVn^EVo6*si+uAhYaEG|m!&XtY5)U*knZF4l1g9dl6XRT{I0c;!*l#+CZ$5T+4`6@A zb=uk3XfIuP#Nn0KfZmWJ7-(>YIRL}!dcIdCY{Xa8S1^d4>l;&c|13=(mJZWqT2JzG zhNwJm9)a>-(BObDmv-6U$cWy!#|IoI{tq5dBDyUA$|Cqbl-qxN*lhucOY5sQ33iE5 zoQyQ;b^d$;juL+*_1Sy(*X6=2LNUlKd7iV#EP&al-I$(o&z$@E^{a|7m$WK(%uy2) zHqpc_IMLOJ!{ziuQO2|ElJ=xUoX!*Pyvd|FJ`QOt5-fpRPoX(0%f=PCHK&I?*tU3o zK-dz6c)NaY zt%x6mtYBup_FTJ6)SWvj5f9)m4R>y{@Ot)^Qi?$qcmIVFH z>G_6IthMJS>W0dv4|!+z(%dK%K?2(;ISem;$?wj|*$q~ZIT)HmZ)9ZDQ{`Xvy3W6} znpKb^ZBxN>J7GF;apBvBWJDcf5p(M>=16{Dg@6+k}`v>_zS`wi3EgShqS(_g~b)z<9bwCCFn$S0OD{?`hoN2QcS@`H^LM) z*QkH}Be(E5;h$vCTnRampJ1wyzKxkV6d+6f^y#f6LKGk!ft&^c?=8zoLh*Ik``kG=YfxK>^2Z6W&xH59zP6RD1tr`(tfbE(Il}mnh*7 zL`WoSJ3C$PZM-q{=nngYAao2MSH2Zlmsk4@u?yU)k4~@*p*3UvWg{Ln26WaTSPfQq zR7r^(W3vgsX`qymDDQhjMd|TMk;i^3QU!)j0@KnsP$O&bvI>xI;ypAVL6|j-gtP(u zZySCWLAU}p1CT6Wp7`H(UN)1J3#=IBpdum4c>L6<$hLXpjsP=5L6S@qy}hNN?@}K- zcC7TZO2kW)2TY{#x-r?_x^;`kjY5It3T6DJ>6w|AP<)6f-&lYXm`pbszv4YL1V6zr z4dtJ-1#A>LCMF8f)ckxf6hVl78{uvd3r%QCM7Kiz6AhFQeSblMBq+*Q8SDd&cRTKx zA3uJaFa$}nV;{C6iUzRFP!6x)<;Ra_4QZ&UYl(;--ZB8Cey3=n+W7u6FFO!FSe|`< znn~KTsQumvf&}@R1yQIKi76^8Q-XM1Cq}wRB_$<5S(K;^h&!mr4dpJ8t8vFvcXzXp zKx)V^k^qIotU7R`-cwgT@NT=|egq|-OMz|jaV z)!W+}fQismilLV{?WssfVa0?OwUUxjo^d4$B;~lDH?uA$LXAhg5p-ix;M~ux$AWKI z58{W{=>(wU1@Kf+5~dly&1Ym4Fh8NCY><>!QnC#ZQF-Lup}4PuKk5rdjSyf0cr5B` zYHIGP^P1wNBamZYmTkkdh&eq5W`rP%)!?8I9jl=s5N;tFeny2DPQ#G|QyU8Gu#wTx z0nE!ViI|cCcq;Yb5UMOu29ij;Fi6@JYs+%pSc>A^Ek;}p9UahoAnk9)yMKtcJYYXz zWIy*7*$_ZuNK{mz6C27QgeV<-HYO%sS^kXy_yu!R9R8?ilt4M$s=Ti54x}kD9Tt;d zO0?<(7$J|54dMgXZbg&@2Kjo@jXQTDkWhaCO%qKGuZQ6S^(W)yQHC!=K}F@=U&i0Z zpXYg9X9u)6jAs*rM9|ZnCi`Th(X#+7i6K3705eQ-B8HAQK5;y7!FY7gf3H5y`@Z4m z5&YJMqhB8H<4EI<#Ew3TmlVM(0k#W(ruzc6nN7h{Oip1!m5s=j-ZJqE1&!`U$o(ST z4g#Xn5AFb5U=F#76o6t>^Z7FyQn>*j?wW-sjk*zEs)I5^CY>1g4YtUuosJb6V`I+v zWrzl`os8SJa|jD>^VHl6jy697`e)1`Z~&fB#Vsdd$pg+k6CK z%AO6B!myw@D&k}03vt+qM9Ik5Sg!ac4vw}h*z6&OLQ1G9rJsOS`@etZ6Z%}?b!NE& zsLv_D_bSYTP#L*qS^8X612`E<7cUm6s2)T)$A598?rU1j<)E^sf!GqoXvq1Arg=OR zu99R}TR(p~10`!E`f8WjTUpJuRi47Q5*UM!-^!dW(fNUuuV9}cbK+m=y0r(zgUH@u zNaA~Dw-=rE$w;GV9lU`;JAzVYuh#ziqsLi?ZTO!U(j=;F0=30^!=yddz^qkdET9w- zoC^&pHvWL9XbYe(oPbV#W*-DJ5gju8o{aCNm)n7mq-UD|Gd+DE5hQL+JFYTUHd=#M zwE*XO-?JDaX1}3(zqBi?)EOM=LP{-1e}J9CHUtep6tr!iLpbe|fAt10B4~mzcUmiCs5W&2JzzsiFDM}V8 zg>xSWbpXcxu$xAGWu&B}fbX+roZPfE>gD+OD3830vAA~iYKM<>(g>Kx$@y;Wez^Ra z*N$XtS1V#kM43E#PyNU}^%J{QuCU)~Y=yE)U{{?bInSvhYL7A2%ENsgs(Q}P2(>TD z1Di<%TZQvLlx$30-_se!!G1~17`Tt?BcNdc`CRXr`#vIp0h~q&Y4Zi3VKMR?6oCQA z2HFZNPQo_q=3j*oo~>2CMnLUVA-q_FT|}fvnVT6&Y9?7<&zQWn0u^LLVx%^tdDm?S z&x+haO>Jgv9fCyYNt=}!6)Eh)^t`++s0e?W&ShN(2M1tU!mcHWz}JQ2!M<-FH8OOy zc)J0yHHZ?`(n1TLq_FJf8aQ4~{=inPf}twBjZXh$WUm&&(BY1~^mH8=)3HlxI@Xb3T3~+#V8}X_Ew}Jta+x5kvAz7mHrgYgS@aWMZ?xv@&N2C)(iHZ=1kxw2K zXK!uw`dQ_4vewL`jE&NC6SQ;R?+ZjNJJ?FK!eG&k<|6r zDLuiS>@@!(j@3UZ1aAP3_A(>YM&iwlD6t{h%L0-4Swlzx6^cpDWA$mbZ3{xtBZ6jk zOvvaouDnzVQeZg+1V|)2lP*|83K4gycb-=_tzW8hhU} z2`t)$A*YB3`}5f)Wl&KShK~&5ih#K+bUHr^O;F~3VGce5uW6AVRc9fl_WCiMs8*EK zY7uz6J*4QS|B4*~jwk~eH0jm0A0Jv}*0m`_&@l*#e|+Zgr-#uT8wXcz!E5ZYU*gqn zngZNlaLN%kEyqn)ArNQF*#PD$ zkv%7!rq2e9LT$t^t_KT+Ls*Nr3B-@lVQ$^PJ*J4DBpck!Vl5&M4>|D?lgJ&9FF{=& z7>1Gvw{;UZ*ip>L<3)YM$PSRI+=4Xn5KMUE0)!i5sdF5fum7-`i8~&B)iCDhP-`)? zr2A=Ut^|@T8AM9FnnLSXkiyBWK1H^BV(KqW4;)8?)p%5$;)s*ev&g2>1Qx$GB~06HGh4U}&{J*+R?F@Ar2e z^nK;sij^21^_@uI@OFaAQw!Z71n>Dc0`Lc%4u6`Fh>|&pEI%S%H7fSe8S}zV-N&hp z(zY`m)JR9gJMsUt_9kE<=l$OQFA|}qvP6UyCRuAV2%(ZnmNrX@Y(o)3mXtzTkR`GX z3elo0BMRAC4BeK}VzOizTiHTne_o%=od114=YGy}uJiow>pItU?t6xQ{eIu&^LcNd zI`V81cfb)jxMD3rw#60? z;$1m!C%gVtRlD^o4?ESZZ8v2Luz@H3`}~ z|3`n=X>f%SxlKnlmSuorMR(%|AfRBd4*KC9o+syP(BIlDT9jE7pE!t5eVDL9_IP0n z&W|E=V{>aB_y49&rI}>od=j)nI=G7NMUQYz4FbKUm`>14xZ`y?s3r6gFV!&mJfH3I z*Q&K4-gGH05%KeBu5-B~_G;Rsa(`{l$!e~;RK0n@PrcOs)9>zUP7bPAs%beL^c!kh z%;7N-2U_~ySLH&;@gIiZN$dEI{vmCsvE`1%)f@>-4zAVi=bxLyFAj!62wUI8+4bze z7q&%rI*@hU1& zT>uJ;Uif_mA+UiNT!ZS#kRL?j`TOs`i*ti`gT~ZT3hh`6QiAz-aS6F0uOsdI)g08| z&+?q8Jrgo+VPk}MI7g99iM|{?Y2jD&q`j7W&L}(qj7K4%0^OQJO;x1RQ`SC2Jo*Is~OjY~*a@ppfGl7o?Wu-K9vK;cviH;(zW0@JDJGuhC0B5TQc`N+|u zBPAa6*L{P=jy+kpX8`+^;=sQ*PtUTTByIFDF9W!Gk~iN0Vwr zJ#y%`-qxFzxFgzwp7gbqDgNWM85SNTe9aJ7eX%_UWz+BR=| zlwKnqINAx4nF}{uYNrH0q}8Lwj;}zi=sxhzbaB|B8gg%W5NPY)wRc3|wN$*p^`N;| zK&v8(Adsyd2jJ*2W0I;ZcY<$tJ`70Ow(riU-Faba8${`?N6X|50cp~ui~FLn7R8%g zdV7Jl;K%2{eK^xdqqU-~ z#NB-l=d|7E(OWWtknA*V){N8^9bs$P#l(#)<52SBmADc=|0l(SoDC()}rUE~RWF$QPPo>dg#-6T`F+wEiQw>Hx=ty=x91+WSl{rG{e>-dUA z)QB4|weKq-l~QtcX|7S+gC5OdX1C6rRTbk79qyw>?B28Is6R3T=I#7Ew~L$WNb5_V z9BpH{*$M~1Xk05U&c(AP5@Ka|V7h5w*U)cY;!=}0?>*7>{Mik6qUgp(Wrhs(b1&MA zg1X7^e(d5!rg<9fQ`u``l>r*{y}i$JMOaw7UcE9d`SFFWUBAA3)28M^P>8hmM&{i8 zWfK>_J6$qw_^vx?E9K|=uj{j3t+2Rw1$Y{mpK;nJIR5VV&6LpZXo<6%TNsC+qR^$P zD6E9H=~JBX;YIi?juKGf7Cer+_Z9bXlU8x-6OM}XjG z^x9xD*BezUtcS>N!9SZN-x%qf-zf2`Jd?_uQHBBDvYp9SS;Ng`*sh&IXUvPcKsBh+ zH_0|_gvm8>9MOu^+hG}S9?_$-i_0=vyz}53g%} zdUXONT?A^+u<-De?nT?Fwc63xrKGGv2|ay#TBCpWy{t!*)}+1jl;mmIL|mIi8vpF?Z0PQv+5j(b1Q z#U-vc?bz`g3r9r(H%Qxj>A~J5rw-a`)Ll%6lk`vBd&4BHmz|um&r&=8|6N0^o~x~s z^aq!}95_kYBTjN^j;YWp!q(XYhmT8y^GlT1x=A+e3VYQSPFNg8UrG076ky^z^_O45 zVFn!a!^=)p<+W;I;p?^`qm-2iQnBvunkgC_w_`wqy&WjPDK|FKNv*g2H#O3K@w?R) znFX$dGH#n}=Iw6Yqel+kGL9o4z$AtX!q)b!gu)3!$PbCN+^CiW(uw9%s%Y$Hdo>4} z^Z1dGJ4I?q;cTyOx7^Lsv+=B1vy!scwdPa(yDGJ{Fe^oov9YleIQD+Oe0dPkHnGGc z+4${`G0Qu+|nO^VDyD7doD!^IkQX`Bk%*N=B@GZ28g&A?ywrmu~c+Igel0D zS|P)h@fIMAVSE5X;2?O?`&CqY7(#LVL^yRwdEFZRLaIM55&r%7O_jU9O`!18UcYTo zU?9jArwDCJj$GS)9rkizVG?dg&h@1n{O&OY|c%w2k>DEnBC)~P~4zQ@L zsR4#h(6lj!ZtcY(6Wyt^ga~dq_y%xt6%VIc4tvhvDeGQZ7p z&e{ac_yUhJOZs8lkETABo?;7;8>r+`ZhxcUT*|@j=;-L}?X4&@#kSBZC#+|_uH85G z%Xa`J2;T^7d-u^JHEBY(Br{0xKuV}FKtTbfyF3sv* zZOgspgAz;+VB{5rV$_2&t545<0$-4lwgzc*PZR0%Ps%(EXhta&L>V#0w?Wz$}-b5SYWk9xSCEHo7E+Rd7+ zK-3{Bl_$GFk`#ET%sFL?^_CeQyKk?gUquz+7 z^-~?F6?Wu^`MuQRcXa4O!YFuELT7*Z7~p^NdVaHA`T6-P$O%*l74r8UVD@?9VZ-pc zs8j7XRUMcZF!pNl%;2GLWntXs#Ti$bWb&gZc!oVszRu58oj$!%?>)SZHgNUGly~Fa zwrOPj{3TC*`0uLu@n2Q*<8i}Bj-)oGe@UIci$kLky7z;{@83L2AIXurwwCz~mf*N^ zckY}nG!t?lZ*ALdwAVH@Uq8K^9$*D5eh+vhVCDL+`x6uGm3BaDj`}P2Zh6$iCl2)m zqexmZ#Y5%QpFL$v6ef`DB zPe9RQKb59;3H0x_c;68B${5wZ^0PXZ2G-AI#-upeIiJ zsjs2J4c#LK4v2H<5OW3mZ~xH$b12yxibB(f8g4BVHNu*DLhNZMaBw-aH4H}S*yhvQ zAFjcua0W-^2l%DjkN%AX)@+>r^*844TO{5LPRsB2?#&y?C`1XOqU7f0%HRXa3AfK0 zr!vYqEQO@MR$6+2JfNCYb&~YkYU}tU(rXw|prQ@o?bd|`G=m^hhA)}@KVkBW$of}|Ck%{_@Mee%_>5-^9o)jjmD!Vc!mj3qv|6IHN zjZss+_aYH_C1xkcIhEl*54|fI@^o+IWi z7A)o~r1v#&0k=YpSX(bKK%(Nv9pA*n~!UPr08v0;wGAd-K zm__pEy6a7Aue?|YjrO4bM$Mh;g>sDFM+;5!)kI1{%qjd$*67F3NH?d{^#?cmka_}$*0-Pogov_BuEE=AMkR}CYR0ly<7 zdpPnDuVGPx6?61_Kd-PF>dgQOfuhA0fkMu>uJQvbiW@<;chk?NLAiE#(%{%r8V*C7 z2$Wp7(7nAEnx2fn>f|j8NnX?ixnvQzRXnA(S{@xeH1%pVJetTiDFH__`HhPq&uoI* zROtf}2bx2D^w{zh=nqHtImlso4_uQl%<2>}j{UqWH1>sjt}&y*6+|`UOXYZ>v3WZi zuh_ipTl=>ZP%|FbI8Ov_Jh+>l(=K#%fRPe!`0QaI-wVLt2hkFMQ7EA-Z?LL!AW>L1 zZOFzTkm1MTht73DmJv2sczNA+T>cc2Sb#!QPT*lOB?nr^+TY)dVsK-J2u@t6W=i1} zq=K)8tTaNC22JYXrDGunXk_BWf|8Qv8`4%@Jfd=!o>-vn*b7Z{b?Ykl{Gx!&7(r&; z<*-Y3j{MXo-`xIDIeNqS^VV?n_v!8u-`srY}7z0`wT@GQ|Df z$WH$si!M?BM1eh^%%|ExKpRFSa{BAX>8Czcq*S*V;wtscWtpTv&N3Za*5X%pRp3Na zfP9r2Fq`&k?1P#5_KgurPE^=0c-t-!uL@~S>kicNhBjm066JFzbjJ>T#F(mxhBz6t z*?djjqh*-8qpY-`U};1|L~{1XIViE52n2L$ZewlT9e)Zk1|`(9>xJ)XvI668JChr+ z^enca&K4qw4d$rtm<9janko*Mu?{i`NUurg=3FA&Uvh#*ptkJbzc$5udP!&g$q@a# zM%(d(^3Gfgg!|1V5<%j8QGB9alh|Zwjjr76 zg?U?4VHBnR9ZlD*TdhGrQhKz^pn9uQx9(Q&;vfGBu%y@0gW4T|Z!!GUrA`MMF!nB~ z*bGE*=OL)bz%|cuMe9u6vdMC_njcHj8uL(s<{mq){_~t|)6)-9=Yh|St2{P*hh=-W z&re7r(p4Ie6xNhcb1N`OQO1m=OVb72ucw?R-!+U5u#p@&vI`iD<_efji^-oNf?Jn@ z5p-|krd?lWOq^)QyEe`B$98m%rnSVs(Xw_#OM9ZgE1CNq;kS;`fZ{s9_sro5J|2e2 zy6gump8Z6pz*NXOOh4<$Q?!r9`rBxG&sjY7roH|nu1|rWUow+ZRPiQ^g>qTcOZ-#@ zSIE7qNMJ4@6W18EL+Faa8LOsL6)aw{P3>lFan^OiMZI~$C)r4ARZ)y5c`cW$Oc-m? zFR%x`E4RWIAXiv16a*EG^?KO*c-~~kVt0^lEO0UXk{#?U(N$)IQc*=F8><<*7Zxls z_Z_@2S*`Rsrot+4P0Qo_z<;jOQWmdso6dGmyhCQn18Pw=5F)n=l)~eZvsg?MIATP^ zC$|9?phR~sYZp1o3DjE^Tx2xk))41K^N+}NO?t92vS@gR4e@Mz$4b+f!^xM1xXqyd zYb(I#F>L>cON!fN9T{%v&MYaVCifg`d^lIe+d_&R=BKMwTh{o191f=ey!t> z6XJ)qR2ox_j<38Ge&)=XUQ6mJi23UwwnVcff^RN6m$LG|3Dg$8#O0`jauct-Si)J#Xu4=lN~y7^#wISN?g8YM zd=qp@%l;B|nE>kjCF)|?qdGAnW)GhSZKMr;H^Lu9pk@(LcW9&h9$M?mD3**23{+S; zG6#n!yHyx9nM*shehtF?Nr=L(6&70mWluPI8v&Z=yDAy?q>dMkd4C#Q%H4vx*rt=r zCX=R2h8||XnrGEqZ|`<&_SiKNfI|6NOU*dmBvIpE#avL`cAoPC0#fJoE$#+RV#=$C zU2?0j#)c&m7nA`_8N#&;!bcOgHgt5`!w8zkZxo;i~l~EY591@paG4B~_Hi1~+ z*6JqSZsqzf8q#c!T`8ZQ+N3M&K3jnwIwg9RlY8Hp1=p`eMAu3t_ z6A`{Bp}gjE#8M%DfA#+TU_!@9hn+BGO2Vc}}yyPdB``&c63i+ZuOD?`ee`zQ5@GOZh}CxTq0~?KRJ!;Cp~@gM1-Rp9T(6GAle=M zaAP}L+imE|wS7);NIU=os(EqpC8$+6Vd+CE)3?&8XLXdml&Ek1o4tPFmjYZ1oDQ z$f9Kw`H2H7DCN6)W`u$eF-*A)KF)QPu;L=U@I3_mf0*WrVn!6q(4QORpDFUfqD9G! zEA|z?^nG|snLgdQd|L<4a3!4!!~;WA@IvC6FHc3#elw$Ovn$pIFY_^#aqm&=l7+b3wI zTp=WSDY^mxx4Q%g^qTW$1L;qseZa7|#VXiR#<_@#5+&|nFi$Ne5AZ4KC=zK65GXS( zMNvYM>iCC?NU3j3q3*xvFRwt+9OgmsOD1S8?a@@;j2kvwiOu^Z`;3rYWk!= zGTI_pgmo9j*ng%0F0zxV7}V*-ltxDT{*ECBm)Ke*+7*I3~jb|J8MHzG1bksg&Y+7IY3lAD`}Lq4wvU zRYBBIPTN)-a;x}Py;NyM^w0m^Xy6;UDbWXp&35QAN@*lIVK7U((WziaNGmc(g8S5# z(IB*c_jnKKR%z7rk!#k7s-6!#Vy(80MHeY6E{eg(AD0{|uXto4y#n7R^5=6XY6}3n z!O81Wx{3O;@>U*LTm)xxvCTZ&+V0HP1rDD~jg?%SB5Fok;CHQFQ{K}mlpES4<3LI* z=SR{^kt}o0GTqh9ZSUI-hT2)JWe*r-0RfHn0sR)z4pA*URkYy@o;qp8AAzWY1 zwmSW>qEl7$IdNGCw{JE{4f$}X=}lzbxm3^V5I%|k-NwnOF{Sg!;iCo?y`^Q@-64hB zR#eZNGX+H4LwFC-kBRwbWIMs730%ur zp6T(SJNvez2~Rt^gyP9jeUv+#szukW#=bN5e$x$$w69C@S~C%Kv8hERR;wb?(YElG zj_>PmY*FMZ)}z*-PHPFY&9QCh8zmn1?P}|6@D#5csILE=y zYJaREIQ`q!7}tnEm&RM#XBnAT7!)GDY$hF_t@5x{4ef_gEd3V}bbvU}Lhojo$=}C> z3y}{>VRLrFB9*LDr;OKZESf@vK6KyS2;f1YLK>26mSp3jB~Mwr^w_bV1+FFBsWCe7 zJXC-yse^YXCN@xn=@uz3;*JfyTwL(0)~IlAhtZ=J#TT6fOE$o1u0FDh02;|gfF7dd zg#x+24Likqr`q3IfVC7F{$sIg;J8@L;k@ciU6%(XP=Ta94WTu?j*r|jOl<{sMdY|^ zoYcar)7$xb;TX|r(nPXip4KrkyeK~?P(?0CK#iQi%ZGQO?`1DY7M8l9k>OD3CKA_x zT~!qfZX1t)xGY%uOZdCI#7O%M(sC!0Ez|Eaaf_pwn8})i=5CbfnRawIKZ|k9(QqyH zP1|cbMDc|S8a*jVZAC)0j4cL!xJPR_0I?ymAQL|hXQHolRtj@k%T1T;cAa&h)rR!gj-r7k?^-p1Ppn4 z>N{;?owaNGPB|KF_Y$&eS#7nVkaQr4UvYHpy>5`W!-GasltkD7_0c|Ry}l2QTF`3Qr^R*TBVyFSp_ zSsNjeOm*tmEz{vUb*ct6Dy}KCmx}l2nkrBznJOdYKWlg*sWdgLK(nBl+47xx5fuy- z^$HZfwtxa4RZ$RyPCUsbBxdS#1}B+@vW564UTN{d6>ocRkWv9p{2#QqP;LqH(~s6X z@Vx$N4KimRMSsVSzm=*l8}V@dcLHI=4ugUrwePY>`ODYi<2A?}G+?C9w+bB#mmj|W zbh<~wukZiZn>cYSLd=X8PmMd$>2UtvKk|POpM2?b$290faB_b+;Ch6)4KfiT5~(M# z)Xm8^u$?mpgYC42Y?H$XFq8qHX~>pU6p}rJ3nn00QP}8BH>84b8iGfQ5E4T)Luqo~ z(Sy;r{g*-$Mdnu3b{2d(e<0;_uLT?0YiT>DdVYsO(uz;B6Pk&fzvwHL$Q1xxrv^+8 zm`eoWJv=_zAQ)f(VeImT(D2LJHLzyTq$H&^{PyK#$n@KHsJ~W7tLIz(HwiWO9~GSJ z?LAKiWsdw*fwhcIuUeJQQW5C>vlJo z@^5vU6&9Mw(t=rCnVumBrjO#@EdD@}(mvFY*Se!meJZ$w(Uhpde5Hrfe{0Jz!sL#I z%IK^>3)I}kYa+*~%GS_`OE%nS(JW5YR5u<2v{bWN2`ej^q_Y|~-)ZbXf zIo~2k1}icsXe8@ouYsF$*pak)Ch6(vot_)jx))Pd4l(pSA`fJtRJ(^2f?C2sIaXrZ z<~|+uzFm~Pltqc!3y(EO7-6GwY5(!}m8HXjI*&2v-Fr;T9BtcZ_1cGu|LdVPt{U<2 z!v_QKMQS@`XOXYvUmQ=!Qrn>ozCZt^@6R9S7FGx-hQfu%m7WqZL<$zrlEhD)+WET8 z+pCE(Na2_TEv|CQ)9fVPI2`p`~QpAqWrv?EY&&?$|YB@%VED z8Ff8*;)JPw`L!v`JfmyOjnp>UIIeX&mmfvkVbOhPLW3zNj!1-(tnvf=kWK;|O+B{@Pnxp_z zVmLH4EBGc7Sm(Mf&S5U%0b1$d*0)Zu$I$DaIGFk!e^9g? zcTbh0cemO@!HspCSR3%~h5)QS!5~#%%fEdJ5qGOl$W?gs92XOnt zVf7R-kG=YKe8J-h&aq##K73<;^({=xho=astIcRvMq zd0IZUdTh08?yf0Tb2okZ^Wiy`AnF#x`x;oCtDvB@JF2WMRc>)E(6a7)SzGXd7cQH?tc2Fc{pvMpQb9bF^5N6PYEKgR5BwG~aiDCB}i)F)l212#)|tmAc-WXqw&BsUQPOLBADmShr@LddW#Q zhN9PZAB#{ZG;r7WgseM*d#3>x@aGws84Y5v{LunxN!+w?q*f>IZ@TpH=627YJ)2F4 z-~4foYPBkm;zGJ`?bfXuEA+Yqj2bFWg0qItoY@s&pQa*H2RKf;sc@a*u2s`)9myJ&Ky8_a#`aqdwNqCCsNb(wZE27kBp1n( z6-HrasbTJdz|#0X09mDi*k9I*dt69I=>-t@+_GIClPU0mZMTiwHD`$z5OXClcdIEF zpPo`#!k2PytzX>q6i%4PaSg->0GL1+S~%}aPHPb0qvwX}>crN&$_j9=!#5Qe1B9|? zfJtmuNJoz!J6>v4KI*{er7|~(r;$Maq593;k8trYnN?vkpLW>!c{0!8rv4Qlq=BJf z9qR_J5iadzcBX4Y+`vV&;x(Np4+C4y1xsQd*olt50}eM0u3@S0rFecWiomV_8)({723JBZ-``!u6WN&Hh0 z#T(#GaX9KfQE&j zoM)J$-xfrG5+3+7BdB!g<`*)11n_LVX;k#)22qi}&*<2+q4W~`S-56>jK`}0YPVW; zPBs)Wi)_8PpAUeRvpJ8I9ilIc=aE3phs3tOEoHLhSHjI@{uhpTi9c=|G` zxehM0ky*OtK-|EQIe#(5NSK(>p~Y<|zzP*k6Fv@Zbc{OKY z7hEQ7%2`!-xx2P=JyMXfv$Jg;sJA!21%pTaMmXQ)slHHZoCjwqoFonalR{ClyTxNw zV!>!dz7R>?ElS~0X{L;=r2e)rDm)jov+8A?t z5pUGcA%;+cD0YO*IFPCWSY2f6_Ay~>-uofnKJ7|Ajlh8LQqkKI88uSlYJR>AeIM=- z@o`Xp81(4jmU=LCP7~JiIy$ie*jCqw37bHCY&pMk@lbbwGnrU1`|X_h^P95?Eb~bU z?*QMG(tUTuL-ZZZ(E${Wfn!q@jkvR~7x+h0g^9kK?Eatuuct_mN8i4Ea{x{VvV<&; zy8kqvH79`%{14m?4N+lI;~6l9JxOmWhxSCq_E^V{NDN1D=_D*YiCZofPVplmq5dT{ zT|LutobTt4uR1I+G&It&Zuiqq*NY}>k>PuQYlQtT)>|7p#HcckC+oq9%*>>(-ynDIf`Odn;*)g?1tN5%-uoKvx@phzonnlG z7~>{Wi#l!et`fbu5!oj#!HC+0Exh*??sh#cYTQwp3=I}eN>B?>ZxHc2MJeIq+6llz zYMo@oPM~Sln|cPeW;Hh&*UiYvx4%IECz4h3EwXhRnBtiU|I)E%xKu9)hdok~!KeLNGHG^*F5Gf9)i2Z>yjxcu6vKH_UN80ML3@-lfu|HC` zVb62xR__}(*sEOK@o|(t89^V8R9rmI(uqgpoxw@MsT^_luD3AlXwXT1Z7paM2b^^S z6$GqY8uEb;9ZI~>+objl6+;6|eMQvYJDBAk zqEUe0nsPQK@j-iQS{g@QuaMTXKNHZgkpQxct56YjW{fdCWlI!}Vjm3t%H@WWNQ--i z3eZcS{ct9UYW(7n*a_-ZLij}}cBNu&g8%)nH2#%Cp z@@BZmNw3KxT-9aYs3*0$nPg+C3PG?0Ql#2z!%>>Y&90(Q^Cwra5#%r}p2|I^NWmpL zRt7kV&5#$U1>MdkGNRudA5^vCPTJ zK;stO72KI1^0_SSAv<UZ%5?@;yn-=M&APsVo>|~5+5<|kw6uF zFUI)kvu<6mmeA~ZJXXLmVO2aNb-Ug=}Zu<9yHDwzO(qFv6l~XPo$wtpTLYM zI|{(YX`&a@n|eu!FbuU-nKE@9>_l^w@yMuN(TBcSKq53X|=-Y$0j=$nd#J$K>+W?<1}8A1eu@t%ih zl6-;UKQ6}9w!_;h3e~3!eT5e!j)xUCdi3ZP(l27oa$f|hfoP%Du+JwX`(A@`U8+v0 zjW{xCXq}_a;G{;#tcBl9B$jl4qkUyJvdXQ&z~nDr4^JX`303E##YRJzOR$tIAJNR= z8j%GfO!L~cYbT&M`llKt>j5l+6IZT#U}tFm=8#<71N#l%*;ktu(GY_l6Gbp$OV^me zC7Tq0=Aw~e-F0(i>mL~<_7;Hpy#J^UVASi^t&98ZGZ*%G%FTvGftsP{_>y0L*z}ex zf>r!#PdlRpuM>*hI`Mqs>iy`igzlzvjs)|cQ=0t~y}&PafB5e`(!c$rl065TIGXD} z40fOLG$QKKezG~xfN4>1RT0;{>0}!@SUc=aX>#evyw+pZ4>K7ue}H=Eju9hmIEO|b znXIlr%NLnsopgOD`154L6PEFvr(anA@Ojvg$^DcY>QgM-XfS|!tQ#x^$&^~UJN3O% z`}f8@3wsR(sq!jh$B3CX4xPKJX`=Fc#|UB{n$uQgb246X)Ajy!m`Rinr0X4;z6^6o z+BeVI!B!TW)A@D7Ojaz_AMES8X_(2X(n+iT<6qoZqCRDecV z*2vStO!5o;_qr_NImi6aC*Igx^YpW=k-ytA_9ft5Hw(-PILilCXa1Q#c~q*$3Qn#h zjW@4fFGJxL`uOF@pZ0e3s}>uAU!b9BpPfKj=5zV$6F&-mF*)ysdVA;UoFQSnVy8dU zr+9nECD|D4o>&M{_P6f%f|K-$@R0 z^V(a{*6w>|!tcKeM6+Id%;?c~(H_dpm}HYQhwr$~_+rrnw=KpF5-UV#50}3Dbh13W^@n=B!hb12C3txsoJV*9^6#eT*tq zhfs;!+UGYIZ9!9&^vd1n~#Y7b6xJQO>opcKhlM|liin3WUwVZH2FTK}>c>D?0Q(Y^f@rRB*A%BIW6B@OfF@#l+^3y9u*USa=cap7 zZ+s1hkQG#czyB{2fRq;qEp45h*B3mVYAVr$bQ4?mb)-RMNg9Nil=da+pfS%+565~< z)*pM&GqVobdj317vr+r@37&71P_Pybfcqjg0H{h|21=Bzd`FUN}j?ww$ce-|FQQC4yGK<#aw5Xz+62o!5x8H;b@wgIuE*u9T zrv1=wAFqmYlU7Uv-`7bFb+g1Z&>*W=s2it$4bM4>oTdOxF*NGrjUP!gq6^%((QV(6 zOD-kVULz?GnhA}vLaW)$t|`l7ZhA~P<~8MLvzz6!QRa;3qltP~E*;8g*N$&~`q^gf zD%#E_^!hzA?ywOWDfcnUJzVn~aD+4X(xpO^#UI}$DeYhrFL|Ab@$A~IdZ9VN)<62E&bYjoFB98XkALvC}La^twueZ?=vIzaOzXnmVUYK zdj5LsU2m!qfaJuO52I|ylsU$aXu!9kB5kZ!di}a9kqV=bWyJQe3NCNiaD{c{+83`) zpVvOESN`S=8;r0Nc0tzY{Nlv)!uQLythYRDZ!JyWLzqR043aoY+OBv&6@lC#fDaKv zB%W*Q1{BAl_qf3TE6_Z2I|_cvtkTdXIy&MNl=&CpJEdNjIr|pZuPBHhEgL}$x_6cm z3H(r%{{kgpZ}C+K3CcN|YpgjwUi;{5&XPVu8thps*ewkZ9ZS#gAXl+^h)KLya{F`$P@*XX7?e3sy7ZgSF7YEycZdRTFTX)wSJH{@HK2~?$!38$=J0~4I1{-(1&(+sO zW89w~OnJVv;`-Mz36fq@w`|kE^23iP4MdQO4n2&ycr=4*%%49;bhy~yR=4V@N$)>U z6jx1}?Af+I?Tc5rdF+f%UX?0}v4b_p`QbSaFS%^)Pq|OJ#Cg~mf5hR~6&zAMOZ#53 zjxkOT2`ElV@gi4hEphQ`v_yG;yO;Wg_+9w4a!G^U#X)X^Nh$@%pCEHxEr<5k?Z_r7}QLXxa6VjDn|1 z?6}h^I61lQxBh!dk2?V?Yk}gq4Fz**BQSDhG{cq_O?>_5MX}D3PBU`SDR7lY&eFuP z-_Xq%8XNB|I&$9(`e*>2tntrF_nbEOdcJ+<&a{AqoKH!WBQj5G_`GCUM)KMtaY8aM zJO^$#jEHLd21R9?kj-fW69nGO?B!L-Ss$^R(n_9?W~?E?6k3m2*WO8>AK=Fd&#t;O zzV7LJj$v22`6Cx>(zf~Bnevc&m3B!BZ>q;H&T6Hz-|FL%s?EnzV-v0qVdNy7Id9;LSb6dp(5{tEMSkchImeXcbkP9N%5<0@V4#n zA!GN&_$B!DAHgnhyX?9P3T+jw6XBxykXY4)@!1SkR+5&d!jLHLd>moWhN+1IY^3E7M;`Dy(-(S$&A$Xk< z!-?SW0?F{0HKwWsIV?k9nhuzS1W!3pwt$j8@TOO}Wzq4|Lyo=29Lv41ZJTM>!X@6} zYpy>9$UaZF<>Q1qM`mp1Y^?sk8?6&c#%*9yRYLM@uK!y6v%8<1Jz%5>~P;4voWNM2CY7@ zqAf>B`lixk_eP3iu+E-8&8x9>iEN5(AxTmko4B_a z{mb$QfD4N@@=!+1^DlX=X35FV zJqh^`YysHD=~uAj9Wo&npEY40jyu-=oLd@i>;Rc0xLFiWq7quNKl7+xTcBG})ey-P zN=mf*tYA#NzSSIPu_tzzv^;SqAlK*jug)clHtiplQ2V{M9{CcWZQTwPuwa0cYsp;# zy4Z|aV*x0kmyN*J?Ly1o3)hcy-Ei#7fQ#sPSvY~+7Nnvs;RmGqejvCB;6ZTomOa+q z9~bzvy>fMzeP;(E-Y~w-+Hs=nAq3+?t2Ag>Wdj_2uf?fIo<@2zaP4)N#i~Bfh^rW`3o#+;X8>WfS-rwrn|%55 z;APcspSmj7YIeK+a;bgDAd}zT-Tz~8m3}o_2YK95yMA~t1eX2_T;)2;$;*=i z+j7AzD&FFwx%gWo+ElN8gDFnA7Z`D5Mp?gtTjPmm2SrFr$!K8xJ3P<35wr2RTTmMb zp#eB|Khrw(z=69!wxq}u_mVtRpv~${%?^@*@=qjM(iCOhv6p~Hj(!WgDi76s?7C>= z?#YXFp=|)N1Tm$NCk(L;d`0T>X;Y@GptZiw`tr!nKjOtW6k!V>v>Qf5nDX-#xZ`_F z-=kDW3HM2H9d%M9`f`8Xj!gS}{LlFwzZzUvoUk$|f}TNDRC>HpGeiT*$KytR`8xz$ z`gTnB;hEesDVL)k@;!C8Sw_BINopLUJeKnz5lh8`&|>aETcrYuCs@76M)=DRd)Xqd zLFy%I4%Akp+Q{le9>A^B7)IVcW^bVRGhVakr>gK$QU|&)#G@=u~m9<#6 ze95OSLRf;2`*z+CW9&d3Vv9R3VB9i77>HTvBtBrztiWdc*$cqg{$zFm9wZi*Qod5q zsmUBXXfEgd!}KW|hZS3uT|#JfXwE~&*8P{X*3j$0l)zS`1yn(zA?v71jLX2Fpi_2R zfiVC;#da%~>z?3~0hRj#GLGC{zHHgiwCtG5J_OTI`xpOl2knW7{KZuB9d~6clO6zS zIAl9zQ^;BhTcaO;9Q?rBt>k$j7GRveKT4<*MXnKII~w9Vx;cLWSFudI)aa0Ng7 z9`ThnyR3remFOZKfgFJ7&mg2sp-=S>Tsy(eR2fAPfvS~m(=C>gCj4p z!)HWHN&U^VECk88Mf z=k^a9HQV%!gyHfDzBCU_w4j%eOI67FlDnQGZAFwDyu(364g4jvfBNfS2gws`(|2Jg znb8d?OogVSevF`eN%lKab{{UUB=A(L-gAs;KZPTDR(_@}C!?e`NNO|QBIilFO!BMR zbbr?8PnH*`W*!&AQm&bMP+8K1&3|!A9Vr+iNH51dpN67TFFy<6hAasVK#9y@D~O_> zDoYYCy1jXBRlL;Lbk58yHM)CH1(y8|kfuWr14iAuj|j;6G-$$sfEu7=i5G(5Q+9r{ z&i}_ha@ZGmJ=5MzY0&pub$|HK12CV~Z`zypd^GPs)$7;inbtP7`QdHbdZ&(>>-}zX zgHF3^9`>KBOM(N%b=K@Y;bx`xrtS(3r~Q+Y4cQ-Hs;12SmR}sQpf2~FR49$<|z7qk6 vw)2!)q11mH^Yc~7m{!pabUxBI=3D*1odb<7cs6>j@E?ak!)(*6y_fwjQTE`a literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-transaction-propagation.svg b/docs/img/dev/en-transaction-propagation.svg new file mode 100644 index 000000000..ce646debb --- /dev/null +++ b/docs/img/dev/en-transaction-propagation.svg @@ -0,0 +1,195 @@ + + + + + + +blockchain + +Triple-Entry Bookkeeping (Transaction-To-Transaction Payments) As Used By Dash +cluster_tx0 + +Transaction 0 +(TX 0) + +cluster_tx1 + +TX 1 + +cluster_tx2 + +TX 2 + +cluster_tx3 + +TX 3 + +cluster_tx4 + +TX 4 + +cluster_tx5 + +TX 5 + +cluster_tx6 + +TX 6 + + +tx0_input0 + +input0 + + +tx0_output0 + +output0 + + +tx1_input0 + +input0 + + +tx0_output0->tx1_input0 + + +40k + + +tx0_output1 + +output1 + + +tx2_input0 + +input0 + + +tx0_output1->tx2_input0 + + +50k + + +tx1_output0 + +output0 + + +tx3_input0 + +input0 + + +tx1_output0->tx3_input0 + + +30k + + +tx2_output0 + +output0 + + +tx4_input0 + +input0 + + +tx2_output0->tx4_input0 + + +20k + + +tx2_output1 + +output1 + + +tx5_input0 + +input0 + + +tx2_output1->tx5_input0 + + +20k + + +tx3_output0 + +output0 + + + +tx3_output0->utxo0 + + +20k Unspent TX +Output (UTXO) + + +tx4_output0 + +output0 + + +tx6_input0 + +input0 + + +tx4_output0->tx6_input0 + + +10k + + +tx5_output0 + +output0 + + +tx6_input1 + +input1 + + +tx5_output0->tx6_input1 + + +10k + + +tx6_output0 + +output0 + + + +tx6_output0->utxo1 + + +10k +UTXO + + + +txold->tx0_input0 + + +100,000 +(100k) +duffs + + + diff --git a/docs/img/dev/en-tx-overview-spending.dot b/docs/img/dev/en-tx-overview-spending.dot new file mode 100644 index 000000000..957f932f7 --- /dev/null +++ b/docs/img/dev/en-tx-overview-spending.dot @@ -0,0 +1,52 @@ +digraph tx_overview { + +size=6.25; +splines = "false"; +rankdir=TB; +ranksep=0.5; +nodesep=0.05; +//splines=ortho; + +node [ penwidth=1.75, fontname="Sans", shape = box ]; +edge [ penwidth=1.75, fontname="Sans" ]; +graph [ penwidth=1.75, fontname="Sans" ]; + + tx1_label [ shape = "none", label = "Transaction\n1" ] + tx0_label [ shape = "none", label = "Transaction\n0" ] + tx0_label -> tx1_label [ style = "invis" ]; + tx1_notshown [ shape = "none", label = "Not Shown:\nVersion, Outputs,\nLocktime" ] + tx0_notshown [ shape = "none", label = "Not Shown:\nVersion, Inputs,\nLocktime" ] + tx0_notshown -> tx1_notshown [ style = "invis" ]; + +subgraph cluster_tx0 { + + subgraph cluster_outputs { + pubkey_script [ label = "Pubkey\nScript" ]; + amount [ label = "Amount\n(duffs)" ]; + output0_label [ shape = "none", label = "Output 0\n(Implied)" ] + label = "Example Output Paying A Pubkey Script" + } + graph [ penwidth = 0 ]; +} + +subgraph cluster_tx1 { + subgraph cluster_inputs { + index [ label = "Output\nIndex" ]; + sequence [ label = "Sequence\nNumber" ]; + signature_script [ label = "Signature\nScript" ]; + txid [ label = "Transaction\nIdentifier" ]; + label = "Example Input Spending The Example Output"; + labelloc = b; + } + graph [ penwidth = 0 ]; +} + +pubkey_script -> signature_script [ style = "dashed" ]; +output0_label -> index [ style = "dashed" ]; +tx0_label -> txid [ style = "dashed", constraint = false ]; + + + +label = "Overview Of Transaction Spending" + +} diff --git a/docs/img/dev/en-tx-overview-spending.png b/docs/img/dev/en-tx-overview-spending.png new file mode 100644 index 0000000000000000000000000000000000000000..e47b585ceff5733f321ddef16d773d1d75b8564b GIT binary patch literal 21756 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 GgeCy<4^qAW literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-tx-overview-spending.svg b/docs/img/dev/en-tx-overview-spending.svg new file mode 100644 index 000000000..120e4dcf0 --- /dev/null +++ b/docs/img/dev/en-tx-overview-spending.svg @@ -0,0 +1,108 @@ + + + + + + +tx_overview + +Overview Of Transaction Spending +cluster_tx0 + + +cluster_outputs + +Example Output Paying A Pubkey Script + +cluster_tx1 + + +cluster_inputs + +Example Input Spending The Example Output + + +tx1_label +Transaction +1 + + +tx0_label +Transaction +0 + + + +txid + +Transaction +Identifier + + +tx0_label->txid + + + + +tx1_notshown +Not Shown: +Version, Outputs, +Locktime + + +tx0_notshown +Not Shown: +Version, Inputs, +Locktime + + + +pubkey_script + +Pubkey +Script + + +signature_script + +Signature +Script + + +pubkey_script->signature_script + + + + +amount + +Amount +(duffs) + + +output0_label +Output 0 +(Implied) + + +index + +Output +Index + + +output0_label->index + + + + +sequence + +Sequence +Number + + + diff --git a/docs/img/dev/en-tx-overview.dot b/docs/img/dev/en-tx-overview.dot new file mode 100644 index 000000000..9c3bc9bb2 --- /dev/null +++ b/docs/img/dev/en-tx-overview.dot @@ -0,0 +1,54 @@ +digraph tx_overview { + +size=6.25; +splines = "false"; +rankdir=LR; +rankdir=TB; +ranksep=0.001; +nodesep=0.01; +//splines=ortho; + +node [ penwidth=1.75, fontname="Sans", shape = box ]; +edge [ penwidth=1.75, fontname="Sans" ]; +graph [ penwidth=1.75, fontname="Sans" ]; + +subgraph cluster_tx { + Locktime; + Outputs; + Inputs; + Version; + //tx_label1 [ shape = "none", label = "" ]; + tx0_label [ shape = "none", label = "The Main Parts Of\nTransaction 0" ]; + + labelloc = b + graph [ penwidth=0 ]; +} + + tx_label [ shape = "none", label = "Each input spends a previous output" ]; + tx_label -> Inputs [ style = "invis" ]; + tx_label -> Outputs [ style = "invis" ]; + +subgraph cluster_tx1 { + Version1 [ label = "Version" ]; + Inputs1 [ label = "Inputs" ]; + Outputs1 [ label = "Outputs" ]; + Locktime1 [ label = "Locktime" ]; + //tx_label1 [ shape = "none", label = "" ]; + tx1_label [ shape = "none", label = "The Main Parts Of\nTransaction 1" ]; + + labelloc = b + graph [ penwidth=0 ]; +} + +utxos [ shape = "none", label = "Each output waits as an Unspent TX Output (UTXO) until a later input spends it" ]; + +Locktime -> Locktime1 [ style = "invis", weight = 3 ]; +Version -> Version1 [ style = "invis", weight = 3 ]; +Inputs -> Inputs1 [ style = "invis", weight = 3 ]; +Outputs -> Outputs1 [ style = "invis", weight = 3 ]; +Outputs -> Inputs1 [weight = 0 ]; + + +Inputs1 -> utxos [ style = "invis" ]; + +} diff --git a/docs/img/dev/en-tx-overview.png b/docs/img/dev/en-tx-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..0f991e1bcf2f8bb6846a82452d50d9c1ef9825a1 GIT binary patch literal 5640 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 R#2sDn-qJMCczpwj{SO#KwC?}_ literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-tx-overview.svg b/docs/img/dev/en-tx-overview.svg new file mode 100644 index 000000000..7bbcfaa20 --- /dev/null +++ b/docs/img/dev/en-tx-overview.svg @@ -0,0 +1,89 @@ + + + + + + +tx_overview + +cluster_tx + + +cluster_tx1 + + + +Locktime + +Locktime + + +Locktime1 + +Locktime + + + +Outputs + +Outputs + + +Inputs1 + +Inputs + + +Outputs->Inputs1 + + + + +Outputs1 + +Outputs + + + +Inputs + +Inputs + + + +Version + +Version + + +Version1 + +Version + + + +tx0_label +The Main Parts Of +Transaction 0 + + +tx_label +Each input spends a previous output + + + + +utxos +Each output waits as an Unspent TX Output (UTXO) until a later input spends it + + + +tx1_label +The Main Parts Of +Transaction 1 + + + diff --git a/docs/img/dev/en-unlocking-p2pkh-output.dot b/docs/img/dev/en-unlocking-p2pkh-output.dot new file mode 100644 index 000000000..1e735f4b3 --- /dev/null +++ b/docs/img/dev/en-unlocking-p2pkh-output.dot @@ -0,0 +1,48 @@ +digraph blockchain { + +size="6.25"; + +//splines = "false"; +rankdir=LR; +//ranksep=0.1; +//splines=ortho; +overlap = false; +nodesep = 0.1; + +node [ fontname="Sans", shape = box, penwidth = 1.75 ]; +edge [ fontname="Sans", penwidth = 1.75, minlen = 2 ]; +graph [ fontname="Sans" ]; +penwidth = 1.75; + +subgraph cluster_tx2 { + scriptSig [ label = "Signature Script", shape = "none" ]; + tx2_signature [ label = "Signature" ]; + tx2_full_public_key [ label = "Full Public Key" ]; + script [ label = " \nPubkey Script", shape = "none" ]; + tx2_pubkey_hash [ label = "Public Key Hash" ]; + +} + +subgraph cluster_tx1 { + tx1_pubkey_hash [ label = "Public Key Hash" ]; + + label = "TX 1 Output" +} + +subgraph cluster_bob { + private_key [ label = "Private Key" ]; + full_public_key [ label = "Full Public Key" ]; + + label = "Bob's Computer" +} + +tx1_pubkey_hash -> tx2_pubkey_hash; + +{ + edge [ arrowhead = "none", arrowtail = "normal", dir=both ] + tx2_full_public_key -> full_public_key; + tx2_signature -> private_key [ style = "dashed" ]; +} + +label = " \nSpending A P2PKH Output" +} diff --git a/docs/img/dev/en-unlocking-p2pkh-output.png b/docs/img/dev/en-unlocking-p2pkh-output.png new file mode 100644 index 0000000000000000000000000000000000000000..3760779e04f227ce3fd63640ea9aa88c3f51719d GIT binary patch literal 5780 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 + + + + + +blockchain + + +Spending A P2PKH Output +cluster_tx2 + + +cluster_tx1 + +TX 1 Output + +cluster_bob + +Bob's Computer + + +scriptSig +Signature Script + + +tx2_signature + +Signature + + +private_key + +Private Key + + +tx2_signature->private_key + + + + +tx2_full_public_key + +Full Public Key + + +full_public_key + +Full Public Key + + +tx2_full_public_key->full_public_key + + + + +script + +Pubkey Script + + +tx2_pubkey_hash + +Public Key Hash + + +tx1_pubkey_hash + +Public Key Hash + + +tx1_pubkey_hash->tx2_pubkey_hash + + + + + diff --git a/docs/img/dev/en-unlocking-p2sh-output.dot b/docs/img/dev/en-unlocking-p2sh-output.dot new file mode 100644 index 000000000..165f173d5 --- /dev/null +++ b/docs/img/dev/en-unlocking-p2sh-output.dot @@ -0,0 +1,47 @@ +digraph blockchain { + +size="6.25"; + +//splines = "false"; +rankdir=LR; +//ranksep=0.1; +//splines=ortho; +overlap = false; +nodesep = 0.1; + +node [ shape = box, penwidth = 1.75 ]; +edge [ penwidth = 1.75, minlen = 2 ]; +penwidth = 1.75; + +subgraph cluster_tx2 { + scriptSig [ label = "Signature Script", shape = "none" ]; + tx2_signature [ label = "Signature" ]; + tx2_redeemScript [ label = "Full Redeem Script" ]; + script [ label = " \nPubkey Script", shape = "none" ]; + tx2_redeemScript_hash [ label = "Redeem Script Hash" ]; + +} + +subgraph cluster_tx1 { + tx1_redeemScript_hash [ label = "Redeem Script Hash" ]; + + label = "TX 1 Output" +} + +subgraph cluster_bob { + private_key [ label = "Private Key" ]; + redeemScript [ label = "Full Redeem Script" ]; + + label = "Bob's Computer" +} + +tx1_redeemScript_hash -> tx2_redeemScript_hash; + +{ + edge [ dir=back ] + tx2_redeemScript -> redeemScript; + tx2_signature -> private_key [ style = "dashed" ]; +} + +label = " \nSpending A P2SH Output" +} diff --git a/docs/img/dev/en-unlocking-p2sh-output.png b/docs/img/dev/en-unlocking-p2sh-output.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa0af0fe729f33ef27dfb08e8be84b55310e993 GIT binary patch literal 5263 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 + + + + + +blockchain + + +Spending A P2SH Output +cluster_tx2 + + +cluster_tx1 + +TX 1 Output + +cluster_bob + +Bob's Computer + + +scriptSig +Signature Script + + +tx2_signature + +Signature + + +private_key + +Private Key + + +tx2_signature->private_key + + + + +tx2_redeemScript + +Full Redeem Script + + +redeemScript + +Full Redeem Script + + +tx2_redeemScript->redeemScript + + + + +script + +Pubkey Script + + +tx2_redeemScript_hash + +Redeem Script Hash + + +tx1_redeemScript_hash + +Redeem Script Hash + + +tx1_redeemScript_hash->tx2_redeemScript_hash + + + + + diff --git a/docs/img/dev/en-wallets-distributing-only.dot b/docs/img/dev/en-wallets-distributing-only.dot new file mode 100644 index 000000000..a14b566a4 --- /dev/null +++ b/docs/img/dev/en-wallets-distributing-only.dot @@ -0,0 +1,50 @@ +digraph wallet_program { +size="6.25"; +rankdir=LR; +//ratio=fill; +splines=true; +fontname=Sans +ranksep=0.3; +penwidth=1.75; + +overlap = false; + +edge [ fontname=Sans, penwidth=1.75, style = "invis" ]; +node [ fontname=Sans, shape = box, penwidth=1.75 ]; + +subgraph cluster_distributing { + penwidth=0; + + distributing_priv [ label = "Create\nParent\nPrivate\nKey", style="invis" ]; + distributing_pub [ label = "Derive\nChild\nPublic\nKeys" ]; + distributing_distribute [ label = "Distribute\nPublic\nKeys" ]; + distributing_monitor [ label = "Monitor\nFor\nOutputs", style="invis" ]; + distributing_create [ label = "Create\nUnsigned\nTxes", style="invis" ]; + distributing_sign [ label = "Sign\nTxes", style="invis" ]; + distributing_broadcast [ label = "Broadcast\nTxes", style="invis" ]; + + distributing_priv -> distributing_pub -> distributing_distribute -> distributing_monitor -> distributing_create -> distributing_sign -> distributing_broadcast; + label = "Distributing-Only Wallet" +} + +subgraph cluster_networked { + penwidth=0; + + networked_priv [ label = "Create\nParent\nPrivate\nKey" ]; + networked_pub [ label = "Derive\nParent\nPublic\nKey" ]; + networked_distribute [ label = "Distribute\nPublic\nKeys", style="invis" ]; + networked_monitor [ label = "Monitor\nFor\nOutputs" ]; + networked_create [ label = "Create\nUnsigned\nTxes" ]; + networked_sign [ label = "Sign\nTxes" ]; + networked_broadcast [ label = "Broadcast\nTxes" ]; + + networked_priv -> networked_pub -> networked_distribute -> networked_monitor -> networked_create -> networked_sign -> networked_broadcast; + label = " Other Wallet(s)" +} + +networked_priv -> networked_pub [style=""]; +networked_pub -> distributing_pub [ constraint = false, style = ""]; +distributing_pub -> distributing_distribute -> networked_monitor -> networked_create -> networked_sign -> networked_broadcast [style=""]; + +} + diff --git a/docs/img/dev/en-wallets-distributing-only.png b/docs/img/dev/en-wallets-distributing-only.png new file mode 100644 index 0000000000000000000000000000000000000000..003ccb6650156a2abcc7db10b5a1801e1ecbf7f2 GIT binary patch literal 5998 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 ObS({i_1CJ{$o~Sf0y2UC literal 0 HcmV?d00001 diff --git a/docs/img/dev/en-wallets-distributing-only.svg b/docs/img/dev/en-wallets-distributing-only.svg new file mode 100644 index 000000000..2cba7b0b6 --- /dev/null +++ b/docs/img/dev/en-wallets-distributing-only.svg @@ -0,0 +1,131 @@ + + + + + + +wallet_program + +cluster_distributing + +Distributing-Only Wallet + +cluster_networked + +       Other Wallet(s) + + + +distributing_pub + +Derive +Child +Public +Keys + + + +distributing_distribute + +Distribute +Public +Keys + + + +distributing_pub->distributing_distribute + + + + + + +networked_monitor + +Monitor +For +Outputs + + +distributing_distribute->networked_monitor + + + + + + + + + + +networked_priv + +Create +Parent +Private +Key + + +networked_pub + +Derive +Parent +Public +Key + + +networked_priv->networked_pub + + + + + +networked_pub->distributing_pub + + + + + + + +networked_create + +Create +Unsigned +Txes + + +networked_monitor->networked_create + + + + + +networked_sign + +Sign +Txes + + + +networked_create->networked_sign + + + + +networked_broadcast + +Broadcast +Txes + + + +networked_sign->networked_broadcast + + + + + diff --git a/docs/img/dev/en-wallets-full-service.dot b/docs/img/dev/en-wallets-full-service.dot new file mode 100644 index 000000000..bfad5bbdd --- /dev/null +++ b/docs/img/dev/en-wallets-full-service.dot @@ -0,0 +1,30 @@ +digraph wallet_program { +size="6.25"; +rankdir=LR; +//ratio=fill; +splines=true; +fontname=Sans +ranksep=0.3; +penwidth=1.75; + +overlap = false; + +edge [ fontname=Sans, penwidth=1.75, style = "invis" ]; +node [ fontname=Sans, shape = box, penwidth=1.75 ]; + +subgraph cluster_networked { + penwidth=0; + networked_priv [ label = "Create\nPrivate\nKeys" ]; + networked_pub [ label = "Derive\nPublic\nKeys" ]; + networked_distribute [ label = "Distribute\nPublic\nKeys" ]; + networked_monitor [ label = "Monitor\nFor\nOutputs" ]; + networked_create [ label = "Create\nUnsigned\nTxes" ]; + networked_sign [ label = "Sign\nTxes" ]; + networked_broadcast [ label = "Broadcast\nTxes" ]; + + networked_priv -> networked_pub -> networked_distribute -> networked_monitor -> networked_create -> networked_sign -> networked_broadcast [ style = "" ]; + label = " \nFull-Service Wallet" +} + +} + diff --git a/docs/img/dev/en-wallets-full-service.png b/docs/img/dev/en-wallets-full-service.png new file mode 100644 index 0000000000000000000000000000000000000000..afa2a6ebb0db0a5799ac2c3613ae1e60cddd6af7 GIT binary patch literal 3818 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 Q|5;* + + + + + +wallet_program + +cluster_networked + + +Full-Service Wallet + + +networked_priv + +Create +Private +Keys + + +networked_pub + +Derive +Public +Keys + + +networked_priv->networked_pub + + + + +networked_distribute + +Distribute +Public +Keys + + +networked_pub->networked_distribute + + + + +networked_monitor + +Monitor +For +Outputs + + +networked_distribute->networked_monitor + + + + +networked_create + +Create +Unsigned +Txes + + +networked_monitor->networked_create + + + + +networked_sign + +Sign +Txes + + +networked_create->networked_sign + + + + +networked_broadcast + +Broadcast +Txes + + +networked_sign->networked_broadcast + + + + + diff --git a/docs/img/dev/en-wallets-signing-only.dot b/docs/img/dev/en-wallets-signing-only.dot new file mode 100644 index 000000000..166480d1e --- /dev/null +++ b/docs/img/dev/en-wallets-signing-only.dot @@ -0,0 +1,50 @@ +digraph wallet_program { +size="6.25"; +rankdir=LR; +//ratio=fill; +splines=true; +fontname=Sans +ranksep=0.3; +penwidth=1.75; + +overlap = false; + +edge [ fontname=Sans, penwidth=1.75, style = "invis" ]; +node [ fontname=Sans, shape = box, penwidth=1.75 ]; + +subgraph cluster_signing { + penwidth=0; + + signing_priv [ label = "Create\nParent\nPrivate\nKey" ]; + signing_pub [ label = "Derive\nParent\nPublic\nKey" ]; + signing_distribute [ label = "Distribute\nPublic\nKeys", style="invis" ]; + signing_monitor [ label = "Monitor\nFor\nOutputs", style="invis" ]; + signing_create [ label = "Create\nUnsigned\nTxes", style="invis" ]; + signing_sign [ label = "Sign\nTxes" ]; + signing_broadcast [ label = "Broadcast\nTxes", style="invis" ]; + + signing_priv -> signing_pub -> signing_distribute -> signing_monitor -> signing_create -> signing_sign -> signing_broadcast; + label = "Signing-Only Wallet" +} + +subgraph cluster_networked { + penwidth=0; + + networked_priv [ label = "Create\nPrivate\nKeys", style="invis" ]; + networked_pub [ label = "Derive\nChild\nPublic\nKeys" ]; + networked_distribute [ label = "Distribute\nPublic\nKeys" ]; + networked_monitor [ label = "Monitor\nFor\nOutputs" ]; + networked_create [ label = "Create\nUnsigned\nTxes" ]; + networked_sign [ label = "Sign\nTxes", style="invis" ]; + networked_broadcast [ label = "Broadcast\nTxes" ]; + + networked_priv -> networked_pub -> networked_distribute -> networked_monitor -> networked_create -> networked_sign -> networked_broadcast; + label = "Networked Wallet" +} + +signing_priv -> signing_pub [style=""]; +signing_pub -> networked_pub [ constraint = false, style = ""]; +networked_pub -> networked_distribute -> networked_monitor -> networked_create -> signing_sign -> networked_broadcast [style=""]; + +} + diff --git a/docs/img/dev/en-wallets-signing-only.png b/docs/img/dev/en-wallets-signing-only.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbf4246dbf1dff7be7e8f17fd21c22d7dc034bb GIT binary patch literal 6382 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 + + + + + +wallet_program + +cluster_signing + +Signing-Only Wallet + +cluster_networked + +Networked Wallet + + +signing_priv + +Create +Parent +Private +Key + + +signing_pub + +Derive +Parent +Public +Key + + + +signing_priv->signing_pub + + + + + + +networked_pub + +Derive +Child +Public +Keys + + +signing_pub->networked_pub + + + + + + + + +signing_sign + +Sign +Txes + + + + + +networked_broadcast + +Broadcast +Txes + + +signing_sign->networked_broadcast + + + + + + +networked_distribute + +Distribute +Public +Keys + + +networked_pub->networked_distribute + + + + + +networked_monitor + +Monitor +For +Outputs + + +networked_distribute->networked_monitor + + + + + +networked_create + +Create +Unsigned +Txes + + +networked_monitor->networked_create + + + + + +networked_create->signing_sign + + + + + + + + diff --git a/docs/img/dev/gifs/README.md b/docs/img/dev/gifs/README.md new file mode 100644 index 000000000..3163c9b80 --- /dev/null +++ b/docs/img/dev/gifs/README.md @@ -0,0 +1,31 @@ +# Some Animated GIF Hints + +An excellent set of background information can be found here: + + http://www.imagemagick.org/Usage/anim_basics/ + +1. Create source images. GraphViz supports direct GIF output, but its + white background is not-quite-white and its transparent backgroud is + hideous---so we output to PNG and then convert to GIF. + + for f in *dot ; do dot -o ${f/.dot}.png -T png $f ; done + +2. Create animated GIF using ImageMagick. Manually prefix first frame + and suffix last frame to provide a brief pause in the animation on + those frames. This wastes space but the optimization removes all of + that wasted space except for 3 bytes. + + convert -delay 100 \ + en-merkleblock-parsing-001.gif \ + *gif \ + en-merkleblock-parsing-011.gif \ + -loop 0 \ + animated-en-merkleblock-parsing.gif + +3. Compress animated GIF (118 KB -> 15 KB in this example). You may need + to play with color settings; 8 worked in this example but 4 was too + few. Fewer colors (base-2) results in much better compression. + + gifsicle -b -O3 --colors 8 --no-background \ + animated-en-merkleblock-parsing.gif + diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-001.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-001.dot new file mode 100644 index 000000000..6b2db10b0 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-001.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0" ]; + flag1 [ label = "1" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5" ]; + D [ label = "H4" ]; + C [ label = "H3" ]; + B [ label = "H2" ]; + A [ label = "H1" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB [ label = "H8" ]; + CD [ label = "H9" ]; + EF [ label = "H10" ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12" ]; + EFG2 [ label = "H13" ]; + + ABCD -> ROOT; + EFG2 -> ROOT; + + ROOT -> ABCD [ constraint = false, style = "invis" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "H14" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-002.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-002.dot new file mode 100644 index 000000000..f098f09ee --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-002.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0" ]; + flag1 [ label = "1" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4 ]; + D [ label = "H4" ]; + C [ label = "H3" ]; + B [ label = "H2" ]; + A [ label = "H1" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB [ label = "H8" ]; + CD [ label = "H9" ]; + EF [ label = "H10", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12" ]; + EFG2 [ label = "H13", penwidth = 4 ]; + + ABCD -> ROOT; + EFG2 -> ROOT; + + ROOT -> ABCD [ constraint = false, style = "invis" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "H14", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-003.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-003.dot new file mode 100644 index 000000000..ab25828bd --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-003.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0" ]; + flag1 [ label = "1", style = "filled" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4 ]; + D [ label = "H4" ]; + C [ label = "H3" ]; + B [ label = "H2" ]; + A [ label = "H1" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB [ label = "H8" ]; + CD [ label = "H9" ]; + EF [ label = "H10", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12" ]; + EFG2 [ label = "H13", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT; + + ROOT -> ABCD [ constraint = false, style = "invis" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4, style = "filled" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-004.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-004.dot new file mode 100644 index 000000000..8c1273b88 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-004.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0", style = "filled" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H12", style = "filled" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4 ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "H10", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals,filled" ]; + EFG2 [ label = "H13", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-005.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-005.dot new file mode 100644 index 000000000..44accd327 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-005.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1", style = "filled" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4 ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "H10", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4, style = "filled" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-006.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-006.dot new file mode 100644 index 000000000..d49957d9e --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-006.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1", style = "filled" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4 ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "↓", penwidth = 4, style = "filled" ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-007.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-007.dot new file mode 100644 index 000000000..85ab39839 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-007.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1", style = "filled" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H5", style = "filled" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6" ]; + E [ label = "H5", penwidth = 4, style = "diagonals,filled" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "↓", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-008.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-008.dot new file mode 100644 index 000000000..a8135e40b --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-008.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0", style = "filled" ]; + flag5 [ label = "1", style = "" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H6", style = "filled" ]; + hash2 [ label = "H5", style = "" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6", style = "diagonals,filled" ]; + E [ label = "H5", penwidth = 4, style = "diagonals" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "↓", penwidth = 4 ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-009.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-009.dot new file mode 100644 index 000000000..68bb82eac --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-009.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0", style = "" ]; + flag5 [ label = "1", style = "" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H6", style = "" ]; + hash2 [ label = "H5", style = "" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "H7" ]; + F [ label = "H6", style = "diagonals" ]; + E [ label = "H5", penwidth = 4, style = "diagonals" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "", penwidth = 4, style = "filled" ]; + G2 [ label = "H11" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-010.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-010.dot new file mode 100644 index 000000000..9f7cf9c97 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-010.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "filled" ]; + flag6 [ label = "0", style = "" ]; + flag5 [ label = "1", style = "" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H11", style = "filled" ]; + hash3 [ label = "H6", style = "" ]; + hash2 [ label = "H5", style = "" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "" ]; + F [ label = "H6", style = "diagonals" ]; + E [ label = "H5", penwidth = 4, style = "diagonals" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "", penwidth = 4 ]; + G2 [ label = "H11", style = "diagonals,filled" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "↓", penwidth = 4 ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-011.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-011.dot new file mode 100644 index 000000000..db5cdfdf5 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-011.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "" ]; + flag6 [ label = "0", style = "" ]; + flag5 [ label = "1", style = "" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H11", style = "" ]; + hash3 [ label = "H6", style = "" ]; + hash2 [ label = "H5", style = "" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "" ]; + F [ label = "H6", style = "diagonals" ]; + E [ label = "H5", penwidth = 4, style = "diagonals" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "", penwidth = 4 ]; + G2 [ label = "H11", style = "diagonals" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "", penwidth = 4, style = "filled" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, dir = "back" ]; + + ROOT [ label = "↓", penwidth = 4 ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-012.dot b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-012.dot new file mode 100644 index 000000000..6f5a2db0b --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-creation/en-merkleblock-creation-012.dot @@ -0,0 +1,148 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.07 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none", style = "invis" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "" ]; + flag6 [ label = "0", style = "" ]; + flag5 [ label = "1", style = "" ]; + flag4 [ label = "1", style = "" ]; + flag3 [ label = "1", style = "" ]; + flag2 [ label = "0", style = "" ]; + flag1 [ label = "1", style = "" ]; + flag_label [ label = "Flags", style = "", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none", style = "invis" ]; + + hash4 [ label = "H11", style = "" ]; + hash3 [ label = "H6", style = "" ]; + hash2 [ label = "H5", style = "" ]; + hash1 [ label = "H12", style = "" ]; + hash_label [ label = "Hashes", style = "", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "Match Or\nMatch\nAncestor" ]; + hash_from_list_label [ label = "Hash\nOn\nList" ]; + hash_computed_label [ label = "Hash\nNot\nNeeded" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4 ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G [ label = "" ]; + F [ label = "H6", style = "diagonals" ]; + E [ label = "H5", penwidth = 4, style = "diagonals" ]; + D [ label = "" ]; + C [ label = "" ]; + B [ label = "" ]; + A [ label = "" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB [ label = "" ]; + CD [ label = "" ]; + EF [ label = "", penwidth = 4 ]; + G2 [ label = "H11", style = "diagonals" ]; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD [ label = "H12", style = "diagonals" ]; + EFG2 [ label = "", penwidth = 4, ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, dir = "back" ]; + + ROOT [ label = "", penwidth = 4, style = "filled" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.dot new file mode 100644 index 000000000..3286c0a5e --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.dot @@ -0,0 +1,138 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0" ]; + flag1 [ label = "1" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E; + D; + C; + B; + A; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT; + EFG2 -> ROOT; + + ROOT -> ABCD [ constraint = false, style = "invis" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-001.png new file mode 100644 index 0000000000000000000000000000000000000000..c69aaf7df39968aae76c888a7967faac615ce887 GIT binary patch literal 5951 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 +1 + + +flag4 +1 + + +flag3 +1 + + +flag2 +0 + + +flag1 +1 + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 +H2 + + +hash1 +H1 + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + +F->EF + + + +E + + + +E->EF + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + + + +ABCD + + + +AB->ABCD + + + + + +CD->ABCD + + + + + +EFG2 + + + +EF->EFG2 + + + + +G2->EFG2 + + + + + +ROOT + + + +ABCD->ROOT + + + + + +EFG2->ROOT + + + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.dot new file mode 100644 index 000000000..5b6c06eca --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.dot @@ -0,0 +1,140 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0" ]; + flag1 [ label = "1", style = "filled" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E; + D; + C; + B; + A; + + ROOT [ style = "filled", label = "↓" ] + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT; + + ROOT -> ABCD [ constraint = false, style = "invis" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-002.png new file mode 100644 index 0000000000000000000000000000000000000000..93da2d39d6147883407fb34dd5462c016f7eb66c GIT binary patch literal 6043 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 +1 + + +flag4 +1 + + +flag3 +1 + + +flag2 +0 + + +flag1 + +1 + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 +H2 + + +hash1 +H1 + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + +F->EF + + + +E + + + +E->EF + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + +ROOT + + + + +ABCD + + + + +EFG2 + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + + +EF->EFG2 + + + + +G2->EFG2 + + + +ABCD->ROOT + + + + + + +EFG2->ROOT + + + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.dot new file mode 100644 index 000000000..68a2a34dd --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.dot @@ -0,0 +1,141 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1" ]; + flag2 [ label = "0", style = "filled" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1", style = "filled" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E; + D; + C; + B; + A; + + ABCD [ style = "filled,diagonals", label = "H1" ] + ROOT [ label = "↓" ] + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-003.png new file mode 100644 index 0000000000000000000000000000000000000000..543dedf4035851c7593149565d93f40264ba46cb GIT binary patch literal 6347 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 +1 + + +flag4 +1 + + +flag3 +1 + + +flag2 + +0 + + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 +H2 + + +hash1 + +H1 + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + +F->EF + + + +E + + + +E->EF + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + +ABCD + + + + + +H1 + + +ROOT + + + + +ABCD->ROOT + + + + + + +ROOT->ABCD + + + + +EFG2 + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + + +EF->EFG2 + + + + +G2->EFG2 + + + +EFG2->ROOT + + + + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.dot new file mode 100644 index 000000000..ba3e4e3ac --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.dot @@ -0,0 +1,142 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1" ]; + flag3 [ label = "1", style = "filled" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" + +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E; + D; + C; + B; + A; + + EFG2 [ style = "filled", label = "↓" ] + ABCD [ style = "diagonals", label = "H1" ] + ROOT [ label = "↓" ] + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF; + F -> EF; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcb53f2669948a298dbe7966504b2c5bb114a3b GIT binary patch literal 6323 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg new file mode 100644 index 000000000..67e7facd7 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-004.svg @@ -0,0 +1,294 @@ + + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 +1 + + +flag4 +1 + + +flag3 + +1 + + + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 +H2 + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + +F->EF + + + +E + + + +E->EF + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + +EFG2 + + + + +ROOT + + + + +EFG2->ROOT + + + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + + +EF->EFG2 + + + + + +G2->EFG2 + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.dot new file mode 100644 index 000000000..827fbd027 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.dot @@ -0,0 +1,140 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1" ]; + flag4 [ label = "1", style = "filled" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E; + D; + C; + B; + A; + + EF [ style = "filled", label = "↓" ]; + EFG2 [ label = "↓" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, style = "invis" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9c0bdcbab4920165fc49b64cd5d4bb99ea6b6e GIT binary patch literal 6343 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg new file mode 100644 index 000000000..81ca27aea --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-005.svg @@ -0,0 +1,293 @@ + + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 +1 + + +flag4 + +1 + + + + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 +H2 + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + + +F->EF + + + +E + + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + + + +EFG2 + + + + +EF->EFG2 + + + + + +ROOT + + + + +EFG2->ROOT + + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + +G2->EFG2 + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.dot new file mode 100644 index 000000000..5687ebc1e --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.dot @@ -0,0 +1,140 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0" ]; + flag5 [ label = "1", style = "filled" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3" ]; + hash2 [ label = "H2", style = "filled" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F; + E [ penwidth = 4, style = "filled,diagonals", label = "H2" ]; + D; + C; + B; + A; + + EF [ label = "↓" ]; + EFG2 [ label = "↓" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, style = "invis" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.png new file mode 100644 index 0000000000000000000000000000000000000000..1f78aa758e04083ae595ad9dce2c6590bf22b1d9 GIT binary patch literal 6657 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 H!2|yfa%h_@ literal 0 HcmV?d00001 diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg new file mode 100644 index 000000000..6ef673f70 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-006.svg @@ -0,0 +1,301 @@ + + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 +0 + + +flag5 + +1 + + + + + + +flag_label +Flags + + +hash4 +H4 + + +hash3 +H3 + + +hash2 + +H2 + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + +EF + + + + +F->EF + + + + +E + + + + + +H2 + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + + +EF->E + + + + +EFG2 + + + + +EF->EFG2 + + + + + +ROOT + + + + +EFG2->ROOT + + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + +G2->EFG2 + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.dot new file mode 100644 index 000000000..112256b57 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.dot @@ -0,0 +1,140 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0", style = "filled" ]; + flag5 [ label = "1", style = "invis" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3", style = "filled" ]; + hash2 [ label = "H2", style = "invis" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F [ style = "filled,diagonals" label = "H3" ]; + E [ penwidth = 4, style = "diagonals", label = "H2" ]; + D; + C; + B; + A; + + EF [ label = "↓" ]; + EFG2 [ label = "↓" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, style = "invis" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.png new file mode 100644 index 0000000000000000000000000000000000000000..905abf155351a5954f8b8a31dcc2d0eb0e8fa077 GIT binary patch literal 6919 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 literal 0 HcmV?d00001 diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg new file mode 100644 index 000000000..246e4bd8c --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-007.svg @@ -0,0 +1,304 @@ + + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + +flag6 + +0 + + + + + + + +flag_label +Flags + + +hash4 +H4 + + +hash3 + +H3 + + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + + + +H3 + + +EF + + + + +F->EF + + + + +E + + + + + +H2 + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + +EF->F + + + + +EF->E + + + + +EFG2 + + + + +EF->EFG2 + + + + + +ROOT + + + + +EFG2->ROOT + + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + +G2->EFG2 + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.dot new file mode 100644 index 000000000..ca6bd7680 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.dot @@ -0,0 +1,140 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0" ]; + flag6 [ label = "0", style = "invis" ]; + flag5 [ label = "1", style = "invis" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4" ]; + hash3 [ label = "H3", style = "invis" ]; + hash2 [ label = "H2", style = "invis" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F [ style = "diagonals", label = "H3" ]; + E [ penwidth = 4, style = "diagonals", label = "H2" ]; + D; + C; + B; + A; + + EF [ label = "H()", style = "filled" ]; + EFG2 [ label = "↓" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, style = "invis" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-008.png new file mode 100644 index 0000000000000000000000000000000000000000..c647758ad9be449be6f7adb7be88ccc6aa127292 GIT binary patch literal 6913 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 +0 + + + + + + + + +flag_label +Flags + + +hash4 +H4 + + + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + +G->G2 + + + +F + + + + + +H3 + + +EF + +H() + + +F->EF + + + + +E + + + + + +H2 + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + +EF->F + + + + +EF->E + + + + +EFG2 + + + + +EF->EFG2 + + + + +EFG2->EF + + + + +ROOT + + + + +EFG2->ROOT + + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + +G2->EFG2 + + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.dot new file mode 100644 index 000000000..a697d90b1 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.dot @@ -0,0 +1,141 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "filled" ]; + flag6 [ label = "0", style = "invis" ]; + flag5 [ label = "1", style = "invis" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4", style = "filled" ]; + hash3 [ label = "H3", style = "invis" ]; + hash2 [ label = "H2", style = "invis" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F [ style = "diagonals", label = "H3" ]; + E [ penwidth = 4, style = "diagonals", label = "H2" ]; + D; + C; + B; + A; + + G2 [ label = "H4", style = "filled,diagonals" ]; + EF [ label = "H()", ]; + EFG2 [ label = "↓" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, style = "invis" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-009.png new file mode 100644 index 0000000000000000000000000000000000000000..5648800398e8bd9885a6d1a8785cb59c06bb716f GIT binary patch literal 7329 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + +flag7 + +0 + + + + + + + + +flag_label +Flags + + +hash4 + +H4 + + + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + + + +H4 + + +G->G2 + + + +F + + + + + +H3 + + +EF + +H() + + +F->EF + + + + +E + + + + + +H2 + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + + +EFG2 + + + + +G2->EFG2 + + + + +EF->F + + + + +EF->E + + + + +EF->EFG2 + + + + +EFG2->G2 + + + + +EFG2->EF + + + + +ROOT + + + + +EFG2->ROOT + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-010.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-010.dot new file mode 100644 index 000000000..23d9e8e67 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-010.dot @@ -0,0 +1,141 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "invis" ]; + flag6 [ label = "0", style = "invis" ]; + flag5 [ label = "1", style = "invis" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4", style = "invis" ]; + hash3 [ label = "H3", style = "invis" ]; + hash2 [ label = "H2", style = "invis" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F [ style = "diagonals", label = "H3" ]; + E [ penwidth = 4, style = "diagonals", label = "H2" ]; + D; + C; + B; + A; + + G2 [ label = "H4", style = "diagonals" ]; + EF [ label = "H()" ]; + EFG2 [ label = "H()", style = "filled" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "↓" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, dir = "back" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.dot b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.dot new file mode 100644 index 000000000..f86a9e5e5 --- /dev/null +++ b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.dot @@ -0,0 +1,141 @@ +digraph merkleblock { + +//size="6.25,2.22"; +size="6.25"; +rankdir=BT +nodesep=0.1 +splines="false" + +edge [ penwidth = 1.75, fontname="Sans" ] +node [ penwidth = 1.75, shape = "box", fontname="Sans", ] +graph [ penwidth = 1.75, fontname="Sans", fontsize = 16 ] + +subgraph cluster_flags { + node [ label = "", width=0.2, height=0.2, fontsize = 14, shape = "none" ]; + graph [ penwidth = 0 ]; + + flag8 [ label = "0" ]; + flag7 [ label = "0", style = "invis" ]; + flag6 [ label = "0", style = "invis" ]; + flag5 [ label = "1", style = "invis" ]; + flag4 [ label = "1", style = "invis" ]; + flag3 [ label = "1", style = "invis" ]; + flag2 [ label = "0", style = "invis" ]; + flag1 [ label = "1", style = "invis" ]; + flag_label [ label = "Flags", shape = "none", fontsize = 16 ]; +} + +subgraph cluster_hashes { + graph [ penwidth = 0 ]; + node [ shape = "none" ]; + + hash4 [ label = "H4", style = "invis" ]; + hash3 [ label = "H3", style = "invis" ]; + hash2 [ label = "H2", style = "invis" ]; + hash1 [ label = "H1", style = "invis" ]; + hash_label [ label = "Hashes", shape = "none", fontsize = 16 ]; +} + +hash_label -> flag_label [ style = "invis" ]; + +subgraph cluster_legend { + node [ label = "", fontsize = 18 ]; + graph [ penwidth = 0 ]; + edge [ style = "invis" ]; + ranksep = 3; + + + { + node [ shape = "none" ]; + matched_filter_label [ label = "TXID\nFilter\nMatch" ]; + hash_from_list_label [ label = "Hash\nFrom\nList" ]; + hash_computed_label [ label = "Hash\nCom-\nputed" ]; + waiting_label [ label = "Wait\nFor\nChild" ]; + } + + matched_filter [ penwidth = 4, style = "diagonals", bgcolor = grey ]; + hash_from_list [ label = "H1", style = "diagonals" ]; + hash_computed [ label = "H()" ]; + waiting [ label = "↓" ]; + + pre_legend_label [ label = "", style = "invis", width=0, height=0 ]; + legend_label [ label = "", style = "invis", width=0, height=0 ]; + pre_legend_label -> legend_label [ style = "invis" ]; + + waiting_label -> waiting; + hash_from_list_label -> hash_from_list; + hash_computed_label -> hash_computed; + matched_filter_label -> matched_filter; + + labelloc = b; + label = "Legend" +} + +legend_label -> hash_label [ style = "invis" ]; + +subgraph cluster_tree { + edge [ dir = "none" ]; + node [ label = "", fontsize = 16 ]; + graph [ penwidth = 0 ]; + + { + root_row [ shape = "none" ]; + row1 [ shape = "none", label = "Non-TXID\nNodes" ]; + row2 [ shape = "none", style = "invis", width = 1.2 ]; + txid_row [ label = "TXID\nNodes", shape = "none" ]; + + row2 -> row1 [ dir = "back" ]; + row1 -> root_row [ dir = ""]; + txid_row -> row2 [ style = "invis" ]; + } + + G; + F [ style = "diagonals", label = "H3" ]; + E [ penwidth = 4, style = "diagonals", label = "H2" ]; + D; + C; + B; + A; + + G2 [ label = "H4", style = "diagonals" ]; + EF [ label = "H()", ]; + EFG2 [ label = "H()" ]; + ABCD [ style = "diagonals", label = "H1" ]; + ROOT [ label = "H()", style = "filled" ]; + + A -> AB; + B -> AB; + C -> CD; + D -> CD; + E -> EF [ dir = "back" ]; + F -> EF [ dir = "back" ]; + G -> G2; + + AB -> A [ constraint = false, style = "invis" ]; + AB -> B [ constraint = false, style = "invis" ]; + CD -> C [ constraint = false, style = "invis" ]; + CD -> D [ constraint = false, style = "invis" ]; + EF -> E [ constraint = false, dir = "back" ]; + EF -> F [ constraint = false, dir = "back" ]; + G2 -> G [ constraint = false, style = "invis" ]; + + AB -> ABCD; + CD -> ABCD; + EF -> EFG2 [ dir = "back" ]; + G2 -> EFG2 [ dir = "back" ]; + + ABCD -> AB [ constraint = false, style = "invis" ]; + ABCD -> CD [ constraint = false, style = "invis" ]; + EFG2 -> EF [ constraint = false, dir = "back" ]; + EFG2 -> G2 [ constraint = false, dir = "back" ]; + + ABCD -> ROOT [ dir = "back" ]; + EFG2 -> ROOT [ dir = "back" ]; + + ROOT -> ABCD [ constraint = false, dir = "back" ]; + ROOT -> EFG2 [ constraint = false, dir = "back" ]; + +} + +//label = "Parsing A MerkleBlock Message" +} diff --git a/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.png b/docs/img/dev/gifs/en-merkleblock-parsing/en-merkleblock-parsing-011.png new file mode 100644 index 0000000000000000000000000000000000000000..4b12af0f56cb0d37e7027320aca293990b1817e6 GIT binary patch literal 7290 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 + + + + + +merkleblock + +cluster_flags + + +cluster_hashes + + +cluster_legend + +Legend + +cluster_tree + + + +flag8 +0 + + + + + + + + + +flag_label +Flags + + + + + + +hash_label +Hashes + + + +matched_filter_label +TXID +Filter +Match + + +matched_filter + + + + + + + + +hash_from_list_label +Hash +From +List + + +hash_from_list + + + + + +H1 + + + +hash_computed_label +Hash +Com- +puted + + +hash_computed + +H() + + + +waiting_label +Wait +For +Child + + +waiting + + + + + + + + + +root_row + + +row1 +Non-TXID +Nodes + + +row1->root_row + + + + + +row2->row1 + + + + +txid_row +TXID +Nodes + + + +G + + + +G2 + + + + + +H4 + + +G->G2 + + + +F + + + + + +H3 + + +EF + +H() + + +F->EF + + + + +E + + + + + +H2 + + +E->EF + + + + +D + + + +CD + + + +D->CD + + + +C + + + +C->CD + + + +B + + + +AB + + + +B->AB + + + +A + + + +A->AB + + + + +EFG2 + +H() + + +G2->EFG2 + + + + +EF->F + + + + +EF->E + + + + +EF->EFG2 + + + + +EFG2->G2 + + + + +EFG2->EF + + + + +ROOT + +H() + + +EFG2->ROOT + + + + +ABCD + + + + + +H1 + + +ABCD->ROOT + + + + + + +ROOT->EFG2 + + + + +ROOT->ABCD + + + + + + +AB->ABCD + + + + + +CD->ABCD + + + + diff --git a/docs/img/icons/icon_warning.png b/docs/img/icons/icon_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ff25a453b2446856c565c8b2a751e29e5e300a1a GIT binary patch literal 637 zcmV-@0)qXCP)EfA8gp$%W=i!76kqH63(u5vgwCU?#0g z5YerJC}b!KP8J*l#g-(EqO0QOD1r`(ql=4J7jY0&2)R&5uO_{F9YSd@xsNL3S?+l6 zd44?q_x_@)j6=p)sN)2idokIK%sJG%0CLz9cX9vqKWlLriQBQ=uuh@8+f`yi&~pBU z^FAsUy^190Wu-kO~cir zxvKN+-x|BD?1oNUd`tH7ClZC(?NQ1zsfWb_!FDZE7MS-L^D`t0B{28x3{}dVx-~zX z4+Q^MmNbTjHW`+}%I^mmUrbh_gmjAhui>^ngSw#}MeeUJ=Zb?P03zwTD2JlJ&WBq#QHFsIxMuGjupoBL zIJlFX8vtzb@`z??i8*IEo^(L|Yvb82s$ z?wbXS+%)~~ujA}^Lf%y2nJDMu%)PHKVu9N-M4yYQVmC6^K(C + + + + + + diff --git a/docs/user/developers/index.rst b/docs/user/developers/index.rst index e76535560..1e8c9e48c 100644 --- a/docs/user/developers/index.rst +++ b/docs/user/developers/index.rst @@ -11,7 +11,7 @@ Developers The `Dash Platform Developer Documentation `_ contains technical documentation intended to help developers quickly and easily get started with Dash Platform. The :ref:`Dash Core Developer -Documentation ` provides detailed +Documentation ` provides detailed documentation on the Dash Core code base, and serves as a reference for experienced developers. These documentation portals can help developers to quickly and efficiently integrate external applications with the Dash diff --git a/docs/user/developers/integration.rst b/docs/user/developers/integration.rst index 8d5687291..249279cac 100644 --- a/docs/user/developers/integration.rst +++ b/docs/user/developers/integration.rst @@ -40,19 +40,19 @@ JSON-RPC Interface The majority of commands are unchanged from Bitcoin making integration into existing systems relatively straightforward. For a complete listing of RPC -commands please refer to the :ref:`​Dash Developer Guide -`. +commands please refer to the :ref:`Dash Developer Guide +`. Note that the following commands have been modified to support InstantSend: - - :ref:`getrawmempool ` - - :ref:`getmempoolancestors ` - - :ref:`getmempooldescendants ` - - :ref:`getmempoolentry ` - - :ref:`getrawtransaction ` - - :ref:`gettransaction ` - - :ref:`listtransactions ` - - :ref:`listsinceblock ` + - :ref:`getrawmempool ` + - :ref:`getmempoolancestors ` + - :ref:`getmempooldescendants ` + - :ref:`getmempoolentry ` + - :ref:`getrawtransaction ` + - :ref:`gettransaction ` + - :ref:`listtransactions ` + - :ref:`listsinceblock ` Special Transactions -------------------- @@ -90,17 +90,17 @@ transaction types exist: +=========+======+================+===============================================================+ | 3 | 0 | n/a | Standard Transaction | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 1 | variable | :ref:`Masternode Registration ` | +| 3 | 1 | variable | :ref:`Masternode Registration ` | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 2 | variable | :ref:`Update Masternode Service ` | +| 3 | 2 | variable | :ref:`Update Masternode Service ` | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 3 | variable | :ref:`Update Masternode Operator ` | +| 3 | 3 | variable | :ref:`Update Masternode Operator ` | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 4 | variable | :ref:`Masternode Revocation ` | +| 3 | 4 | variable | :ref:`Masternode Revocation ` | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 5 | variable | :ref:`Masternode List Merkle Proof ` | +| 3 | 5 | variable | :ref:`Masternode List Merkle Proof ` | +---------+------+----------------+---------------------------------------------------------------+ -| 3 | 6 | variable | :ref:`Quorum Commitment ` | +| 3 | 6 | variable | :ref:`Quorum Commitment ` | +---------+------+----------------+---------------------------------------------------------------+ Integration notes: @@ -117,7 +117,7 @@ Integration notes: Transactions was split into two fields: ``version`` and ``type`` (each consisting of 2 bytes). -4. Refer to the :ref:`Special Transactions ` +4. Refer to the :ref:`Special Transactions ` section of the Dash developer reference for additional detail on these data types, e.g. . @@ -180,7 +180,7 @@ Receiving an InstantSend Transaction introduces two requirements: InstantSend Status is provided by the dash daemon, typically through a direct connection (e.g. RPC), :ref:`ZMQ notification -`, or through the usage of an +`, or through the usage of an external wallet notification script. Direct Connection @@ -191,14 +191,14 @@ daemon using JSON-RPC protocol. The ``instantlock`` attribute of the JSON response reflects the status of the transaction and is included in the following commands: -- :ref:`getrawmempool ` -- :ref:`getmempoolancestors ` -- :ref:`getmempooldescendants ` -- :ref:`getmempoolentry ` -- :ref:`getrawtransaction ` -- :ref:`gettransaction ` -- :ref:`listtransactions ` -- :ref:`listsinceblock ` +- :ref:`getrawmempool ` +- :ref:`getmempoolancestors ` +- :ref:`getmempooldescendants ` +- :ref:`getmempoolentry ` +- :ref:`getrawtransaction ` +- :ref:`gettransaction ` +- :ref:`listtransactions ` +- :ref:`listsinceblock ` ZMQ Notification ^^^^^^^^^^^^^^^^ @@ -265,8 +265,8 @@ and are intended to help provide a more complete understanding of the underlying technologies. - `InstantSend Technical Information `__ -- :ref:`InstantSend Developer Documentation ` -- :ref:`Receiving ZMQ notifications ` +- :ref:`InstantSend Developer Documentation ` +- :ref:`Receiving ZMQ notifications ` - `DIP0010: LLMQ InstantSend `__ - `Product Brief: Dash Core v0.14 Release `__ @@ -304,7 +304,7 @@ Receiving a ChainLock introduces two requirements: ChainLock status is provided by the dash daemon, typically through a direct connection (e.g. RPC) or by a :ref:`ZMQ notification -`. +`. Direct Connection ^^^^^^^^^^^^^^^^^ @@ -314,20 +314,20 @@ daemon using JSON-RPC protocol. The boolean ``chainlock`` attribute of the JSON response reflects the ChainLock status of the block or transaction and is included in the following commands: -- :ref:`getblock ` -- :ref:`getblockheader ` -- :ref:`getblockheaders ` -- :ref:`getrawtransaction ` -- :ref:`gettransaction ` -- :ref:`listtransactions ` -- :ref:`listsinceblock ` +- :ref:`getblock ` +- :ref:`getblockheader ` +- :ref:`getblockheaders ` +- :ref:`getrawtransaction ` +- :ref:`gettransaction ` +- :ref:`listtransactions ` +- :ref:`listsinceblock ` ZMQ Notification ^^^^^^^^^^^^^^^^ ChainLock signatures are created shortly after the related block has been mined. As a result it is recommended that integrated clients use :ref:`ZMQ (ZeroMQ) -notifications ` in order to ensure +notifications ` in order to ensure that this information is received as promptly as possible. Refer to `the list of possible ZMQ notifications `__ for more @@ -381,7 +381,7 @@ The following resources provide additional information about InstantSend and are intended to help provide a more complete understanding of the underlying technologies. -- :ref:`ChainLock Developer Documentation ` -- :ref:`Receiving ZMQ notifications ` +- :ref:`ChainLock Developer Documentation ` +- :ref:`Receiving ZMQ notifications ` - `DIP0008: ChainLocks `__ - `Product Brief: Dash Core v0.14 Release `__ diff --git a/docs/user/developers/testnet.rst b/docs/user/developers/testnet.rst index 8f7a42125..b0fb7a38f 100644 --- a/docs/user/developers/testnet.rst +++ b/docs/user/developers/testnet.rst @@ -36,7 +36,7 @@ aspects of regtest (the local-only regression testing mode that provides controlled block generation). Unlike testnet, multiple independent devnets can be created and coexist without interference. For practical documentation on how to use devnets, see the :ref:`developer documentation -` +` or this `blog post `__. Tools and links diff --git a/docs/user/governance/using.rst b/docs/user/governance/using.rst index 824b1aec1..c31a14d7e 100644 --- a/docs/user/governance/using.rst +++ b/docs/user/governance/using.rst @@ -282,7 +282,7 @@ Prepare the collateral transaction Finally, open your Dash Core wallet console and use the ``gobject prepare`` command to complete the proposal preparation and submit the collateral transaction. See the :ref:`Core developer documentation -` for additional details. +` for additional details. .. warning:: Running this command will create a transaction spending 1 DASH from the wallet @@ -312,7 +312,7 @@ Submit the proposal Once the transaction has six confirmations, use the ``gobject submit`` command to submit the prepared governance object to the network for voting. See the -:ref:`Core developer documentation ` for additional +:ref:`Core developer documentation ` for additional details. :: diff --git a/docs/user/wallets/dashcore/advanced.rst b/docs/user/wallets/dashcore/advanced.rst index 46c83cea1..b9d4279e4 100644 --- a/docs/user/wallets/dashcore/advanced.rst +++ b/docs/user/wallets/dashcore/advanced.rst @@ -606,7 +606,7 @@ wallets from the **File** menu in addition to the previously available options. .. warning:: Wallet-related RPCs require using the ``-rpcwallet`` option when more than one wallet file is loaded. This is to ensure the RPC command is executed - using the correct wallet. See the :ref:`Core developer documentation ` + using the correct wallet. See the :ref:`Core developer documentation ` for additional information. Open a wallet diff --git a/docs/user/wallets/dashcore/cmd-rpc.rst b/docs/user/wallets/dashcore/cmd-rpc.rst index 6b50867fe..6ae2605c4 100644 --- a/docs/user/wallets/dashcore/cmd-rpc.rst +++ b/docs/user/wallets/dashcore/cmd-rpc.rst @@ -40,12 +40,12 @@ Command line arguments ====================== Detailed information for all command line arguments can be found at the -following links to the :ref:`Dash Core developer documentation site `: +following links to the :ref:`Dash Core developer documentation site `: -- :ref:`dashd ` -- :ref:`dash-qt ` -- :ref:`dash-cli ` -- :ref:`dash-tx ` +- :ref:`dashd ` +- :ref:`dash-qt ` +- :ref:`dash-cli ` +- :ref:`dash-tx ` RPC commands @@ -54,11 +54,11 @@ RPC commands .. warning:: Wallet-related RPCs require using the ``-rpcwallet`` option when more than one wallet file is loaded. This is to ensure the RPC command is executed - using the correct wallet. See the :ref:`Core developer documentation ` + using the correct wallet. See the :ref:`Core developer documentation ` for additional information. Detailed documentation for all available RPC commands is accessible via -the :ref:`Dash Core developer documentation RPC page `. +the :ref:`Dash Core developer documentation RPC page `. For full documentation of arguments, results and examples, type ``help ( "command" )`` to view full details at the console. You can enter commands either from **Tools > Console** in the QT wallet, or using diff --git a/docs/user/wallets/dashcore/interface.rst b/docs/user/wallets/dashcore/interface.rst index db39326e3..b2100ec74 100644 --- a/docs/user/wallets/dashcore/interface.rst +++ b/docs/user/wallets/dashcore/interface.rst @@ -574,7 +574,7 @@ The Console tab provides an interface with the Dash Core RPC (remote procedure call) console. This is equivalent to the ``dash-cli`` command on headless versions of Dash, such as ``dashd`` running on a masternode. Click the red ``×`` icon to clear the console, and see the detailed :ref:`documentation -` on RPC commands to learn about the possible commands you can +` on RPC commands to learn about the possible commands you can issue. .. figure:: img/tools-console.png diff --git a/index.rst b/index.rst index 52b8620f9..4d1a9daa2 100644 --- a/index.rst +++ b/index.rst @@ -47,12 +47,12 @@ learning about :ref:`safety ` or joining one of the many .. grid-item-card:: ⚙ Core Docs :margin: 2 2 auto auto :link-type: ref - :link: core:core-index + :link: core-index Find technical details about the Dash Core blockchain, along with protocol and API reference material. +++ - :ref:`Click to begin ` + :ref:`Click to begin ` .. grid-item-card:: 🚀 Platform Docs :margin: 2 2 auto auto @@ -74,3 +74,4 @@ learning about :ref:`safety ` or joining one of the many :maxdepth: 3 docs/user/index + docs/core/index From 13c69c0a8721e0b1f816b6705a6ad1943f29acf1 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 7 Nov 2024 16:32:22 -0500 Subject: [PATCH 04/14] docs: import core v22 docs updates (#418) * docs: v22.0 updates, 1 Corresponds to dashpay/docs-core#120 * docs(p2p): dsq updates Corresponds to dashpay/docs-core#121 * docs(rpc): v22 rpc updates, 2 Corresponds to dashpay/docs-core#123 * docs: update protocol version table Corresponds to dashpay/docs-core#124 * docs: update sidebar with core docs --- _templates/sidebar-main.html | 115 +++++- .../remote-procedure-call-quick-reference.md | 118 ++++--- .../api/remote-procedure-calls-blockchain.md | 138 ++++++-- docs/core/api/remote-procedure-calls-dash.md | 331 ++++++++++++------ docs/core/api/remote-procedure-calls-evo.md | 82 +++-- .../api/remote-procedure-calls-network.md | 56 ++- ...remote-procedure-calls-raw-transactions.md | 4 +- .../api/remote-procedure-calls-removed.md | 42 +++ .../core/api/remote-procedure-calls-wallet.md | 40 ++- docs/core/api/zmq.md | 8 +- docs/core/guide/dash-features-coinjoin.md | 71 ++-- .../reference/p2p-network-control-messages.md | 4 +- .../reference/p2p-network-data-messages.md | 16 +- .../p2p-network-privatesend-messages.md | 9 +- .../p2p-network-protocol-versions.md | 3 +- .../transactions-special-transactions.md | 22 +- 16 files changed, 758 insertions(+), 301 deletions(-) diff --git a/_templates/sidebar-main.html b/_templates/sidebar-main.html index aa902a219..56ad99526 100644 --- a/_templates/sidebar-main.html +++ b/_templates/sidebar-main.html @@ -63,20 +63,113 @@ - +

Core Docs

diff --git a/docs/core/api/remote-procedure-call-quick-reference.md b/docs/core/api/remote-procedure-call-quick-reference.md index 6596b69b0..a08e11a34 100644 --- a/docs/core/api/remote-procedure-call-quick-reference.md +++ b/docs/core/api/remote-procedure-call-quick-reference.md @@ -22,10 +22,11 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [GetBestBlockHash](../api/remote-procedure-calls-blockchain.md#getbestblockhash): returns the header hash of the most recent block on the best block chain. * [DumpTxOutset](../api/remote-procedure-calls-blockchain.md#dumptxoutset): Write the serialized UTXO set to disk. _New in Dash Core 18.1.0_ * [GetBestChainLock](../api/remote-procedure-calls-blockchain.md#getbestchainlock): returns the block hash of the best chainlock. _New in Dash Core 0.15.0_ -* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. **Updated in Dash Core 21.0.0** -* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. **Updated in Dash Core 21.0.0** +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. **_Updated in Dash Core 21.0.0_** +* [GetBlockChainInfo](../api/remote-procedure-calls-blockchain.md#getblockchaininfo): provides information about the current state of the block chain. **_Updated in Dash Core 21.0.0_** * [GetBlockCount](../api/remote-procedure-calls-blockchain.md#getblockcount): returns the number of blocks in the local best block chain. * [GetBlockFilter](../api/remote-procedure-calls-blockchain.md#getblockfilter): retrieves a [BIP157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) content filter for a particular block. _New in Dash Core 18.0.0_ +* [GetBlockFromPeer](../api/remote-procedure-calls-blockchain.md#getblockfrompeer): attempts to fetch a specific block from a given peer. **Updated in Dash Core 22.0.0** * [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. * [GetBlockHashes](../api/remote-procedure-calls-blockchain.md#getblockhashes): returns array of hashes of blocks within the timestamp range provided (requires `timestampindex` to be enabled). New in Dash Core 0.12.1 * [GetBlockHeader](../api/remote-procedure-calls-blockchain.md#getblockheader): gets a block header with a particular header hash from the local block database either as a JSON object or as a serialized block header. _Updated in Dash Core 0.16.0_ @@ -34,20 +35,20 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [GetChainTips](../api/remote-procedure-calls-blockchain.md#getchaintips): returns information about the highest-height block (tip) of each local block chain. _Updated in Dash Core 0.12.3_ * [GetChainTxStats](../api/remote-procedure-calls-blockchain.md#getchaintxstats): compute statistics about the total number and rate of transactions in the chain. _Updated in Dash Core 18.0.0_ * [GetDifficulty](../api/remote-procedure-calls-blockchain.md#getdifficulty): returns the proof-of-work difficulty as a multiple of the minimum difficulty. -* [GetMemPoolAncestors](../api/remote-procedure-calls-blockchain.md#getmempoolancestors): returns all in-mempool ancestors for a transaction in the mempool. **Updated in Dash Core 20.0.0** -* [GetMemPoolDescendants](../api/remote-procedure-calls-blockchain.md#getmempooldescendants): returns all in-mempool descendants for a transaction in the mempool. **Updated in Dash Core 20.0.0** -* [GetMemPoolEntry](../api/remote-procedure-calls-blockchain.md#getmempoolentry): returns mempool data for given transaction (must be in mempool). **Updated in Dash Core 20.0.0** -* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. **Updated in Dash Core 20.1.0** -* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. **Updated in Dash Core 20.0.0** +* [GetMemPoolAncestors](../api/remote-procedure-calls-blockchain.md#getmempoolancestors): returns all in-mempool ancestors for a transaction in the mempool. _Updated in Dash Core 20.0.0_ +* [GetMemPoolDescendants](../api/remote-procedure-calls-blockchain.md#getmempooldescendants): returns all in-mempool descendants for a transaction in the mempool. _Updated in Dash Core 20.0.0_ +* [GetMemPoolEntry](../api/remote-procedure-calls-blockchain.md#getmempoolentry): returns mempool data for given transaction (must be in mempool). _Updated in Dash Core 20.0.0_ +* [GetMemPoolInfo](../api/remote-procedure-calls-blockchain.md#getmempoolinfo): returns information about the node's current transaction memory pool. _Updated in Dash Core 20.1.0_ +* [GetRawMemPool](../api/remote-procedure-calls-blockchain.md#getrawmempool): returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. **Updated in Dash Core 22.0.0** * [GetMerkleBlocks](../api/remote-procedure-calls-blockchain.md#getmerkleblocks): returns an array of hex-encoded merkleblocks for blocks starting from which match . _New in Dash Core 0.15.0_ * [GetSpecialTxes](../api/remote-procedure-calls-blockchain.md#getspecialtxes): returns an array of special transactions found in the specified block _New in Dash Core 0.13.1_ * [GetSpentInfo](../api/remote-procedure-calls-blockchain.md#getspentinfo): returns the txid and index where an output is spent (requires `spentindex` to be enabled). New in Dash Core 0.12.1 -* [GetTxOut](../api/remote-procedure-calls-blockchain.md#gettxout): returns details about an unspent transaction output (UTXO). **Updated in Dash Core 21.0.0** +* [GetTxOut](../api/remote-procedure-calls-blockchain.md#gettxout): returns details about an unspent transaction output (UTXO). **_Updated in Dash Core 21.0.0_** * [GetTxOutProof](../api/remote-procedure-calls-blockchain.md#gettxoutproof): returns a hex-encoded proof that one or more specified transactions were included in a block. * [GetTxOutSetInfo](../api/remote-procedure-calls-blockchain.md#gettxoutsetinfo): returns statistics about the confirmed unspent transaction output (UTXO) set. Note that this call may take some time and that it only counts outputs from confirmed transactions---it does not count outputs from the memory pool. _Updated in Dash Core 18.1.0_ * [PreciousBlock](../api/remote-procedure-calls-blockchain.md#preciousblock): treats a block as if it were received before others with the same work. _New in Dash Core 0.12.3_ * [PruneBlockChain](../api/remote-procedure-calls-blockchain.md#pruneblockchain): prunes the blockchain up to a specified height or timestamp. _New in Dash Core 0.12.3_ -* [SaveMemPool](../api/remote-procedure-calls-blockchain.md#savemempool): dumps the mempool to disk. _New in Dash Core 0.16.0_ +* [SaveMemPool](../api/remote-procedure-calls-blockchain.md#savemempool): dumps the mempool to disk. **Updated in Dash Core 22.0.0** * [VerifyChain](../api/remote-procedure-calls-blockchain.md#verifychain): verifies each entry in the local block chain database. * [VerifyTxOutProof](../api/remote-procedure-calls-blockchain.md#verifytxoutproof): verifies that a proof points to one or more transactions in a block, returning the transactions the proof commits to and throwing an RPC error if the block is not in our best block chain. @@ -63,24 +64,25 @@ These RPCs are all Dash-specific and not found in Bitcoin Core ## [Dash RPCs](../api/remote-procedure-calls-dash.md) -* [GetGovernanceInfo](../api/remote-procedure-calls-dash.md#getgovernanceinfo): returns an object containing governance parameters. **Updated in Dash Core 20.0.0** -* [GetCoinJoinInfo](../api/remote-procedure-calls-dash.md#getcoinjoininfo): returns an object containing an information about CoinJoin settings and state. _New in Dash Core 0.15.0_ +* [CoinJoin](../api/remote-procedure-calls-dash.md#coinjoin): controls the CoinJoin process. _Updated in Dash Core 0.12.3_ +* [CoinJoinSalt](../api/remote-procedure-calls-dash.md#coinjoinsalt): controls the CoinJoin salt used in the process. It allows you to generate, retrieve, or set the salt. **Added in Dash Core 22.0.0** +* [GetCoinJoinInfo](../api/remote-procedure-calls-dash.md#getcoinjoininfo): returns an object containing an information about CoinJoin settings and state. **Updated in Dash Core 22.0.0** +* [GetGovernanceInfo](../api/remote-procedure-calls-dash.md#getgovernanceinfo): returns an object containing governance parameters. _Updated in Dash Core 20.0.0_ * [GetSuperblockBudget](../api/remote-procedure-calls-dash.md#getsuperblockbudget): returns the absolute maximum sum of superblock payments allowed. -* [GObject](../api/remote-procedure-calls-dash.md#gobject): provides a set of commands for managing governance objects and displaying information about them. **Updated in Dash Core 20.0.0** -* [Masternode](../api/remote-procedure-calls-dash.md#masternode): provides a set of commands for managing masternodes and displaying information about them. **_Updated in Dash Core 19.2.0_** -* [MasternodeList](../api/remote-procedure-calls-dash.md#masternodelist): returns a list of masternodes in different modes. **Updated in Dash Core 20.0.0** +* [GObject](../api/remote-procedure-calls-dash.md#gobject): provides a set of commands for managing governance objects and displaying information about them. _Updated in Dash Core 20.0.0_ +* [Masternode](../api/remote-procedure-calls-dash.md#masternode): provides a set of commands for managing masternodes and displaying information about them. **Updated in Dash Core 22.0.0** +* [MasternodeList](../api/remote-procedure-calls-dash.md#masternodelist): returns a list of masternodes in different modes. _Updated in Dash Core 20.0.0_ * [MnSync](../api/remote-procedure-calls-dash.md#mnsync): returns the sync status, updates to the next step or resets it entirely. _Updated in Dash Core 0.14.0_ -* [CoinJoin](../api/remote-procedure-calls-dash.md#coinjoin): controls the CoinJoin process. _Updated in Dash Core 0.12.3_ * [Spork](../api/remote-procedure-calls-dash.md#spork): shows information about the current state of sporks. _Updated in Dash Core 18.1.0_ * [SporkUpdate](../api/remote-procedure-calls-dash.md#sporkupdate): updates the value of the provided spork. _New in Dash Core 18.1.0_ * [VoteRaw](../api/remote-procedure-calls-dash.md#voteraw): compiles and relays a governance vote with provided external signature instead of signing vote internally ## [Evolution RPCs](../api/remote-procedure-calls-evo.md) -* [BLS](../api/remote-procedure-calls-evo.md#bls): provides a set of commands to execute BLS-related actions. **_Updated in Dash Core 19.0.0_** -* [ProTx](../api/remote-procedure-calls-evo.md#protx): provides a set of commands to execute ProTx related actions. **Updated in Dash Core 20.1.0** -* [Quorum](../api/remote-procedure-calls-evo.md#quorum): provides a set of commands for quorums (LLMQs). **Updated in Dash Core 20.1.0** -* [SubmitChainLock](../api/remote-procedure-calls-evo.md#submitchainlock): allows the submission of a ChainLock signature. **New in Dash Core 20.1.0** +* [BLS](../api/remote-procedure-calls-evo.md#bls): provides a set of commands to execute BLS-related actions. _Updated in Dash Core 19.0.0_ +* [ProTx](../api/remote-procedure-calls-evo.md#protx): provides a set of commands to execute ProTx related actions. _Updated in Dash Core 20.1.0_ +* [Quorum](../api/remote-procedure-calls-evo.md#quorum): provides a set of commands for quorums (LLMQs). **Updated in Dash Core 22.0.0** +* [SubmitChainLock](../api/remote-procedure-calls-evo.md#submitchainlock): allows the submission of a ChainLock signature. _New in Dash Core 20.1.0_ * [VerifyChainLock](../api/remote-procedure-calls-evo.md#verifychainlock): tests if a quorum signature is valid for a ChainLock. _New in Dash Core 0.17.0_ * [VerifyISLock](../api/remote-procedure-calls-evo.md#verifyislock): tests if a quorum signature is valid for an InstantSend lock. _New in Dash Core 0.17.0_ @@ -92,7 +94,7 @@ These RPCs are all Dash-specific and not found in Bitcoin Core ## [Mining RPCs](../api/remote-procedure-calls-mining.md) -* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. **Updated in Dash Core 20.0.0** +* [GetBlockTemplate](../api/remote-procedure-calls-mining.md#getblocktemplate): gets a block template or proposal for use with mining software. _Updated in Dash Core 20.0.0_ * [GetMiningInfo](../api/remote-procedure-calls-mining.md#getmininginfo): returns various mining-related information. _Updated in Dash Core 18.0.0_ * [GetNetworkHashPS](../api/remote-procedure-calls-mining.md#getnetworkhashps): returns the estimated network hashes per second based on the last n blocks. * [PrioritiseTransaction](../api/remote-procedure-calls-mining.md#prioritisetransaction): adds virtual priority or fee to a transaction, allowing it to be accepted into blocks mined by this node (or miners which use this node) with a lower priority or fee. (It can also remove virtual priority or fee, requiring the transaction have a higher priority or fee to be accepted into a locally-mined block.) _Updated in Dash Core 0.14.0_ @@ -101,18 +103,18 @@ These RPCs are all Dash-specific and not found in Bitcoin Core ## [Network RPCs](../api/remote-procedure-calls-network.md) -* [AddNode](../api/remote-procedure-calls-network.md#addnode): attempts to add or remove a node from the addnode list, or to try a connection to a node once. -* [AddPeerAddress](../api/remote-procedure-calls-network.md#addpeeraddress): adds the address of a potential peer to the address manager. **New in Dash Core 20.0.0** +* [AddNode](../api/remote-procedure-calls-network.md#addnode): attempts to add or remove a node from the addnode list, or to try a connection to a node once. **Updated in Dash Core 22.0.0** +* [AddPeerAddress](../api/remote-procedure-calls-network.md#addpeeraddress): adds the address of a potential peer to the address manager. **Updated in Dash Core 22.0.0** * [ClearBanned](../api/remote-procedure-calls-network.md#clearbanned): clears list of banned nodes. -* [ClearDiscouraged](../api/remote-procedure-calls-network.md#cleardiscouraged): clears all discouraged nodes. **_New in Dash Core 19.0.0_** +* [ClearDiscouraged](../api/remote-procedure-calls-network.md#cleardiscouraged): clears all discouraged nodes. _New in Dash Core 19.0.0_ * [DisconnectNode](../api/remote-procedure-calls-network.md#disconnectnode): immediately disconnects from a specified node. _Updated in Dash Core 0.15.0_ -* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. **Updated in Dash Core 21.0.0** +* [GetAddedNodeInfo](../api/remote-procedure-calls-network.md#getaddednodeinfo): returns information about the given added node, or all added nodes (except onetry nodes). Only nodes which have been manually added using the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) will have their information displayed. **_Updated in Dash Core 21.0.0_** * [GetConnectionCount](../api/remote-procedure-calls-network.md#getconnectioncount): returns the number of connections to other nodes. * [GetNetTotals](../api/remote-procedure-calls-network.md#getnettotals): returns information about network traffic, including bytes in, bytes out, and the current time. -* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. **Updated in Dash Core 21.0.0** -* [GetNodeAddresses](../api/remote-procedure-calls-network.md#getnodeaddresses): returns the known addresses which can potentially be used to find new nodes in the network. **Updated in Dash Core 21.0.0** -* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. **Updated in Dash Core 21.0.0** -* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all banned IPs/Subnets. **Updated in Dash Core 21.0.0** +* [GetNetworkInfo](../api/remote-procedure-calls-network.md#getnetworkinfo): returns information about the node's connection to the network. **_Updated in Dash Core 21.0.0_** +* [GetNodeAddresses](../api/remote-procedure-calls-network.md#getnodeaddresses): returns the known addresses which can potentially be used to find new nodes in the network. **_Updated in Dash Core 21.0.0_** +* [GetPeerInfo](../api/remote-procedure-calls-network.md#getpeerinfo): returns data about each connected network node. **Updated in Dash Core 22.0.0** +* [ListBanned](../api/remote-procedure-calls-network.md#listbanned): lists all banned IPs/Subnets. **_Updated in Dash Core 21.0.0_** * [Ping](../api/remote-procedure-calls-network.md#ping): sends a P2P ping message to all connected nodes to measure ping time. Results are provided by the [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo) pingtime and pingwait fields as decimal seconds. The P2P [`ping` message](../reference/p2p-network-control-messages.md#ping) is handled in a queue with all other commands, so it measures processing backlog, not just network ping. * [SetBan](../api/remote-procedure-calls-network.md#setban): attempts add or remove a IP/Subnet from the banned list. * [SetNetworkActive](../api/remote-procedure-calls-network.md#setnetworkactive): disables/enables all P2P network activity. @@ -124,31 +126,31 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [CombineRawTransaction](../api/remote-procedure-calls-raw-transactions.md#combinerawtransaction): combine multiple partially signed transactions into one transaction. _New in Dash Core 0.15.0_ * [ConvertToPSBT](../api/remote-procedure-calls-raw-transactions.md#converttopsbt): converts a network serialized transaction to a PSBT. _New in Dash Core 18.0.0_ * [CreatePSBT](../api/remote-procedure-calls-raw-transactions.md#createpsbt): creates a transaction in the Partially Signed Transaction (PST) format. _New in Dash Core 18.0.0_ -* [GetAssetUnlockStatuses](../api/remote-procedure-calls-raw-transactions.md#getassetunlockstatuses): returns the status of the provided Asset Unlock indexes at the tip of the chain or at a particular block height if specified. **New in Dash Core 20.1.0** +* [GetAssetUnlockStatuses](../api/remote-procedure-calls-raw-transactions.md#getassetunlockstatuses): returns the status of the provided Asset Unlock indexes at the tip of the chain or at a particular block height if specified. _New in Dash Core 20.1.0_ * [CreateRawTransaction](../api/remote-procedure-calls-raw-transactions.md#createrawtransaction): creates an unsigned serialized transaction that spends a previous output to a new output with a P2PKH or P2SH address. The transaction is not stored in the wallet or transmitted to the network. _Updated in Dash Core 0.17.0_ * [DecodePSBT](../api/remote-procedure-calls-raw-transactions.md#decodepsbt): returns a JSON object representing the serialized, base64-encoded partially signed Dash transaction. _New in Dash Core 18.0.0_ -* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. **Updated in Dash Core 21.0.0** -* [DecodeScript](../api/remote-procedure-calls-raw-transactions.md#decodescript): decodes a hex-encoded P2SH redeem script. **Updated in Dash Core 21.0.0** +* [DecodeRawTransaction](../api/remote-procedure-calls-raw-transactions.md#decoderawtransaction): decodes a serialized transaction hex string into a JSON object describing the transaction. **_Updated in Dash Core 21.0.0_** +* [DecodeScript](../api/remote-procedure-calls-raw-transactions.md#decodescript): decodes a hex-encoded P2SH redeem script. **_Updated in Dash Core 21.0.0_** * [FinalizePSBT](../api/remote-procedure-calls-raw-transactions.md#finalizepsbt): finalizes the inputs of a PSBT. The PSBT produces a network serialized transaction if the transaction is fully signed. _New in Dash Core 18.0.0_ -* [FundRawTransaction](../api/remote-procedure-calls-raw-transactions.md#fundrawtransaction): adds inputs to a transaction until it has enough in value to meet its out value. **Updated in Dash Core 21.0.0** -* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. **Updated in Dash Core 21.0.0** -* [GetRawTransactionMulti](../api/remote-procedure-calls-raw-transactions.md#getrawtransactionmulti): gets hex-encoded serialized transactions or a JSON object describing the multiple transactions. **Added in Dash Core 20.1.0** -* [GetTxChainlocks](../api/remote-procedure-calls-raw-transactions.md#gettxchainlocks): returns the block height each transaction was mined at and whether it is ChainLocked or not. **Updated in Dash Core 20.1.0** +* [FundRawTransaction](../api/remote-procedure-calls-raw-transactions.md#fundrawtransaction): adds inputs to a transaction until it has enough in value to meet its out value. **_Updated in Dash Core 21.0.0_** +* [GetRawTransaction](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction): gets a hex-encoded serialized transaction or a JSON object describing the transaction. By default, Dash Core only stores complete transaction data for UTXOs and your own transactions, so the RPC may fail on historic transactions unless you use the non-default `txindex=1` in your Dash Core startup settings. **_Updated in Dash Core 21.0.0_** +* [GetRawTransactionMulti](../api/remote-procedure-calls-raw-transactions.md#getrawtransactionmulti): gets hex-encoded serialized transactions or a JSON object describing the multiple transactions. _New in Dash Core 20.1.0_ +* [GetTxChainlocks](../api/remote-procedure-calls-raw-transactions.md#gettxchainlocks): returns the block height each transaction was mined at and whether it is ChainLocked or not. _Updated in Dash Core 20.1.0_ * [JoinPSBTs](../api/remote-procedure-calls-raw-transactions.md#joinpsbts): joins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs. * [SendRawTransaction](../api/remote-procedure-calls-raw-transactions.md#sendrawtransaction): validates a transaction and broadcasts it to the peer-to-peer network. _Updated in Dash Core 0.15.0_ * [SignRawTransactionWithKey](../api/remote-procedure-calls-raw-transactions.md#signrawtransactionwithkey): signs a transaction in the serialized transaction format using private keys provided in the call. _New in Dash Core 0.17.0_ -* [TestMempoolAccept](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept): returns the results of mempool acceptance tests indicating if raw transaction (serialized, hex-encoded) would be accepted by mempool. **Updated in Dash Core 20.1.0** +* [TestMempoolAccept](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept): returns the results of mempool acceptance tests indicating if raw transaction (serialized, hex-encoded) would be accepted by mempool. _Updated in Dash Core 20.1.0_ * [UTXOUpdatePSBT](../api/remote-procedure-calls-raw-transactions.md#testmempoolaccept): updates a PSBT with data from output descriptors, UTXOs retrieved from the UTXO set or the mempool. _Updated in Dash Core 18.1.0_ ## [Utility RPCs](../api/remote-procedure-calls-util.md) -* [CreateMultiSig](../api/remote-procedure-calls-util.md#createmultisig): creates a P2SH multi-signature address. **Updated in Dash Core 20.0.0** +* [CreateMultiSig](../api/remote-procedure-calls-util.md#createmultisig): creates a P2SH multi-signature address. _Updated in Dash Core 20.0.0_ * [DeriveAddresses](../api/remote-procedure-calls-util.md#deriveaddresses): derives one or more addresses corresponding to an output descriptor. _Updated in Dash Core 18.1.0_ * [EstimateSmartFee](../api/remote-procedure-calls-util.md#estimatesmartfee): estimates the transaction fee per kilobyte that needs to be paid for a transaction to begin confirmation within a certain number of blocks and returns the number of blocks for which the estimate is valid. _Updated in Dash Core 0.15.0_ * [GetDescriptorInfo](../api/remote-procedure-calls-util.md#getdescriptorinfo): analyses a descriptor. _New in Dash Core 18.0.0_ -* [GetIndexInfo](../api/remote-procedure-calls-util.md#getindexinfo): returns the status of one or all available indices currently running in the node. **New in Dash Core 20.0.0** +* [GetIndexInfo](../api/remote-procedure-calls-util.md#getindexinfo): returns the status of one or all available indices currently running in the node. _New in Dash Core 20.0.0_ * [SignMessageWithPrivKey](../api/remote-procedure-calls-util.md#signmessagewithprivkey): signs a message with a given private key. _New in Dash Core 0.12.3_ -* [ValidateAddress](../api/remote-procedure-calls-util.md#validateaddress): returns information about the given Dash address. **Updated in Dash Core 20.1.0** +* [ValidateAddress](../api/remote-procedure-calls-util.md#validateaddress): returns information about the given Dash address. _Updated in Dash Core 20.1.0_ * [VerifyMessage](../api/remote-procedure-calls-util.md#verifymessage): verifies a signed message. ## [Wallet RPCs](../api/remote-procedure-calls-wallet.md) @@ -157,14 +159,14 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [AbandonTransaction](../api/remote-procedure-calls-wallet.md#abandontransaction): marks an in-wallet transaction and all its in-wallet descendants as abandoned. This allows their inputs to be respent. * [AbortRescan](../api/remote-procedure-calls-wallet.md#abortrescan): stops current wallet rescan. _New in Dash Core 0.15.0_ -* [AddMultiSigAddress](../api/remote-procedure-calls-wallet.md#addmultisigaddress): adds a P2SH multisig address to the wallet. **Updated in Dash Core 20.0.0** +* [AddMultiSigAddress](../api/remote-procedure-calls-wallet.md#addmultisigaddress): adds a P2SH multisig address to the wallet. _Updated in Dash Core 20.0.0_ * [BackupWallet](../api/remote-procedure-calls-wallet.md#backupwallet): safely copies `wallet.dat` to the specified file, which can be a directory or a path with filename. -* [CreateWallet](../api/remote-procedure-calls-wallet.md#createwallet): creates and loads a new wallet. **Updated in Dash Core 21.0.0** +* [CreateWallet](../api/remote-procedure-calls-wallet.md#createwallet): creates and loads a new wallet. **_Updated in Dash Core 21.0.0_** * [DumpHDInfo](../api/remote-procedure-calls-wallet.md#dumphdinfo): returns an object containing sensitive private info about this HD wallet New in Dash Core 0.12.2 * [DumpPrivKey](../api/remote-procedure-calls-wallet.md#dumpprivkey): returns the wallet-import-format (WIP) private key corresponding to an address. (But does not remove it from the wallet.) * [DumpWallet](../api/remote-procedure-calls-wallet.md#dumpwallet): creates or overwrites a file with all wallet keys in a human-readable format. _Updated in Dash Core 0.17.0_ * [EncryptWallet](../api/remote-procedure-calls-wallet.md#encryptwallet): encrypts the wallet with a passphrase. This is only to enable encryption for the first time. After encryption is enabled, you will need to enter the passphrase to use private keys. -* [GetAddressInfo](../api/remote-procedure-calls-wallet.md#getaddressinfo): returns information about the given Dash address. **Updated in Dash Core 21.0.0** +* [GetAddressInfo](../api/remote-procedure-calls-wallet.md#getaddressinfo): returns information about the given Dash address. **_Updated in Dash Core 21.0.0_** * [GetAddressesByLabel](../api/remote-procedure-calls-wallet.md#getaddressesbylabel): returns a list of every address assigned to a particular label. _New in Dash Core 0.17.0_ * [GetBalance](../api/remote-procedure-calls-wallet.md#getbalance): gets the balance in decimal dash across all accounts or for a particular account. _Updated in Dash Core 18.1.0_ * [GetBalances](../api/remote-procedure-calls-wallet.md#getbalances): returns an object with all balances denominated in DASH. _Updated in Dash Core 18.2.0_ @@ -172,12 +174,12 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [GetRawChangeAddress](../api/remote-procedure-calls-wallet.md#getrawchangeaddress): returns a new Dash address for receiving change. This is for use with raw transactions, not normal use. * [GetReceivedByAddress](../api/remote-procedure-calls-wallet.md#getreceivedbyaddress): returns the total amount received by the specified address in transactions with the specified number of confirmations. It does not count coinbase transactions. _Updated in Dash Core 0.13.0_ * [GetReceivedByLabel](../api/remote-procedure-calls-wallet.md#getreceivedbylabel): returns the list of addresses assigned the specified label. _New in Dash Core 0.17.0_ -* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. **Updated in Dash Core 20.0.0** +* [GetTransaction](../api/remote-procedure-calls-wallet.md#gettransaction): gets detailed information about an in-wallet transaction. _Updated in Dash Core 20.0.0_ * [GetUnconfirmedBalance](../api/remote-procedure-calls-wallet.md#getunconfirmedbalance): returns the wallet's total unconfirmed balance. -* [GetWalletInfo](../api/remote-procedure-calls-wallet.md#getwalletinfo): provides information about the wallet. **Updated in Dash Core 20.0.0** +* [GetWalletInfo](../api/remote-procedure-calls-wallet.md#getwalletinfo): provides information about the wallet. _Updated in Dash Core 20.0.0_ * [ImportAddress](../api/remote-procedure-calls-wallet.md#importaddress): adds an address or pubkey script to the wallet without the associated private key, allowing you to watch for transactions affecting that address or pubkey script without being able to spend any of its outputs. * [ImportElectrumWallet](../api/remote-procedure-calls-wallet.md#importelectrumwallet): imports keys from an Electrum wallet export file (.csv or .json) New in Dash Core 0.12.1 -* [ImportDescriptors](../api/remote-procedure-calls-wallet.md#importdescriptors): imports multiple descriptors into the wallet. **New in Dash Core 21.0.0** +* [ImportDescriptors](../api/remote-procedure-calls-wallet.md#importdescriptors): imports multiple descriptors into the wallet. **_New in Dash Core 21.0.0_** * [ImportMulti](../api/remote-procedure-calls-wallet.md#importmulti): imports addresses or scripts (with private keys, public keys, or P2SH redeem scripts) and optionally performs the minimum necessary rescan for all imports. _New in Dash Core 0.12.3_ * [ImportPrivKey](../api/remote-procedure-calls-wallet.md#importprivkey): adds a private key to your wallet. The key should be formatted in the wallet import format created by the [`dumpprivkey` RPC](../api/remote-procedure-calls-wallet.md#dumpprivkey). * [ImportPrunedFunds](../api/remote-procedure-calls-wallet.md#importprunedfunds): imports funds without the need of a rescan. Meant for use with pruned wallets. _New in Dash Core 0.12.3_ @@ -186,13 +188,13 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [KeyPoolRefill](../api/remote-procedure-calls-wallet.md#keypoolrefill): fills the cache of unused pre-generated keys (the keypool). * [ListAddressBalances](../api/remote-procedure-calls-wallet.md#listaddressbalances): lists addresses of this wallet and their balances _New in Dash Core 0.12.3_ * [ListAddressGroupings](../api/remote-procedure-calls-wallet.md#listaddressgroupings): lists groups of addresses that may have had their common ownership made public by common use as inputs in the same transaction or from being used as change from a previous transaction. _Updated in Dash Core 0.17.0_ -* [ListDescriptors](../api/remote-procedure-calls-wallet.md#listdescriptors): lists descriptors imported into a descriptor-enabled wallet. **New in Dash Core 21.0.0** +* [ListDescriptors](../api/remote-procedure-calls-wallet.md#listdescriptors): lists descriptors imported into a descriptor-enabled wallet. **_New in Dash Core 21.0.0_** * [ListLabels](../api/remote-procedure-calls-wallet.md#listlabels): returns the list of all labels, or labels that are assigned to addresses with a specific purpose. _New in Dash Core 0.17.0_ * [ListLockUnspent](../api/remote-procedure-calls-wallet.md#listlockunspent): returns a list of temporarily unspendable (locked) outputs. * [ListReceivedByAddress](../api/remote-procedure-calls-wallet.md#listreceivedbyaddress): lists the total number of dash received by each address. _Updated in Dash Core 0.17.0_ * [ListReceivedByLabel](../api/remote-procedure-calls-wallet.md#listreceivedbylabel): lists the total number of dash received by each label. _New in Dash Core 0.17.0_ -* [ListSinceBlock](../api/remote-procedure-calls-wallet.md#listsinceblock): gets all transactions affecting the wallet which have occurred since a particular block, plus the header hash of a block at a particular depth. **Updated in Dash Core 20.0.0** -* [ListTransactions](../api/remote-procedure-calls-wallet.md#listtransactions): returns the most recent transactions that affect the wallet. **Updated in Dash Core 20.0.0** +* [ListSinceBlock](../api/remote-procedure-calls-wallet.md#listsinceblock): gets all transactions affecting the wallet which have occurred since a particular block, plus the header hash of a block at a particular depth. _Updated in Dash Core 20.0.0_ +* [ListTransactions](../api/remote-procedure-calls-wallet.md#listtransactions): returns the most recent transactions that affect the wallet. _Updated in Dash Core 20.0.0_ * [ListUnspent](../api/remote-procedure-calls-wallet.md#listunspent): returns an array of unspent transaction outputs belonging to this wallet. _Updated in Dash Core 18.1.0_ * [ListWalletDir](../api/remote-procedure-calls-wallet.md#listwalletdir): returns a list of wallets in the wallet directory. _New in Dash Core 18.0.0_ * [ListWallets](../api/remote-procedure-calls-wallet.md#listwallets): returns a list of currently loaded wallets. _New in Dash Core 0.15.0_ @@ -201,10 +203,10 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [RemovePrunedFunds](../api/remote-procedure-calls-wallet.md#removeprunedfunds): deletes the specified transaction from the wallet. Meant for use with pruned wallets and as a companion to importprunedfunds. _New in Dash Core 0.12.3_ * [RescanBlockChain](../api/remote-procedure-calls-wallet.md#rescanblockchain): rescans the local blockchain for wallet related transactions. _New in Dash Core 0.16.0_ * [ScanTxOutset](../api/remote-procedure-calls-wallet.md#scantxoutset): scans the unspent transaction output set for entries that match certain output descriptors. _New in Dash Core 18.0.0_ -* [Send](../api/remote-procedure-calls-wallet.md#send): sends a transaction with specified outputs. **New in Dash Core 21.0.0** -* [SendMany](../api/remote-procedure-calls-wallet.md#sendmany): creates and broadcasts a transaction which sends outputs to multiple addresses. **Updated in Dash Core 21.0.0** -* [SendToAddress](../api/remote-procedure-calls-wallet.md#sendtoaddress): spends an amount to a given address. **Updated in Dash Core 21.0.0** -* [SetHDSeed](../api/remote-procedure-calls-wallet.md#sethdseed): sets or generates a new HD wallet seed **New in Dash Core 21.0.0** +* [Send](../api/remote-procedure-calls-wallet.md#send): sends a transaction with specified outputs. **Updated in Dash Core 22.0.0** +* [SendMany](../api/remote-procedure-calls-wallet.md#sendmany): creates and broadcasts a transaction which sends outputs to multiple addresses. **Updated in Dash Core 22.0.0** +* [SendToAddress](../api/remote-procedure-calls-wallet.md#sendtoaddress): spends an amount to a given address. **Updated in Dash Core 22.0.0** +* [SetHDSeed](../api/remote-procedure-calls-wallet.md#sethdseed): sets or generates a new HD wallet seed **_New in Dash Core 21.0.0_** * [SetLabel](../api/remote-procedure-calls-wallet.md#setlabel): sets the label associated with the given address. * [SetCoinJoinAmount](../api/remote-procedure-calls-wallet.md#setcoinjoinamount): sets the amount of DASH to be processed _New in Dash Core 0.13.0_ * [SetCoinJoinRounds](../api/remote-procedure-calls-wallet.md#setcoinjoinrounds): sets the number of rounds to use _New in Dash Core 0.13.0_ @@ -212,15 +214,15 @@ These RPCs are all Dash-specific and not found in Bitcoin Core * [SetWalletFlag](../api/remote-procedure-calls-wallet.md#setwalletflag): changes the state of the given wallet flag for a wallet. * [SignMessage](../api/remote-procedure-calls-wallet.md#signmessage): signs a message with the private key of an address. * [SignRawTransactionWithWallet](../api/remote-procedure-calls-wallet.md#signrawtransactionwithwallet): signs a transaction in the serialized transaction format using private keys found in the wallet. _New in Dash Core 0.17.0_ -* [UnloadWallet](../api/remote-procedure-calls-wallet.md#unloadwallet): unloads the wallet referenced by the request endpoint otherwise unloads the wallet specified in the argument. **Updated in Dash Core 20.0.0** +* [UnloadWallet](../api/remote-procedure-calls-wallet.md#unloadwallet): unloads the wallet referenced by the request endpoint otherwise unloads the wallet specified in the argument. _Updated in Dash Core 20.0.0_ * [UpgradeToHD](../api/remote-procedure-calls-wallet.md#upgradetohd): upgrades non-HD wallets to HD. _New in Dash Core 0.17.0_ -* [UpgradeWallet](../api/remote-procedure-calls-wallet.md#upgradewallet): upgrades wallet version. **Updated in Dash Core 21.0.0** -* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. Inputs will be added if supplied inputs are not enough. **Updated in Dash Core 21.0.0** +* [UpgradeWallet](../api/remote-procedure-calls-wallet.md#upgradewallet): upgrades wallet version. **_Updated in Dash Core 21.0.0_** +* [WalletCreateFundedPSBT](../api/remote-procedure-calls-wallet.md#walletcreatefundedpsbt): creates and funds a transaction in the Partially Signed Transaction (PST) format. Inputs will be added if supplied inputs are not enough. **_Updated in Dash Core 21.0.0_** * [WalletLock](../api/remote-procedure-calls-wallet.md#walletlock): removes the wallet encryption key from memory, locking the wallet. After calling this method, you will need to call `walletpassphrase` again before being able to call any methods which require the wallet to be unlocked. * [WalletPassphrase](../api/remote-procedure-calls-wallet.md#walletpassphrase): stores the wallet decryption key in memory for the indicated number of seconds. Issuing the `walletpassphrase` command while the wallet is already unlocked will set a new unlock time that overrides the old one. * [WalletPassphraseChange](../api/remote-procedure-calls-wallet.md#walletpassphrasechange): changes the wallet passphrase from 'old passphrase' to 'new passphrase'. * [WalletProcessPSBT](../api/remote-procedure-calls-wallet.md#walletprocesspsbt): updates a PSBT with input information from a wallet and then allows the signing of inputs. _Updated in Dash Core 18.2.0_ -* [WipeWalletTxes](../api/remote-procedure-calls-wallet.md#wipewallettxes): wipes wallet transactions. **_New in Dash Core 19.3.0_** +* [WipeWalletTxes](../api/remote-procedure-calls-wallet.md#wipewallettxes): wipes wallet transactions. _New in Dash Core 19.3.0_ ## [Wallet RPCs (Deprecated)](../api/remote-procedure-calls-wallet-deprecated.md) @@ -233,3 +235,7 @@ These RPCs are all Dash-specific and not found in Bitcoin Core ## [Removed RPCs](../api/remote-procedure-calls-removed.md) * [GObject vote-conf](../api/remote-procedure-calls-removed.md#gobject-vote-conf): **was removed in Dash Core 20.0.0** +* [Protx Register HPMN](../api/remote-procedure-calls-evo.md#protx-register-evo): **was removed in Dash Core 22.0.0** +* [Protx Register Fund HPMN](../api/remote-procedure-calls-evo.md#protx-register-fund-evo): **was removed in Dash Core 22.0.0** +* [Protx Register Prepare HPMN](../api/remote-procedure-calls-evo.md#protx-register-prepare-evo): **was removed in Dash Core 22.0.0** +* [Protx Update Service HPMN](../api/remote-procedure-calls-evo.md#protx-update-service-evo): **was removed in Dash Core 22.0.0** diff --git a/docs/core/api/remote-procedure-calls-blockchain.md b/docs/core/api/remote-procedure-calls-blockchain.md index b98ec3a3d..460960e5b 100644 --- a/docs/core/api/remote-procedure-calls-blockchain.md +++ b/docs/core/api/remote-procedure-calls-blockchain.md @@ -85,7 +85,7 @@ Name | Type | Presence | Description `result` | object/null | Required
(exactly 1) | An object containing the requested block, or JSON `null` if an error occurred →
`blockhash` | string (hex) | Required
(exactly 1) | The hash of the block encoded as hex in RPC byte order →
`height` | number (int) | Required
(exactly 1) | The height of this block on its block chain -→
`signature` | string (hex) | Required
(exactly 1) | _Added in Dash Core 0.17.0_

The BLS signature of the ChainLock +→
`signature` | string (hex) | Required
(exactly 1) | The BLS signature of the ChainLock →
`known_block` | boolean | Required
(exactly 1) | True if the block is known by this node *Example from Dash Core 0.17.0* @@ -183,7 +183,7 @@ Name | Type | Presence | Description →
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass →
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 →
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex -→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→
`nTx` | number (int) | Required
(exactly 1) | The number of transactions in the block →
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block →
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order →
`chainlock` | bool | Required
(exactly 1) | *Added in Dash Core 0.14.0*

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) @@ -604,6 +604,52 @@ Result: * [GetBlockHash](../api/remote-procedure-calls-blockchain.md#getblockhash): returns the header hash of a block at the given height in the local best block chain. * [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. +## GetBlockFromPeer + +The `getblockfrompeer` RPC attempts to fetch a specific block from a given peer. The node must +already have the header for the block (e.g., by using the [`submitheader` +RPC](./remote-procedure-calls-mining.md#submitheader)). + +*Parameter #1---the block hash to fetch* + +Name | Type | Presence | Description +-----------|----------|-------------------------|------------ +blockhash | string | Required
(exactly 1) | The block hash to try to fetch + +*Parameter #2---the peer to fetch from* + +Name | Type | Presence | Description +-----------|--------|-------------------------|------------ +peer_id | number | Required
(exactly 1) | The ID of the peer to fetch the block from. You can get peer IDs by using the [`getpeerinfo` RPC](./remote-procedure-calls-network.md#getpeerinfo). + +*Result---execution result* + +Name | Type | Presence | Description +------------|---------|-------------------------|------------ +`warnings` | string | Optional
(0 or 1) | Any warnings or issues encountered during the block fetch attempt. If there are no warnings, this field will not appear. + +Returns `{}` if a block request was successfully scheduled. + +*Example from Dash Core 22.0.0* + +Attempt to fetch block `00000021e19ebb597d74627a4df829768c3f26d3185d943a53773e4a681391bd` from peer ID `0`: + +```bash +dash-cli -testnet getblockfrompeer "00000021e19ebb597d74627a4df829768c3f26d3185d943a53773e4a681391bd" 0 +``` + +Result: + +```json +{ + "warnings": "Block already downloaded" +} +``` + +*See also* + +* [GetBlock](../api/remote-procedure-calls-blockchain.md#getblock): gets a block with a particular header hash from the local block database either as a JSON object or as a serialized block. + ## GetBlockHash The [`getblockhash` RPC](../api/remote-procedure-calls-blockchain.md#getblockhash) returns the header hash of a block at the given height in the local best block chain. @@ -779,7 +825,7 @@ Name | Type | Presence | Description →
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass →
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 →
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex -→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→
`nTx` | number (int) | Required
(exactly 1) | The number of transactions in the block →
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block →
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order @@ -897,7 +943,7 @@ Name | Type | Presence | Description → →
`bits` | string (hex) | Required
(exactly 1) | The value of the *nBits* field in the block header, indicating the target threshold this block's header had to pass → →
`difficulty` | number (real) | Required
(exactly 1) | The estimated amount of work done to find this block relative to the estimated amount of work done to find block 0 →
`chainwork` | string (hex) | Required
(exactly 1) | The estimated number of block header hashes miners had to check from the genesis block to this block, encoded as big-endian hex -→
`nTx` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The number of transactions in the block +→
`nTx` | number (int) | Required
(exactly 1) | The number of transactions in the block → →
`previousblockhash` | string (hex) | Optional
(0 or 1) | The hash of the header of the previous block, encoded as hex in RPC byte order. Not returned for genesis block → →
`nextblockhash` | string (hex) | Optional
(0 or 1) | The hash of the next block on the best block chain, if known, encoded as hex in RPC byte order @@ -1234,11 +1280,11 @@ Name | Type | Presence | Description → →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) → →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) → →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) -→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information -→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH -→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH -→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH -→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`fees` | object | Optional
(0 or 1) | Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool descendants (including this one) in DASH → →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty → → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order → →
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction @@ -1352,11 +1398,11 @@ Name | Type | Presence | Description → →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) → →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) → →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) -→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information -→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH -→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH -→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH -→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`fees` | object | Optional
(0 or 1) | Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool descendants (including this one) in DASH → →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty → → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order → →
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction @@ -1456,11 +1502,11 @@ Name | Type | Presence | Description →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) -→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information -→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH -→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH -→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH -→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`fees` | object | Optional
(0 or 1) | Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool descendants (including this one) in DASH →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order →
`spentby` | array | Required
(exactly 1) | **Added in Dash Core 20.0.0**
An array of unconfirmed transactions spending outputs from this transaction @@ -1571,18 +1617,25 @@ Result: The [`getrawmempool` RPC](../api/remote-procedure-calls-blockchain.md#getrawmempool) returns all transaction identifiers (TXIDs) in the memory pool as a JSON array, or detailed information about each transaction in the memory pool as a JSON object. -*Parameter---desired output format* +*Parameter #1---verbose* Name | Type | Presence | Description --- | --- | --- | --- Format | bool | Optional
(0 or 1) | Set to `true` to get verbose output describing each transaction in the memory pool; set to `false` (the default) to only get an array of TXIDs for transactions in the memory pool +*Parameter #2---mempool sequence* + +Name | Type | Presence | Description +--- | --- | --- | --- +Format | bool | Optional
(0 or 1) | If verbose=false, returns a json object with transaction list and mempool sequence number attached. + *Result (format `false`)---an array of TXIDs* Name | Type | Presence | Description --- | --- | --- | --- `result` | array | Required
(exactly 1) | An array of TXIDs belonging to transactions in the memory pool. The array may be empty if there are no transactions in the memory pool →
TXID | string | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order +→
mempool_sequence | number (int) | Optional
(0 or 1) | *Added in Dash Core 22.0.0*
The mempool sequence value *Result (format: `true`)---a JSON object describing each transaction* @@ -1591,24 +1644,24 @@ Name | Type | Presence | Description `result` | object | Required
(exactly 1) | A object containing transactions currently in the memory pool. May be empty →
TXID | string : object | Optional
(0 or more) | The TXID of a transaction in the memory pool, encoded as hex in RPC byte order → →
`size` | number (int) | Required
(exactly 1) | The size of the serialized transaction in bytes -→ →
`fee` | amount (Dash) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee paid by the transaction in decimal Dash -→ →
`modifiedfee` | amount (Dash) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The transaction fee with fee deltas used for mining priority in decimal Dash +→ →
`fee` | amount (Dash) | Required
(exactly 1) | *Deprecated in Dash Core 0.17.0*
The transaction fee paid by the transaction in decimal Dash +→ →
`modifiedfee` | amount (Dash) | Required
(exactly 1) | *Deprecated in Dash Core 0.17.0*
The transaction fee with fee deltas used for mining priority in decimal Dash → →
`time` | number (int) | Required
(exactly 1) | The time the transaction entered the memory pool, Unix epoch time format → →
`height` | number (int) | Required
(exactly 1) | The block height when the transaction entered the memory pool -→ →
`descendantcount` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The number of in-mempool descendant transactions (including this one) -→ →
`descendantsize` | number (int) | Required
(exactly 1) | *Added in Bitcoin Core 0.12.0*

The size of in-mempool descendants (including this one) -→ →
`descendantfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) -→ →
`ancestorcount` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0*

The number of in-mempool ancestor transactions (including this one) -→ →
`ancestorsize` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.12.3 / Bitcoin Core 0.13.0*

The size of in-mempool ancestors (including this one) -→ →
`ancestorfees` | number (int) | Required
(exactly 1) | **Deprecated in Dash Core 0.17.0**

The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) -→ →
`fees` | object | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Object containing fee information -→→→
`base` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee in DASH -→→→
`modified` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Transaction fee with fee deltas used for mining priority in DASH -→→→
`ancestor` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool ancestors (including this one) in DASH -→→→
`descendent` | number | Optional
(0 or 1) | _Added in Dash Core 0.17.0_
Modified fees (see above) of in-mempool descendants (including this one) in DASH +→ →
`descendantcount` | number (int) | Required
(exactly 1) | The number of in-mempool descendant transactions (including this one) +→ →
`descendantsize` | number (int) | Required
(exactly 1) | The size of in-mempool descendants (including this one) +→ →
`descendantfees` | number (int) | Required
(exactly 1) | *Deprecated in Dash Core 0.17.0*
The modified fees (see `modifiedfee` above) of in-mempool descendants (including this one) +→ →
`ancestorcount` | number (int) | Required
(exactly 1) | The number of in-mempool ancestor transactions (including this one) +→ →
`ancestorsize` | number (int) | Required
(exactly 1) | The size of in-mempool ancestors (including this one) +→ →
`ancestorfees` | number (int) | Required
(exactly 1) | *Deprecated in Dash Core 0.17.0*
The modified fees (see `modifiedfee` above) of in-mempool ancestors (including this one) +→ →
`fees` | object | Optional
(0 or 1) | Object containing fee information +→→→
`base` | number | Optional
(0 or 1) | Transaction fee in DASH +→→→
`modified` | number | Optional
(0 or 1) | Transaction fee with fee deltas used for mining priority in DASH +→→→
`ancestor` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool ancestors (including this one) in DASH +→→→
`descendent` | number | Optional
(0 or 1) | Modified fees (see above) of in-mempool descendants (including this one) in DASH → →
`depends` | array | Required
(exactly 1) | An array holding TXIDs of unconfirmed transactions this transaction depends upon (parent transactions). Those transactions must be part of a block before this transaction can be added to a block, although all transactions may be included in the same block. The array may be empty → → →
Depends TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions this transaction depends upon, encoded as hex in RPC byte order -→ →
`spentby` | array | Required
(exactly 1) | _Added in Dash Core 0.17.0_
An array of unconfirmed transactions spending outputs from this transaction +→ →
`spentby` | array | Required
(exactly 1) | An array of unconfirmed transactions spending outputs from this transaction → → →
TXID | string | Optional (0 or more) | The TXIDs of any unconfirmed transactions spending from this transaction → →
`unbroadcast` | bool | Required
(exactly 1) | **Added in Dash Core 20.0.0**
True if this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers) → →
`instantlock` | bool | Required
(exactly 1) | *Added in Dash Core 0.12.3*

Set to `true` for locked [InstantSend](../resources/glossary.md#instantsend) transactions (masternode quorum has locked the transaction inputs via `isdlock` message). Set to `false` if the masternodes have not approved the [InstantSend](../resources/glossary.md#instantsend) transaction @@ -2206,13 +2259,26 @@ The [`savemempool` RPC](../api/remote-procedure-calls-blockchain.md#savemempool) *Parameters: none* -*Example from Dash Core 0.16.0* +*Result---output filename* + +Name | Type | Presence | Description +--- | --- | --- | --- +`result` | object/null | Required
(exactly 1) | An object containing the filename the mempool was saved to +→
`filename` | string | Required
(exactly 1) | The directory and file where the mempool was saved + +*Example from Dash Core 22.0.0* ``` bash dash-cli savemempool ``` -Result (no output from dash-cli). +Result: + +```json +{ + "filename": "/home/phez/.dashcore/testnet3/mempool.dat" +} +``` *See also: none* diff --git a/docs/core/api/remote-procedure-calls-dash.md b/docs/core/api/remote-procedure-calls-dash.md index ce56bdfbe..acafd98b9 100644 --- a/docs/core/api/remote-procedure-calls-dash.md +++ b/docs/core/api/remote-procedure-calls-dash.md @@ -6,6 +6,170 @@ # Dash RPCs + + +## CoinJoin + +As of Dash Core 0.12.3, this is not supported on masternodes since wallet functionality is disabled on them for security reasons. + +The [`coinjoin` RPC](#coinjoin) controls the CoinJoin process (previously named `privatesend` prior to Dash Core 0.17.0). + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| `mode` | string | Required
(exactly 1) | The command mode to use:
`start` - Start CoinJoin
`stop` - Stop CoinJoin
`reset` - Reset CoinJoin | + +**Command Mode - `start`** + +*Result---start command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin start +``` + +Result: + +```text +Mixing started successfully +``` + +**Command Mode - `stop`** + +*Result---stop command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin stop +``` + +Result: + +```text +Mixing was stopped +``` + +**Command Mode - `reset`** + +*Result---reset command return status* + +| Name | Type | Presence | Description | +| -------- | ------ | ----------------------- | --------------------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 0.17.0* + +``` bash +dash-cli -testnet coinjoin reset +``` + +Result: + +```text +Mixing was reset +``` + +*See also: none* + +## CoinJoinSalt + +The [`coinjoinsalt` RPC](#coinjoinsalt) controls the CoinJoin salt used in the process. It allows +you to generate, retrieve, or set the salt. + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------ | +| `command` | string | Required
(exactly 1) | The command mode to use:
`generate` - Generate new CoinJoin salt
`get` - Fetch existing CoinJoin salt
`set` - Set new CoinJoin salt | + +**Command Mode - `generate`** + +Generates a new CoinJoin salt and stores it in the wallet database. Note that a new salt cannot be +generated if CoinJoin mixing is in process or if the wallet has private keys disabled. + +| Name | Type | Presence | Description | +| ----------- | ------- | ------------------------------- | ----------- | +| `overwrite` | boolean | Optional
(default: `false`) | Allows generating new salt even if an existing salt is present and/or there is a CoinJoin balance | + +*Result---generate command return status* + +| Name | Type | Presence | Description | +| -------- | ------- | ----------------------- | ---------------------------------- | +| `result` | boolean | Required
(exactly 1) | Status of CoinJoin salt generation | + +*Examples* + +```bash +dash-cli -testnet coinjoinsalt generate +``` + +Result: + +```text +true +``` + +**Command Mode - `get`** + +Fetches the existing CoinJoin salt. Note that the salt cannot be fetched if the wallet has private +keys disabled. + +*Result---get command return value* + +| Name | Type | Presence | Description | +| ----- | ------ | ----------------------- | ------------------------- | +| `salt` | string | Required
(exactly 1) | The current CoinJoin salt (in hexadecimal format) | + +*Examples* + +```bash +dash-cli -testnet coinjoinsalt get +``` + +Result: + +```text +"c2ca...4546" +``` + +**Command Mode - `set`** + +Sets a new CoinJoin salt. The salt cannot be set if CoinJoin mixing is in process or if the wallet +has private keys disabled. This command will overwrite the existing salt, and if a CoinJoin balance +is present, the wallet will rescan. + +| Name | Type | Presence | Description | +| ----------- | ------- | ------------------------------- | ----------- | +| `salt` | string | Required
(exactly 1) | The desired CoinJoin salt value for the wallet (in hexadecimal format) | +| `overwrite` | boolean | Optional
(default: `false`) | Allows overwriting the salt even if a CoinJoin balance is present | + +*Result---set command return status* + +| Name | Type | Presence | Description | +| -------- | ------- | ----------------------- | -------------------------------------- | +| `result` | boolean | Required
(exactly 1) | Status of CoinJoin salt change request | + +*Examples* + +```bash +dash-cli -testnet coinjoinsalt set f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 +``` + +Result: + +```text +true +``` + +*See also: none* + ## GetGovernanceInfo The [`getgovernanceinfo` RPC](#getgovernanceinfo) returns an object containing governance parameters. @@ -61,39 +225,38 @@ The [`getcoinjoininfo` RPC](#getcoinjoininfo) returns an object containing an in *Result---(for regular nodes) information about the pool* -| Name | Type | Presence | Description | -| ------------------------ | --------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------- | -| `result` | object | Required
(exactly 1) | Information about the pool | -| →
`enabled` | bool | Required
(exactly 1) | Whether CoinJoin functionality is enabled | -| →
`multisession` | bool | Required
(exactly 1) | Whether CoinJoin multisession option is enabled | -| →
`max_sessions` | number (int) | Required
(exactly 1) | How many parallel sessions can there be at once | -| →
`max_rounds` | number (int) | Required
(exactly 1) | How many rounds to process | -| →
`max_amount` | number (int) | Required
(exactly 1) | How many DASH to keep processed | -| →
`max_denoms` | number (int) | Required
(exactly 1) | **Removed in Dash Core 0.16.0**
How many inputs of each denominated amount to create | -| →
`denoms_goal` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
How many inputs of each denominated amount to target | +| Name | Type | Presence | Description | +| ------------------------ | --------------------- | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | Information about the pool | +| →
`enabled` | bool | Required
(exactly 1) | Whether CoinJoin functionality is enabled | +| →
`multisession` | bool | Required
(exactly 1) | Whether CoinJoin multisession option is enabled | +| →
`max_sessions` | number (int) | Required
(exactly 1) | How many parallel sessions can there be at once | +| →
`max_rounds` | number (int) | Required
(exactly 1) | How many rounds to process | +| →
`max_amount` | number (int) | Required
(exactly 1) | How many DASH to keep processed | +| →
`denoms_goal` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
How many inputs of each denominated amount to target | | →
`denoms_hardcap` | number (int) | Required
(exactly 1) | *Added in Dash Core 0.16.0*
Maximum limit of how many inputs of each denominated amount to create | -| →
`queue_size` | number (int) | Required
(exactly 1) | How many queues there are currently on the network | -| →
`running` | bool | Required
(exactly 1) | Whether CoinJoin is currently running | -| →
`sessions` | array of json objects | Required
(exactly 1) | Information about session(s) | -| → →
Session | object | Optional
(1 or more) | Information for a session | -| → → →
`protxhash` | string | Required
(exactly 1) | The ProTxHash of the masternode | -| → → →
`outpoint` | string (txid-index) | Required
(exactly 1) | The outpoint of the masternode | -| → → →
`service` | string (host:port) | Required
(exactly 1) | The IP address and port of the masternode | -| → → →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | -| → → →
`state` | string | Required
(exactly 1) | Current state of the session | -| → → →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | -| →
`keys_left` | number (int) | Required
(exactly 1) | How many new keys are left since last automatic backup | -| →
`warnings` | string | Optional
(exactly 1) | Any warnings | +| →
`queue_size` | number (int) | Required
(exactly 1) | How many queues there are currently on the network | +| →
`running` | bool | Required
(exactly 1) | Whether CoinJoin is currently running | +| →
`sessions` | array of json objects | Required
(exactly 1) | Information about session(s) | +| → →
Session | object | Optional
(1 or more) | Information for a session | +| → → →
`protxhash` | string | Required
(exactly 1) | The ProTxHash of the masternode | +| → → →
`outpoint` | string (txid-index) | Required
(exactly 1) | The outpoint of the masternode | +| → → →
`service` | string (host:port) | Required
(exactly 1) | The IP address and port of the masternode | +| → → →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | +| → → →
`state` | string | Required
(exactly 1) | Current state of the session | +| → → →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | +| →
`keys_left` | number (int) | Optional
(0 or 1) | *Changed to optional in Dash Core 22.0.0*
How many new keys are left since last automatic backup | +| →
`warnings` | string | Optional
(exactly 1) | Any warnings | *Result---(for masternodes) information about the pool* -| Name | Type | Presence | Description | -| -------------------- | ------------ | ----------------------- | -------------------------------------------------- | -| `result` | object | Required
(exactly 1) | Information about the pool | +| Name | Type | Presence | Description | +| -------------------- | ------------ | ----------------------- | ----------- | +| `result` | object | Required
(exactly 1) | Information about the pool | | →
`queue_size` | number (int) | Required
(exactly 1) | How many queues there are currently on the network | -| →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | -| →
`state` | string | Required
(exactly 1) | Current state of the session | -| →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | +| →
`denomination` | number (int) | Required
(exactly 1) | The denomination of the session (in DASH) | +| →
`state` | string | Required
(exactly 1) | Current state of the session | +| →
`entries_count` | number (int) | Required
(exactly 1) | The number of entries in the session | *Example from Dash Core 0.17.0 (regular node)* @@ -1030,6 +1193,44 @@ dash-cli -testnet gobject vote-many \ The [`masternode` RPC](#masternode) provides a set of commands for managing masternodes and displaying information about them. +### Masternode Connect + +The [`masternode connect` RPC](#masternode-connect) initiates a connection to a specified masternode address, with optional support for the BIP324 v2 transport protocol. + +_Parameter #1---the address of the masternode_ + +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ----------- | +| address | string | Required
(exactly 1) | The IP address and port of the masternode to connect to (e.g., `192.168.1.100:19999`) | + +_Parameter #2---transport protocol options_ + +| Name | Type | Presence | Description | +| ------------ | ------- | -------------------- | ----------- | +| v2transport | bool | Optional
(0 or 1) | Set to `true` to attempt connection using the BIP324 v2 transport protocol. Defaults to `false`. | + +_Result---connection status_ + +| Name | Type | Presence | Description | +| ------------ | ------- | ----------------------- | ----------- | +| `result` | string | Required
(exactly 1) | Command return status | + +*Example from Dash Core 22.0.0* + +Connect to a masternode at address `192.168.1.100` using the default transport protocol: + +```bash +dash-cli masternode connect "192.168.1.100:19999" +``` + +Result: + +```text +successfully connected +``` + +*See also: none* + ### Masternode Count The `masternode count` RPC prints the number of all known masternodes. @@ -1664,80 +1865,6 @@ success * [Masternode](#masternode): provides a set of commands for managing masternodes and displaying information about them. * [MasternodeList](#masternodelist): returns a list of masternodes in different modes. - - -## CoinJoin - -As of Dash Core 0.12.3, this is not supported on masternodes since wallet functionality is disabled on them for security reasons. - -The [`coinjoin` RPC](#coinjoin) controls the CoinJoin process (previously named `privatesend` prior to Dash Core 0.17.0). - -| Name | Type | Presence | Description | -| ------ | ------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- | -| `mode` | string | Required
(exactly 1) | The command mode to use:
`start` - Start CoinJoin
`stop` - Stop CoinJoin
`reset` - Reset CoinJoin | - -**Command Mode - `start`** - -*Result---start command return status* - -| Name | Type | Presence | Description | -| -------- | ------ | ----------------------- | --------------------- | -| `result` | string | Required
(exactly 1) | Command return status | - -*Example from Dash Core 0.17.0* - -``` bash -dash-cli -testnet coinjoin start -``` - -Result: - -```text -Mixing started successfully -``` - -**Command Mode - `stop`** - -*Result---stop command return status* - -| Name | Type | Presence | Description | -| -------- | ------ | ----------------------- | --------------------- | -| `result` | string | Required
(exactly 1) | Command return status | - -*Example from Dash Core 0.17.0* - -``` bash -dash-cli -testnet coinjoin stop -``` - -Result: - -```text -Mixing was stopped -``` - -**Command Mode - `reset`** - -*Result---reset command return status* - -| Name | Type | Presence | Description | -| -------- | ------ | ----------------------- | --------------------- | -| `result` | string | Required
(exactly 1) | Command return status | - -*Example from Dash Core 0.17.0* - -``` bash -dash-cli -testnet coinjoin reset -``` - -Result: - -```text -Mixing was reset -``` - -*See also: none* - ## Spork The [`spork` RPC](#spork) shows information about the current state of sporks. diff --git a/docs/core/api/remote-procedure-calls-evo.md b/docs/core/api/remote-procedure-calls-evo.md index fac14de03..037f0316c 100644 --- a/docs/core/api/remote-procedure-calls-evo.md +++ b/docs/core/api/remote-procedure-calls-evo.md @@ -1401,12 +1401,6 @@ ec66f97568727a9e5188acb3ccf680086ae11217236efcccd67b0b72e83c79a043d6c6d064378fdd 47d9401e0a569a5488728e09542d0545ab56f8249a4b21e03445fa411e ``` -### ProTx Register HPMN - -:::{deprecated} 20.0.0 -The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). -::: - ### ProTx Register Fund Evo The `protx register_fund_evo` RPC creates, funds, and sends a ProTx to the network. The resulting transaction will move 4000 Dash to the address specified by `collateralAddress` and will then function as the collateral of your evonode. A few of the limitations you see in the arguments are temporary and might be lifted after DIP3 is fully deployed. Requires the wallet passphrase to be provide with the [`walletpassphrase` RPC](../api/remote-procedure-calls-wallet.md#walletpassphrase) if the wallet is encrypted. @@ -1536,12 +1530,6 @@ c207ebd525793ccb43f60ce34a5cd5f4011976a9145a375814e9caf5b8575a8221be246457e5c5c2 8d88ac45084a0f63d6f06767c941ffd5af4ed17ea0e28afa481e46b2bdbadbd8446c8c00\ ``` -### ProTx Register Fund HPMN - -:::{deprecated} 20.0.0 -The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). -::: - ### ProTx Register Prepare Evo The `protx register_prepare_evo` RPC creates an unsigned ProTx and a message that must be signed externally with the private key that corresponds to `collateralAddress` to prove collateral ownership. The prepared transaction will also contain inputs and outputs to cover fees. @@ -1648,12 +1636,6 @@ Result: } ``` -### ProTx Register Prepare HPMN - -:::{deprecated} 20.0.0 -The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). -::: - ### ProTx Update Service Evo The `protx update_service_evo` RPC creates and sends a ProUpServTx to the network. This will update the IP address and the Platform fields of an evonode. If this is done for an evonode that was PoSe-banned, the ProUpServTx will also revive this evonode. @@ -1728,12 +1710,6 @@ Result: 5b6cfa1bdd3c8b7e0b9550b9c4e809381f81a410bc7f241d3879dd736fd51270 ``` -### ProTx Update Service HPMN - -:::{deprecated} 20.0.0 -The `protx *_hpmn` RPC commands were renamed in Dash Core 20.0.0 and can now be accessed as `protx *_evo` (e.g. `protx register_hpmn` is now `protx register_evo`). -::: - ### ProTx Register Submit The `protx register_submit` RPC combines the unsigned ProTx and a signature of the signMessage, signs all inputs which were added to cover fees and submits the resulting transaction to the network. Note: See [`protx register_prepare`](#protx-register-prepare) for more info about creating a ProTx and a message to sign. @@ -2949,6 +2925,64 @@ Result: } ``` +### Quorum GetData + +The [`quorum getdata` RPC](#quorum-getdata) sends a [`qgetdata` message](../reference/p2p-network-quorum-messages.md#qgetdata) to a specified peer, requesting specific quorum-related data from that peer. + +_Parameter #1---the internal node ID_ + +| Name | Type | Presence | Description | +|----------|--------|-------------------------|-------------| +| `nodeId` | number | Required
(exactly 1) | The internal nodeId of the peer from which quorum data is requested | + +_Parameter #2---the LLMQ type_ + +| Name | Type | Presence | Description | +|-----------|--------|-------------------------|-------------| +| `llmqType`| number | Required
(exactly 1) | The LLMQ type associated with the quorum data being requested | + +_Parameter #3---the quorum hash_ + +| Name | Type | Presence | Description | +|--------------|--------|-------------------------|-------------| +| `quorumHash` | string | Required
(exactly 1) | The quorum hash for the quorum data being requested | + +_Parameter #4---the data mask_ + +| Name | Type | Presence | Description | +|-------------|--------|-------------------------|-------------| +| `dataMask` | number | Required
(exactly 1) | Specifies the type of data requested. Possible values are:
`1` - Quorum verification vector
`2` - Encrypted contributions for member specified by `proTxHash` (`proTxHash` must be specified if this option is used)
`3` - Both (1 and 2) | + +_Parameter #5---the ProTxHash_ + +| Name | Type | Presence | Description | +|------------|--------|---------------------------|-------------| +| `proTxHash`| string | Optional
(default="") | The ProTxHash for the contributions requested. Must be a member of the specified LLMQ. Cannot be specified if `dataMask` is set to `1`. Required if `dataMask` is set to `2`. | + +_Result---execution result_ + +| Name | Type | Presence | Description | +|---------------------|-----------------|-------------------------|-------------| +| `success` | bool | Required
(exactly 1) | Displays `true` if the data request was successful or `false` if it failed | + +_Example from Dash Core 22.0.0_ + +Requesting the quorum verification vector from a peer with node ID `12` for a quorum of type `2`: + +```bash +dash-cli quorum getdata 1 2 "000000822d2b1b311af360750b6448917f10d8b92d2ea2a7bbae221e859354f9" 1 +``` + +Result: + +```text +true +``` + +_See also_ + +* [Quorum List](#quorum-list): displays a list of on-chain quorums. + ### Quorum GetRecSig The `quorum getrecsig` RPC gets the recovered signature for a previous threshold-signing message request. diff --git a/docs/core/api/remote-procedure-calls-network.md b/docs/core/api/remote-procedure-calls-network.md index 7a6dfcb1c..ff1d05751 100644 --- a/docs/core/api/remote-procedure-calls-network.md +++ b/docs/core/api/remote-procedure-calls-network.md @@ -12,20 +12,26 @@ The [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode) attempts t *Parameter #1---hostname/IP address and port of node to add or remove* -| Name | Type | Presence | Description | -| ------ | ------ | ----------------------- | ----------------------------------------------------------------- | +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------- | | `node` | string | Required
(exactly 1) | The node to add as a string in the form of `:`. | *Parameter #2---whether to add or remove the node, or to try only once to connect* -| Name | Type | Presence | Description | -| --------- | ------ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Type | Presence | Description | +| --------- | ------ | ----------------------- | ----------- | | `command` | string | Required
(exactly 1) | What to do with the IP address above. Options are:
• `add` to add a node to the addnode list. Up to 8 nodes can be added additional to the default 8 nodes. Not limited by `-maxconnections`
• `remove` to remove a node from the list. If currently connected, this will disconnect immediately
• `onetry` to immediately attempt connection to the node even if the outgoing connection slots are full; this will only attempt the connection once | +*Parameter #3---v2 transport* + +| Name | Type | Presence | Description | +| ------ | ------ | ----------------------- | ----------- | +| `v2transport` | bool | Optional
(0 or1) | Attempt to connect using BIP324 v2 transport protocol (ignored for `remove` command). Default=set by `-v2transport` option. | + _Result---`null` plus error on failed remove_ -| Name | Type | Presence | Description | -| -------- | ---- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Type | Presence | Description | +| -------- | ---- | ----------------------- | ----------- | | `result` | null | Required
(exactly 1) | Always JSON `null` whether the node was added, removed, tried-and-connected, or tried-and-not-connected. The JSON-RPC error field will be set only if you try adding a node that was already added or removing a node that is not on the addnodes list | *Example from Dash Core 0.12.2* @@ -44,8 +50,12 @@ Result (no output from `dash-cli` because result is set to `null`). ## AddPeerAddress +:::{attention} +This RPC is for testing only. +::: + The [`addpeeraddress` RPC](../api/remote-procedure-calls-network.md#addpeeraddress) adds the address -of a potential peer to the address manager. **This RPC is for testing only.** +of a potential peer to the address manager. *Parameter #1---IP address of node to add* @@ -59,6 +69,12 @@ of a potential peer to the address manager. **This RPC is for testing only.** | ---- | ---- | -------- | ----------- | | `port` | number | Required
(exactly 1) | The port of the peer | +*Parameter #3---add to tried address table* + +| Name | Type | Presence | Description | +| ---- | ---- | -------- | ----------- | +| `tried` | bool | Optional
(0 or 1) | If true, attempt to add the peer to the tried addresses table | + *Result---a list of added nodes* | Name | Type | Presence | Description | @@ -397,7 +413,7 @@ The [`getnetworkinfo` RPC](../api/remote-procedure-calls-network.md#getnetworkin | →
`connections_mn` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of verified masternode connections | | →
`connections_mn_in` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of inbound verified masternode connections | | →
`connections_mn_out` | number (int) | Required
(exactly 1) | _Added in Dash Core 18.0.0_

The number of outbound verified masternode connections | -| →
`socketevents` | string | Required
(exactly 1) | _Added in Dash Core 0.16.0_

The socket events mode, either `epoll`, `poll`, or `select` | +| →
`socketevents` | string | Required
(exactly 1) | The socket events mode, either `epoll`, `poll`, or `select` | | →
`networks` | array | Required
(exactly 1) | An array with three objects: one describing the IPv4 connection, one describing the IPv6 connection, and one describing the Tor hidden service (onion) connection | | → →
Network | object | Optional
(0 to 3) | An object describing a network. If the network is unroutable, it will not be returned | | → → →
`name` | string | Required
(exactly 1) | The name of the network. Either `ipv4`, `ipv6`, or `onion` | @@ -554,8 +570,10 @@ The [`getpeerinfo` RPC](../api/remote-procedure-calls-network.md#getpeerinfo) re | → →
`bytesrecv_per_msg` | string :
object | Required
(exactly 1) | *Added in Bitcoin Core 0.13.0*

Information about total received bytes aggregated by message type | | → → →
Message Type | number (int) | Required
(1 or more) | Total received bytes aggregated by message type. One field for every used message type | | `connection_type` | string | Required
(exactly 1) | **Added in Dash Core 20.1.0**
Type of connection:
outbound-full-relay, block-relay-only, inbound, manual, addr-fetch, feeler.
Describes how the connection was established. Set to `true` if this node was added via the [`addnode` RPC](../api/remote-procedure-calls-network.md#addnode).
**Note: This output is subject to change in future releases as connection behaviors are refined.** | +| `transport_protocol_type`| string | Optional
(0 or 1) | **Added in Dash Core 22.0.0**
The transport protocol type:
`detecting` - peer could be v1 or v2
`v1` - plaintext transport protocol
`v2` - BIP324 encrypted transport protocol | +| `session_id` | string | Optional
(0 or 1) | **Added in Dash Core 22.0.0**
The session ID for this connection, or "" if there is none ("v2" transport protocol only). | -*Example from Dash Core 21.0.0* +*Example from Dash Core 22.0.0* ```bash dash-cli -testnet getpeerinfo @@ -589,20 +607,20 @@ Result (edited to show only a single entry, with IP addresses changed to "timeoffset": 0, "pingtime": 0.105995, "minping": 0.095181, - "version": 70232, - "subver": "/Dash Core:21.0.0(dcg-masternode-7)/", + "version": 70233, + "subver": "/Dash Core:21.1.0(dcg-masternode-7)/", "inbound": false, "bip152_hb_to": false, "bip152_hb_from": false, "masternode": false, - "startingheight": 1022323, - "synced_headers": 1022323, - "synced_blocks": 1022323, + "startingheight": 1131692, + "synced_headers": 1131804, + "synced_blocks": 1131804, "inflight": [ ], - "relaytxes": false, - "addr_relay_enabled": false, - "addr_processed": 0, + "relaytxes": true, + "addr_relay_enabled": true, + "addr_processed": 519, "addr_rate_limited": 0, "permissions": [ ], @@ -641,7 +659,9 @@ Result (edited to show only a single entry, with IP addresses changed to "verack": 24, "version": 180 }, - "connection_type": "block-relay-only" + "connection_type": "outbound-full-relay", + "transport_protocol_type": "v1", + "session_id": "" } ] ``` diff --git a/docs/core/api/remote-procedure-calls-raw-transactions.md b/docs/core/api/remote-procedure-calls-raw-transactions.md index adedd0c9c..4b22574b9 100644 --- a/docs/core/api/remote-procedure-calls-raw-transactions.md +++ b/docs/core/api/remote-procedure-calls-raw-transactions.md @@ -916,7 +916,7 @@ _Parameter #3---hash of a block to look in for the transaction_ | Name | Type | Presence | Description | | ---------- | ---- | -------------------- | --------------------------------------------------------------------------------------------- | -| Block Hash | string | Optional
(0 or 1) | _Added in Dash Core 0.16.0_

The hash of the block in which to look for the transaction | +| Block Hash | string | Optional
(0 or 1) | The hash of the block in which to look for the transaction | _Result (if transaction not found)---`null`_ @@ -985,7 +985,7 @@ _Result (if verbose=`true`)---the decoded transaction_ | →
`blocktime` | number (int) | Optional
(0 or 1) | This field is currently identical to the time field described above | | →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) | | →
`instantlock_internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock | -| →
`chainlock` | bool | Required
(exactly 1) | _Added in Dash Core 0.14.0_

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | +| →
`chainlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | _Examples from Dash Core 21.1.0_ diff --git a/docs/core/api/remote-procedure-calls-removed.md b/docs/core/api/remote-procedure-calls-removed.md index 363d0d28e..b9f61aa9e 100644 --- a/docs/core/api/remote-procedure-calls-removed.md +++ b/docs/core/api/remote-procedure-calls-removed.md @@ -61,3 +61,45 @@ dash-cli -testnet gobject vote-conf \ } } ``` + +## Protx + +### ProTx Register HPMN + +:::{attention} +Removed in Dash Core 22.0.0 +::: + +The `protx *_hpmn` RPC commands were renamed and deprecated in Dash Core 20.0.0. They can now be accessed as `protx *_evo` (e.g., `protx register_hpmn` is now [`protx register_evo`](../api/remote-procedure-calls-evo.md#protx-register-evo)). + +**All `protx *_hpmn` RPC commands were removed in Dash Core 22.0.0.** + +### ProTx Register Fund HPMN + +:::{attention} +Removed in Dash Core 22.0.0 +::: + +The `protx *_hpmn` RPC commands were renamed and deprecated in Dash Core 20.0.0. They can now be accessed as `protx *_evo` (e.g., `protx register_hpmn` is now [`protx register_evo`](../api/remote-procedure-calls-evo.md#protx-register-evo)). + +**All `protx *_hpmn` RPC commands were removed in Dash Core 22.0.0.** + +### ProTx Register Prepare HPMN + +:::{attention} +Removed in Dash Core 22.0.0 +::: + +The `protx *_hpmn` RPC commands were renamed and deprecated in Dash Core 20.0.0. They can now be accessed as `protx *_evo` (e.g., `protx register_hpmn` is now [`protx register_evo`](../api/remote-procedure-calls-evo.md#protx-register-evo)). + +**All `protx *_hpmn` RPC commands were removed in Dash Core 22.0.0.** + +### ProTx Update Service HPMN + +:::{attention} +Removed in Dash Core 22.0.0 +::: + +The `protx *_hpmn` RPC commands were renamed and deprecated in Dash Core 20.0.0. They can now be accessed as `protx *_evo` (e.g., `protx register_hpmn` is now [`protx register_evo`](../api/remote-procedure-calls-evo.md#protx-register-evo)). + +**All `protx *_hpmn` RPC commands were removed in Dash Core 22.0.0.** diff --git a/docs/core/api/remote-procedure-calls-wallet.md b/docs/core/api/remote-procedure-calls-wallet.md index 949114340..74e207402 100644 --- a/docs/core/api/remote-procedure-calls-wallet.md +++ b/docs/core/api/remote-procedure-calls-wallet.md @@ -932,7 +932,7 @@ _Result---a description of the transaction_ | →
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transaction has received. Will be `0` for unconfirmed and `-1` for conflicted | | →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) | | →
`instantlock-internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock. Available for 'send' and 'receive' category of transactions. | -| →
`chainlock` | bool | Required
(exactly 1) | _Added in Dash Core 0.14.0_

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | +| →
`chainlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | | →
`trusted` | bool | Optional
(0 or 1) | Whether we consider the outputs of this unconfirmed transaction safe to spend. Only returned for unconfirmed transactions | | →
`generated` | bool | Optional
(0 or 1) | Set to `true` if the transaction is a coinbase. Not returned for regular transactions | | →
`blockhash` | string (hex) | Optional
(0 or 1) | The hash of the block on the local best block chain which includes this transaction, encoded as hex in RPC byte order. Only returned for confirmed transactions | @@ -1058,7 +1058,7 @@ _Result---information about the wallet_ | →
`unconfirmed_balance` | number (dash) | Required
(exactly 1) | **Deprecated** The total unconfirmed balance of the wallet. The same as returned by the [`getunconfirmedbalance` RPC](../api/remote-procedure-calls-wallet.md#getunconfirmedbalance) with default parameters. Identical to `getbalances().mine.untrusted_pending`. | | →
`immature_balance` | number (dash) | Required
(exactly 1) | **Deprecated** The total immature balance of the wallet. This includes mining/masternode rewards that cannot be spent yet. Identical to `getbalances().mine.immature`. | | →
`txcount` | number (int) | Required
(exactly 1) | The total number of transactions in the wallet (both spends and receives) | -| →
`timefirstkey` | number (int) | Required
(exactly 1) | _Added in Dash Core 0.17.0_

The timestamp (seconds since Unix epoch) of the oldest known key in the wallet | +| →
`timefirstkey` | number (int) | Required
(exactly 1) | The timestamp (seconds since Unix epoch) of the oldest known key in the wallet | | →
`keypoololdest` | number (int) | Required
(exactly 1) | The date as Unix epoch time when the oldest key in the wallet key pool was created; useful for only scanning blocks created since this date for transactions | | →
`keypoolsize` | number (int) | Required
(exactly 1) | The number of keys in the wallet keypool | | →
`keypoolsize_hd_internal` | number (int) | Optional
(0 or 1) | How many new keys are pre-generated for internal use (used for change outputs, only appears if the wallet is using this feature, otherwise external keys are used) | @@ -2031,7 +2031,7 @@ _Parameter #4---include_removed_ | →
`confirmations` | number (int) | Required
(exactly 1) | The number of confirmations the transaction has received. Will be `0` for unconfirmed and `-1` for conflicted | | →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) | | →
`instantlock_internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock | -| →
`chainlock` | bool | Required
(exactly 1) | _Added in Dash Core 0.14.0_

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | +| →
`chainlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | | →
`generated` | bool | Optional
(0 or 1) | Set to `true` if the transaction is a coinbase. Not returned for regular transactions | | →
`blockhash` | string (hex) | Optional
(0 or 1) | The hash of the block on the local best block chain which includes this transaction, encoded as hex in RPC byte order. Only returned for confirmed transactions | | →
`blockheight` | string (hex) | Optional
(0 or 1) | The block height containing the transaction. | @@ -2165,7 +2165,7 @@ _Result---payment details_ | → →
`confirmations` | number (int) | Optional
(0 or 1) | The number of confirmations the transaction has received. Will be `0` for unconfirmed and `-1` for conflicted. Not returned for _move_ category payments | | →
`instantlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is either protected by an [InstantSend](../resources/glossary.md#instantsend) lock or it is in a block that has received a [ChainLock](../resources/glossary.md#chainlock) | | →
`instantlock_internal` | bool | Required
(exactly 1) | If set to `true`, this transaction has an [InstantSend](../resources/glossary.md#instantsend) lock | -|
`chainlock` | bool | Required
(exactly 1) | _Added in Dash Core 0.14.0_

If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | +|
`chainlock` | bool | Required
(exactly 1) | If set to `true`, this transaction is in a block that is locked (not susceptible to a chain re-org) | | → →
`generated` | bool | Optional
(0 or 1) | Set to `true` if the transaction is a coinbase. Not returned for regular transactions or _move_ category payments | | → →
`trusted` | bool | Optional
(0 or 1) | Indicates whether we consider the outputs of this unconfirmed transaction safe to spend. Only returned for unconfirmed transactions | | → →
`blockhash` | string (hex) | Optional
(0 or 1) | The hash of the block on the local best block chain which includes this transaction, encoded as hex in RPC byte order. Only returned for confirmed transactions | @@ -2781,7 +2781,13 @@ _Parameter #3---estimate_mode_ | -------------- | ------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------- | | estimate_mode | string | Optional
(0 or 1) | The fee estimate mode. Must be one of: `unset`, `economical`, `conservative`, `DASH/kB`, `duff/B`. Default is `unset`. | -_Parameter #4---Options_ +_Parameter #4---Fee rate_ + +| Name | Type | Presence | Description | +| -------- | ------- | ----------------------- | ----------- | +| fee_rate | number or string | Optional
(0 or 1) | **Added in Dash Core 22.0.0**
Specify a fee rate in duffs/B (default=not set, fall back to wallet fee estimation). | + +_Parameter #5---Options_ | Name | Type | Presence | Description | | --------------------------- | ------------------ | ----------------------- | --------------------------------------------------- | @@ -2901,10 +2907,16 @@ _Parameter #10---fee estimate mode_ | ---- | ---- | -------- | ----------- | | `estimate_mode` | string | Optional
(0 or 1) | The fee estimate mode, must be one of:
`unset`
`economical`
`conservative`
`DASH/kB`
`duff/B` | -_Parameter #11---verbose_ +_Parameter #11---fee rate_ + +| Name | Type | Presence | Description | +| -------- | ------- | ----------------------- | ----------- | +| `fee_rate` | number or string | Optional
(0 or 1) | **Added in Dash Core 22.0.0**
Specify a fee rate in duffs/B (default=not set, fall back to wallet fee estimation). | -| Name | Type | Presence | Description | -| ------- | ------- | ----------------------- | ---------------------------------------------------------- | +_Parameter #12---verbose_ + +| Name | Type | Presence | Description | +| ------- | ------- | ----------------------- | ----------- | | verbose | boolean | Optional
(0 or 1) | If `true`, return extra information about the transaction. Default is `false` | _Result---execution result_ @@ -3047,10 +3059,16 @@ _Parameter #10---avoids partial respends_ | ------------- | ------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `avoid_reuse` | boolean | Optional
(0 or 1) | Avoid spending from dirty addresses; addresses are considered dirty if they have previously been used in a transaction. | -_Parameter #11---verbose_ +_Parameter #11---fee rate_ + +| Name | Type | Presence | Description | +| -------- | ------- | ----------------------- | ----------- | +| `fee_rate` | number or string | Optional
(0 or 1) | **Added in Dash Core 22.0.0**
Specify a fee rate in duffs/B (default=not set, fall back to wallet fee estimation). | + +_Parameter #12---verbose_ -| Name | Type | Presence | Description | -| ------- | ------- | ----------------------- | ---------------------------------------------------------- | +| Name | Type | Presence | Description | +| ------- | ------- | ----------------------- | ----------- | | verbose | boolean | Optional
(0 or 1) | If `true`, return extra information about the transaction. Default is `false` | _Result---execution result_ diff --git a/docs/core/api/zmq.md b/docs/core/api/zmq.md index 6e16f461e..c6fb85d2b 100644 --- a/docs/core/api/zmq.md +++ b/docs/core/api/zmq.md @@ -41,7 +41,8 @@ Currently, the following notifications are supported: | zmqpubrawgovernancevote | Raw governance vote ([`govobjvote`](../reference/p2p-network-governance-messages.md#govobjvote)) | | zmqpubrawgovernanceobject | Raw governance object ([`govobject`](../reference/p2p-network-governance-messages.md#govobj)) | | zmqpubrawinstantsend
doublespend | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) attempting to double-spend an InstantSend-locked input | -| zmqpubrawrecoveredsig | Raw recovered signatures (recovered by LLMQs) +| zmqpubrawrecoveredsig | Raw recovered signatures (recovered by LLMQs) | +| zmqpubsequence | Mempool sequence number | ## High Water Mark @@ -67,6 +68,7 @@ The option to set the PUB socket's outbound message [high water mark](https://ze | zmqpubrawgovernanceobjecthwm | Raw governance object ([`govobject`](../reference/p2p-network-governance-messages.md#govobj)) high water mark | | zmqpubrawinstantsenddoublespendhwm | Raw transaction ([`tx`](../reference/transactions-raw-transaction-format.md)) attempting to double-spend an InstantSend-locked input high water mark | | zmqpubrawrecoveredsighwm | Raw recovered signatures (recovered by LLMQs) high water mark | +| zmqpubsequencehwm | Mempool sequence number high water mark | ## Dash Core Configuration @@ -74,14 +76,14 @@ ZMQ notifications can be enabled via either command line arguments or the config ### Command Line -``` +```shell $ dashd -zmqpubhashtx=tcp://127.0.0.1:28332 \ -zmqpubrawtx=ipc:///tmp/dashd.tx.raw ``` ### Config File -``` +```conf # ZMQ zmqpubhashtx=tcp://0.0.0.0:28332 zmqpubrawtx=tcp://0.0.0.0:28332 diff --git a/docs/core/guide/dash-features-coinjoin.md b/docs/core/guide/dash-features-coinjoin.md index 093666f20..a75980da1 100644 --- a/docs/core/guide/dash-features-coinjoin.md +++ b/docs/core/guide/dash-features-coinjoin.md @@ -40,9 +40,9 @@ Protocol version 70213 added a 5th denomination (0.001 DASH). **Creating Collaterals** -Collaterals are used to pay CoinJoin fees, but are kept separate from the denominations to maximize privacy. Since protocol version 70213, the minimum collateral fee is 1/10 of the smallest denomination for all sessions regardless of denomination. In Dash Core, collaterals are created with enough value to pay 4 collateral fees (4 x 0.001 DASH). ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L459)) +Collaterals are used to pay CoinJoin fees, but are kept separate from the denominations to maximize privacy. Since protocol version 70213, the minimum collateral fee is 1/10 of the smallest denomination for all sessions regardless of denomination. In Dash Core, collaterals are created with enough value to pay 4 collateral fees (4 x 0.001 DASH). ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/common.h#L109)) -In protocol version 70208, collateral inputs can be anything from 2x the minimum collateral amount to the maximum collateral amount (currently defined as 4x the minimum collateral). In protocol versions > 70208, Dash Core can use any [input](../resources/glossary.md#input) from 1x the minimum collateral amount to the maximum collateral amount. +In protocol versions > 70208, Dash Core can use any [input](../resources/glossary.md#input) from 1x the minimum collateral amount to the maximum collateral amount. [Example Testnet collateral creation transaction](https://testnet-insight.dashevo.org/insight/tx/8f9b15973983876f7ce4eb2c32b09690dfb0432d2caf6c6df516196a8d17689f) @@ -52,24 +52,33 @@ In protocol version 70208, collateral inputs can be anything from 2x the minimum This phase involves exchanging a sequence of messages with a [masternode](../resources/glossary.md#masternode) so it can construct a denominate transaction with inputs from the clients in its pool. -*Data Flow* +### Data Flow + +:::{attention} +Since protocol version 70234 (Dash Core 22.0.0), the [`dsq` +message](../reference/p2p-network-privatesend-messages.md#dsq) is broadcast using the inventory +system instead of being relayed to all connected peers. This reduces the bandwidth needs for all +nodes, especially highly connected masternodes. +::: | | **Clients** | **Direction** | **Masternode** | **Description** | | --- | --- | :---: | --- | --- | | 0 | | | | Client determines whether to join an existing pool or create a new one | | 1 | [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) | → | | Client asks to join pool or have the masternode create a new one | 2 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (Typical - State: `POOL_STATE_QUEUE`, Message: `MSG_NOERR`) -| 3 | | ← | [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) | Masternode notifies clients when it is ready to receive inputs -| 4 | [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) | → | | Upon receiving a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the Ready bit set, clients each provide a list of their inputs (unsigned), collateral, and a list of outputs where funds should be sent -| 5 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (typical - State: `POOL_STATE_ACCEPTING_ENTRIES`, Message: `MSG_ENTRIES_ADDED`) -| 6 | | ← | [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) | Masternode sends the final transaction containing all clients inputs (unsigned) and all client outputs to each client for verification -| 7 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (Typical - State: `POOL_STATE_SIGNING`, Message: `MSG_NOERR`) -| 8 | [`dss` message](../reference/p2p-network-privatesend-messages.md#dss) | → | | After verifying the final transaction, clients each sign their own inputs with the `SIGHASH_ALL \| SIGHASH_ANYONECANPAY` signature type and send them back -| 9 | | ← | [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc) | Masternode verifies the signed inputs, creates a [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) to broadcast the transaction, and notifies clients that the denominate transaction is complete (Typical - Message: `MSG_SUCCESS`) -| 10 | | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) | Masternode broadcasts a `dstx` inventory message -| 11 | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (dstx) | → | | (Optional) - -**Additional notes** +| 3 | | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) (dsq) | Masternode notifies clients when it is ready to receive inputs by sending a `dsq` inventory message +| 4 | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (dsq) | → | | Client requests a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) +| 5 | | ← | [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) | Masternode responds with the requested [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) +| 6 | [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) | → | | Upon receiving a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the Ready bit set, clients each provide a list of their inputs (unsigned), collateral, and a list of outputs where funds should be sent +| 7 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (typical - State: `POOL_STATE_ACCEPTING_ENTRIES`, Message: `MSG_ENTRIES_ADDED`) +| 8 | | ← | [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) | Masternode sends the final transaction containing all clients inputs (unsigned) and all client outputs to each client for verification +| 9 | | ← | [`dssu` message](../reference/p2p-network-privatesend-messages.md#dssu) | Masternode provides a pool status update (Typical - State: `POOL_STATE_SIGNING`, Message: `MSG_NOERR`) +| 10 | [`dss` message](../reference/p2p-network-privatesend-messages.md#dss) | → | | After verifying the final transaction, clients each sign their own inputs with the `SIGHASH_ALL \| SIGHASH_ANYONECANPAY` signature type and send them back +| 11 | | ← | [`dsc` message](../reference/p2p-network-privatesend-messages.md#dsc) | Masternode verifies the signed inputs, creates a [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) to broadcast the transaction, and notifies clients that the denominate transaction is complete (Typical - Message: `MSG_SUCCESS`) +| 12 | | ← | [`inv` message](../reference/p2p-network-data-messages.md#inv) | Masternode broadcasts a `dstx` inventory message +| 13 | [`getdata` message](../reference/p2p-network-data-messages.md#getdata) (dstx) | → | | (Optional) + +### Additional notes _**Step 0 - Pool Selection**_ @@ -82,34 +91,34 @@ _**Step 1 - Pool Request**_ * This transaction uses a collateral [input](../resources/glossary.md#input) created in the [Wallet Preparation](#wallet-preparation) phase * The collateral is a signed [transaction](../resources/glossary.md#transaction) that pays the collateral back to a client [address](../resources/glossary.md#address) minus a fee of 0.001 DASH -_**Step 3 - Queue**_ - -* A masternode broadcasts [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) when it starts a new queue. These message are relayed by all [peers](../resources/glossary.md#peer). -* As of protocol version 70214, sessions have a variable number of participants defined by the range `nPoolMinParticipants` ([3](https://github.com/dashpay/dash/blob/v0.15.0.0/src/chainparams.cpp#L360)) to `nPoolMaxParticipants` ([5](https://github.com/dashpay/dash/blob/v0.15.0.0/src/chainparams.cpp#L361)). Prior protocol version sessions always contained exactly 3 participants. Spork 22 introduced in Dash Core 0.16.0 expanded the maximum number of participants to 20 and also reduced the minimum number of participants to 2 for testnet/devnet/regtest networks. The spork was removed in Dash Core 0.17.0 which made the change permanent. -* The masternode sends a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the ready bit set once it has received valid [`dsa` messages](../reference/p2p-network-privatesend-messages.md#dsa) from either: - 1. The maximum number of clients (20) - 2. Greater than the minimum number of clients (3) and the timeout has been reached ([30 seconds](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.h#L23)) +_**Steps 3-5 - Queue**_ :::{attention} -Clients must respond to the Queue ready within 30 seconds or risk forfeiting the collateral they provided in the [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) (Step 1) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.h#L23)) +Clients must respond to the Queue ready within 30 seconds or risk forfeiting the collateral they provided in the [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) (Step 1) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/coinjoin.h#L43)) ::: -_**Step 4 - Inputs**_ +* When a masternode starts a new queue, it broadcasts an inventory message notifying all [peers](../resources/glossary.md#peer) of an available [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq). Interested clients can then request the full `dsq` message. Prior to protocol version 70234, `dsq` messages were directly relayed to all peers. +* Sessions have a variable number of participants defined by the range `nPoolMinParticipants` ([3](https://github.com/dashpay/dash/blob/v21.1.x/src/chainparams.cpp#L298) for mainnet, 2 for other networks) to `nPoolMaxParticipants` ([20](https://github.com/dashpay/dash/blob/v21.1.x/src/chainparams.cpp#L299)). +* The masternode sends an inventory message for a [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) with the ready bit set once it has received valid [`dsa` messages](../reference/p2p-network-privatesend-messages.md#dsa) from either: + 1. The maximum number of clients + 2. Greater than the minimum number of clients and the timeout has been reached ([30 seconds](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/coinjoin.h#L43)) + +_**Step 6 - Inputs**_ * The collateral transaction can be the same in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) as the one in the [`dsa` message](../reference/p2p-network-privatesend-messages.md#dsa) (Step 1) as long as it has not been spent -* Each client can provide up to 9 (`COINJOIN_ENTRY_MAX_SIZE`) inputs (and an equal number of outputs) to be used ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L29)) +* Each client can provide up to 9 (`COINJOIN_ENTRY_MAX_SIZE`) inputs (and an equal number of outputs) to be used ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/coinjoin.h#L46)) * This is the only message in the process that contains enough information to link a wallet's CoinJoin inputs with its outputs * This message is sent directly between a client and the masternode processing the session (not relayed across the Dash network) so no other clients see it -_**Step 6 - Final Transaction (unsigned)**_ +_**Step 8 - Final Transaction (unsigned)**_ * Once the masternode has received valid [`dsi` messages](../reference/p2p-network-privatesend-messages.md#dsi) from all clients, it creates the final transaction and sends a [`dsf` message](../reference/p2p-network-privatesend-messages.md#dsf) - * Inputs/outputs are ordered deterministically as defined by [BIP-69](https://github.com/dashevo/bips/blob/master/bip-0069.mediawiki#Abstract) to avoid leaking any data ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend-server.cpp#L271-L272)) - * Clients must sign their inputs to the Final Transaction within 15 seconds or risk forfeiting the collateral they provided in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) (Step 4) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/privatesend/privatesend.h#L24)) + * Inputs/outputs are ordered deterministically as defined by [BIP-69](https://github.com/dashevo/bips/blob/master/bip-0069.mediawiki#Abstract) to avoid leaking any data ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/server.cpp#L301-L302)) + * Clients must sign their inputs to the Final Transaction within 15 seconds or risk forfeiting the collateral they provided in the [`dsi` message](../reference/p2p-network-privatesend-messages.md#dsi) (Step 4) ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/coinjoin.h#L44)) -_**Step 10 - Final Transaction broadcast**_ +_**Step 12 - Final Transaction broadcast**_ -* Prior to protocol version 70213, masternodes could only send a single un-mined [`dstx` message](../reference/p2p-network-privatesend-messages.md#dstx) at a time. As of protocol version 70213, up to 5 (`MASTERNODE_MAX_MIXING_TXES`) un-mined [`dstx` messages](../reference/p2p-network-privatesend-messages.md#dstx) per masternode are allowed. ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.15.0.0/src/masternode/masternode-meta.h#L16)) +As of protocol version 70213, up to 5 (`MASTERNODE_MAX_MIXING_TXES`) un-mined [`dstx` messages](../reference/p2p-network-privatesend-messages.md#dstx) per masternode are allowed. ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/masternode/meta.h#L21)) _**General**_ @@ -119,8 +128,8 @@ _**General**_ **Processing Fees** -* If processing completes successfully, Dash Core charges the collateral randomly in 1/10 denominate transactions to pay miners ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.17.0.0/src/coinjoin/coinjoin-server.cpp#L427-L444)) -* Clients that abuse the system by failing to respond to [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) or [`dsf` messages](../reference/p2p-network-privatesend-messages.md#dsf) within the timeout periods may forfeit their collateral. Dash Core charges the abuse fee in 1/3 cases ([Dash Core Reference](https://github.com/dashpay/dash/blob/v0.17.0.0/src/coinjoin/coinjoin-server.cpp#L357-L374)) +* If processing completes successfully, Dash Core charges the collateral randomly in 1/10 denominate transactions to pay miners ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/server.cpp#L432-449)) +* Clients that abuse the system by failing to respond to [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) or [`dsf` messages](../reference/p2p-network-privatesend-messages.md#dsf) within the timeout periods may forfeit their collateral. Dash Core charges the abuse fee in 1/3 cases ([Dash Core Reference](https://github.com/dashpay/dash/blob/v21.1.x/src/coinjoin/server.cpp#L363-L381)) **Sending Fees** diff --git a/docs/core/reference/p2p-network-control-messages.md b/docs/core/reference/p2p-network-control-messages.md index 82d030da8..9da674f1b 100644 --- a/docs/core/reference/p2p-network-control-messages.md +++ b/docs/core/reference/p2p-network-control-messages.md @@ -411,7 +411,6 @@ sporks section](#removed-sporks) for a list of previously removed sporks. | 10018 | 19 | `SPORK_19_CHAINLOCKS_`
`ENABLED` | ***Updated in Dash Core 19.2.0***
Enable LLMQ-based ChainLocks. | 10020 | 21 | `SPORK_21_QUORUM_ALL_`
`CONNECTED` | *Added in Dash Core 0.16.0*
Enable connections between all masternodes in a quorum to optimize the signature recovery process.
Note: Prior to Dash Core 0.17.0 this spork also enforced [PoSe requirements](../guide/dash-features-proof-of-service.md#distributed-key-generation-participation-requirements) for masternodes to support a minimum protocol version and maintain open ports. | 10022 | 23 | `SPORK_23_QUORUM_POSE`
`CONNECTED` | *Added in Dash Core 0.17.0*
Enforce [PoSe requirements](../guide/dash-features-proof-of-service.md#distributed-key-generation-participation-requirements) for masternodes to support a minimum protocol version and maintain open ports. -| 10023 | 24 | `SPORK_24_TEST_EHF` | **Added in Dash Core 20.0.0** (*Testnet/Devnet/Regtest only*)
Enables quorums to sign and broadcast the `mnhfsignal` message that allows the fork to proceed **Spork 2 values** @@ -448,6 +447,7 @@ The following sporks were used in the past but are no longer necessary and have | :----------: | :----------: | ----------- | ----------- | | *10005* | *6* | `NEW_SIGS` | _Removed in Dash Core 0.16.0.
Turns on and off new signature format for Dash-specific messages.
Never enabled on mainnet. The associated logic was hardened in [PR 3662](https://github.com/dashpay/dash/pull/3662) to support testnet (where it is enabled). If testnet is reset at some point in the future, the remaining logic will be removed._ | *10021* | *22* | `SPORK_22_PS_MORE_`
`PARTICIPANTS` | *Removed in Dash Core 0.17.0*
*Increase the maximum number of participants in CoinJoin sessions.* +| *10023* | *24* | `SPORK_24_TEST_EHF` | **Removed in Dash Core 22.0.0** (*Testnet/Devnet/Regtest only*)
Enables quorums to sign and broadcast the `mnhfsignal` message that allows the fork to proceed ### Spork verification @@ -505,6 +505,8 @@ The following service identifiers have been assigned. | 0x08 | `NODE_XTHIN` | **Dash Core does not support this service**
This node supports Xtreme Thinblocks. | 0x40 | `NODE_COMPACT_FILTERS` | This node supports basic block filter requests. See [BIP157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) and [BIP158](https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki) for details on how this is implemented. | 0x400 | `NODE_NETWORK_LIMITED` | This is the same as `NODE_NETWORK` with the limitation of only serving the last 288 blocks. See [BIP159](https://github.com/bitcoin/bips/blob/master/bip-0159.mediawiki) for details on how this is implemented. *Not supported prior to Dash Core 0.16.0* +| 0x800 | `NODE_HEADERS_COMPRESSED` | This node supports compressed headers as described in [DIP-25](https://github.com/dashpay/dips/blob/master/dip-0025.md) +| 0x1000 | `NODE_P2P_V2` | This node supports the version 2 of the peer-to-peer protocol, which provides an encrypted transport protocol. See [BIP-324](https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki) for details. *Not supported prior to Dash Core 22.0.0* The following annotated hexdump shows a [`version` message](../reference/p2p-network-control-messages.md#version). (The message header has been omitted and the actual IP addresses have been replaced with [RFC5737](http://tools.ietf.org/html/rfc5737) reserved IP addresses.) diff --git a/docs/core/reference/p2p-network-data-messages.md b/docs/core/reference/p2p-network-data-messages.md index 08b488dce..cf06f7051 100644 --- a/docs/core/reference/p2p-network-data-messages.md +++ b/docs/core/reference/p2p-network-data-messages.md @@ -37,6 +37,7 @@ The currently-available type identifiers are: | 28 | MSG_QUORUM_RECOVERED_SIG | The hash is a long-living masternode quorum recovered signature.

**Note**: Only relayed to other masternodes in the same quorum and nodes that have sent a [`qwatch` message](../reference/p2p-network-quorum-messages.md#qwatch) as of Dash Core 0.17.0
_Added in 0.14.0_ | 29 | MSG_CLSIG | The hash is a ChainLock signature.
_Added in 0.14.0_ | 31 | MSG_ISDLOCK | The hash is an LLMQ-based deterministic InstantSend lock ([DIP22](https://github.com/dashpay/dips/blob/master/dip-0022.md)).
_Added in 18.0_ +| 32 | MSG_DSQ | The hash of a CoinJoin [dsq message](./p2p-network-privatesend-messages.md#dsq).
**Added in 22.0.0** **Deprecated Type Identifiers** @@ -381,11 +382,16 @@ The [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders) ## getheaders2 +:::{versionchanged} 70235 +Protocol version 70235 (Dash Core 22.0.0) expanded the maximum number of headers that this message +can request to 8000. +::: + _Added in protocol version 70223 of Dash Core._ The [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders2) requests a [`headers2` message](../reference/p2p-network-data-messages.md#headers2) that provides block headers starting from a particular point in the [block chain](../resources/glossary.md#block-chain). It allows a [peer](../resources/glossary.md#peer) which has been disconnected or started for the first time to get the [headers](../resources/glossary.md#header) it hasn’t seen yet. -The [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders2) contains the same fields as the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders). +The [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders2) contains the same fields as the [`getheaders` message](../reference/p2p-network-data-messages.md#getheaders). Since protocol version 70235, up to 8,000 headers can be requested at a time. ## getmnlistd @@ -477,13 +483,19 @@ fe9f0864 ........................... Nonce ## headers2 +:::{versionchanged} 70235 +Protocol version 70235 (Dash Core 22.0.0) expanded the maximum number of headers that this message +can send to 8000. +::: + _Added in protocol version 70223 of Dash Core._ + The [`headers2` message](../reference/p2p-network-data-messages.md#headers2) sends compressed block headers to a [node](../resources/glossary.md#node) which previously requested certain [headers](../resources/glossary.md#header) with a [`getheaders2` message](../reference/p2p-network-data-messages.md#getheaders) or indicated it wants to receive them by signaling with a [`sendheaders2` message](../reference/p2p-network-control-messages.md#sendheaders2). | Bytes | Name | Data Type | Description |----------|---------|------------------|----------------- -| _Varies_ | count | compactSize uint | Number of block headers up to a maximum of 2,000. Note: headers-first sync assumes the sending node will send the maximum number of headers whenever possible. +| _Varies_ | count | compactSize uint | Number of block headers up to a maximum of 8,000. Prior to protocol version 70235 (Dash Core 22.0.0), only 2,000 headers could be requested at a time. Note: headers-first sync assumes the sending node will send the maximum number of headers whenever possible. | _Varies_ | headers | block_header2 | Block headers in the [`block_header2`](https://github.com/thephez/dips/blob/compressed-headers/compressed-headers.md#block_header2-data-type) format
**Note**: the first header will always be uncompressed. The following annotated hexdump shows a [`headers2` message](../reference/p2p-network-data-messages.md#headers2). (The message header has been omitted.) diff --git a/docs/core/reference/p2p-network-privatesend-messages.md b/docs/core/reference/p2p-network-privatesend-messages.md index e6064e74c..903f2b95c 100644 --- a/docs/core/reference/p2p-network-privatesend-messages.md +++ b/docs/core/reference/p2p-network-privatesend-messages.md @@ -305,6 +305,13 @@ User outputs ## dsq +:::{attention} +Since protocol version 70234 (Dash Core 22.0.0), the [`dsq` +message](../reference/p2p-network-privatesend-messages.md#dsq) is broadcast using the inventory +system instead of being relayed to all connected peers. This reduces the bandwidth needs for all +nodes, especially highly connected masternodes. +::: + The [`dsq` message](../reference/p2p-network-privatesend-messages.md#dsq) provides [nodes](../resources/glossary.md#node) with queue details and notifies them when to sign final transaction messages. If the message indicates the queue is not ready, the node verifies the message is valid. It also verifies that the [masternode](../resources/glossary.md#masternode) is not flooding the [network](../resources/glossary.md#network) with [`dsq` messages](../reference/p2p-network-privatesend-messages.md#dsq) in an attempt to dominate the queuing process. It then relays the message to its connected [peers](../resources/glossary.md#peer). @@ -319,7 +326,7 @@ If the message indicates the queue is ready, the node responds with a [`dsi` mes | 1 | fReady | bool | Required | Indicates if the pool is ready to be executed | 97 | vchSig | char[] | Required | BLS Signature of this message by masternode verifiable via pubKeyMasternode (Length (1 byte) + Signature (96 bytes))
**Note**: serialized using the basic BLS scheme after Dash 19.0 activation -Denominations (per [`src/coinjoin.cpp`](https://github.com/dashpay/dash/blob/v0.16.x/src/privatesend/privatesend.cpp#L316-L336)) +Denominations (per [`src/coinjoin/common.h`](https://github.com/dashpay/dash/blob/v21.0.x/src/coinjoin/common.h#L38-L44)) | Value | Denomination |------|-------------- diff --git a/docs/core/reference/p2p-network-protocol-versions.md b/docs/core/reference/p2p-network-protocol-versions.md index 0e9c938a1..64b33242f 100644 --- a/docs/core/reference/p2p-network-protocol-versions.md +++ b/docs/core/reference/p2p-network-protocol-versions.md @@ -10,10 +10,11 @@ The table below lists some notable versions of the P2P network protocol, with the most recent versions listed first. -As of Dash Core 21.1, the most recent protocol version is 70233. +As of Dash Core 22.0, the most recent protocol version is 70235. | Version | Initial Release | Major Changes |---------|------------------------------------|-------------- +| 70235 | [Dash Core 22.0](https://github.com/dashpay/dash/blob/v22.0.0/doc/release-notes.md)
(Nov 2024) | • [DSQ via inventory](https://github.com/dashpay/dash/pull/6148)
• [Support 8000 compressed headers per request](https://github.com/dashpay/dash/pull/6239/) | 70233 | [Dash Core 21.1](https://github.com/dashpay/dash/blob/v21.1.0/doc/release-notes.md)
(Aug 2024) | • [Enhanced hard fork update](https://github.com/dashpay/dash/pull/6175) | 70232 | [Dash Core 21.0](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md)
(Jul 2024) | • Masternode reward location reallocation
• Mainnet spork hardening
• Experimental descriptor wallet support | 70231 | [Dash Core 20.1](https://github.com/dashpay/dash/blob/v20.1.0/doc/release-notes.md)
(Mar 2024) | • HD wallets by default
• Legacy InstantSend deprecated (`islock` p2p and inv messages) diff --git a/docs/core/reference/transactions-special-transactions.md b/docs/core/reference/transactions-special-transactions.md index b716382cb..fb9b04d80 100644 --- a/docs/core/reference/transactions-special-transactions.md +++ b/docs/core/reference/transactions-special-transactions.md @@ -1214,8 +1214,26 @@ The JSON representation of a raw transaction can be obtained with the [`getrawtr "assetLockTx": { "version": 1, "creditOutputs": [ - "CTxOut(nValue=1.00000000, scriptPubKey=76a9147c75beb097957cc09537b615)", - "CTxOut(nValue=9.00141421, scriptPubKey=76a9147c75beb097957cc09537b615)" + { + "value": 1.00000000, + "valueSat": 100000000, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 7c75beb097957cc09537b615dde9ea6807719cdf OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9147c75beb097957cc09537b615dde9ea6807719cdf88ac", + "address": "yXfXh3jFYHHxnJZVsXnPcktCENqPaAhcX1", + "type": "pubkeyhash" + } + }, + { + "value": 9.00141421, + "valueSat": 900141421, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 7c75beb097957cc09537b615dde9ea6807719cdf OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9147c75beb097957cc09537b615dde9ea6807719cdf88ac", + "address": "yXfXh3jFYHHxnJZVsXnPcktCENqPaAhcX1", + "type": "pubkeyhash" + } + } ] } } From 648e064efb06204d69d9fbc4ba5bd15288d548e4 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 7 Nov 2024 16:43:33 -0500 Subject: [PATCH 05/14] docs: misc core migration cleanup (#419) * ci: add script to handle dip processing * fix: correct path * chore: add markdown lint config --- .markdownlint.json | 10 +++++++ conf.py | 11 +++++++ scripts/dip-format.sh | 69 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 .markdownlint.json create mode 100755 scripts/dip-format.sh diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 000000000..f04743b5a --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,10 @@ +{ + "default": true, + "MD004": { "style": "asterisk"}, + "MD013": false, + "MD033": false, + "MD036": false, + "MD040": true, + "MD041": false, + "MD049": true +} diff --git a/conf.py b/conf.py index 729c97e81..8ad6bc01e 100644 --- a/conf.py +++ b/conf.py @@ -20,6 +20,17 @@ # import sys # sys.path.insert(0, os.path.abspath('.')) +import os +import subprocess +os.chdir(os.path.dirname(os.path.abspath(__file__))) + +# Clone the DIPs repository and process DIPs so they are rendered properly +if not os.path.exists('_external_repo'): + subprocess.check_call(['git', 'clone', 'https://github.com/dashpay/dips.git', '_dips']) + subprocess.check_call(['./scripts/dip-format.sh']) + subprocess.check_call('cd _dips/ && find . -name ".git" -prune -o -print -exec cp --parents \{} ../docs/core/dips/ \;', shell=True) + subprocess.check_call('cd', shell=True) + subprocess.check_call('rm -rf _dips/', shell=True) # -- General configuration ------------------------------------------------ diff --git a/scripts/dip-format.sh b/scripts/dip-format.sh new file mode 100755 index 000000000..adf640926 --- /dev/null +++ b/scripts/dip-format.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# Directory containing the files +dir='_dips' + +echo "Starting to process files in $dir..." + +# Add start of toctree +content=$(cat <> "$dir"/README.md + +for filename in "$dir"/*.md; do + if [ $(basename "$filename") = "README.md" ] + then + echo "Skipping README.md" + continue + fi + + echo "Processing $filename..." + + # Extract DIP number + full_dip_num=$(grep '^\s*DIP:' "$filename" | awk -F: '{print $2}' | sed 's/^ *//' | tr -d '\r') + dip="${full_dip_num#"${full_dip_num%%[!0]*}"}" + + # Extract title + title=$(grep '^\s*Title:' "$filename" | awk -F: '{print $2}' | sed 's/^ *//' | tr -d '\r') + + # Combine to make heading + heading="# $dip - $title" + echo "Heading $heading..." + + # Create temp file + tempfile=$(mktemp) + + # Write heading to temp file + echo -e "$heading\n" > "$tempfile" + + # Append original file contents to temp file + cat "$filename" >> "$tempfile" + + # Move temp file to original file + mv "$tempfile" "$filename" + + # Write the filename to the toctree + echo "dip-$full_dip_num" >> "$dir"/README.md +done + +# Close out the toctree +closing_content=$(cat <> "$dir"/README.md + +# Output the updated readme +cat "$dir"/README.md + +echo "Finished processing files." From d46f9eeb73e4e8b733b0affa00d1a47a71c7ef7e Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 12 Nov 2024 15:36:31 -0500 Subject: [PATCH 06/14] docs(rpc): whitelist and external queue updates (#420) * docs(api): update whitelist description * docs(rpc): deprecate platform user Related to dashpay/dash#6209 * docs(rpc): change example formatting * docs(rpc): add rpc queue info Describes the new "external user" queue from dashpay/dash#6045 * fix(rpc): correct code block type * style: filename * docs(rpc): link to whitelist settings from deprecated platform-user section --- docs/core/api/remote-procedure-calls.md | 36 ++++++++++++++++++++----- docs/core/api/zmq.md | 2 +- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/docs/core/api/remote-procedure-calls.md b/docs/core/api/remote-procedure-calls.md index 07a988775..f8c2a2cc5 100644 --- a/docs/core/api/remote-procedure-calls.md +++ b/docs/core/api/remote-procedure-calls.md @@ -27,7 +27,7 @@ The interface requires the user to provide a password for authenticating RPC req ### RPC-Auth Security -Alternatively, the authentication details can be provided using the `rpcauth` property. This removes the need to include a plaintext password in the dash.conf file by instead including a salt and hash of the password along with a username in the format: +Alternatively, the authentication details can be provided using the `rpcauth` property. This removes the need to include a plaintext password in the `dash.conf` file by instead including a salt and hash of the password along with a username in the format: `:$` ``` shell @@ -53,11 +53,13 @@ Your password: The RPC whitelist system can limit certain RPC users to only have access to some RPC calls. The system is configured by specifying the following two parameters in the `dash.conf` file or by setting them as program arguments on the command line: * `rpcwhitelist`: set a whitelist to filter incoming RPC calls for a specific user. The field comes in the format: `:,,...,`. If multiple whitelists are set for a given user, they are set-intersected. Default whitelist behavior is defined by `rpcwhitelistdefault`. -* `rpcwhitelistdefault`: sets default behavior for RPC whitelisting. Unless `rpcwhitelistdefault` is set to `0`, if any `rpcwhitelist` is set, the RPC server acts as if all RPC users are subject to empty-unless-otherwise-specified whitelists. If `rpcwhitelistdefault` is set to `1` and no `rpcwhitelist` is set, the RPC server acts as if all RPC users are subject to empty whitelists. +* `rpcwhitelistdefault`: sets default behavior for RPC whitelisting. + * If `rpcwhitelistdefault` is set to `0`, users with an `rpcwhitelist` entry are limited to their assigned RPCs. Other users can access any RPC. + * If `rpcwhitelistdefault` is set to `1`, RPC access is denied to all users that do not have an `rpcwhitelist` entry. Example configuration -```text +```ini rpcauth=user1:4cc74397d6e9972e5ee7671fd241$11849357f26a5be7809c68a032bc2b16ab5dcf6348ef3ed1cf30dae47b8bcc71 rpcauth=user2:181b4a25317bff60f3749adee7d6bca0$d9c331474f1322975fa170a2ffbcb176ba11644211746b27c1d317f265dd4ada rpcauth=user3:a6c8a511b53b1edcf69c36984985e$13cfba0e626db19061c9d61fa58e712d0319c11db97ad845fa84517f454f6675 @@ -72,11 +74,11 @@ In this example, user1 can only call `getnetworkinfo`, user2 can only call `getn ### Restricted Access Users -:::{note} -This feature is only available on masternodes -::: +All RPC request restrictions are now configured using the [RPC whitelist settings](#rpc-whitelist). + +:::{deprecated} 22.0.0
-As of Dash Core 0.17.0, an option is provided to add an RPC user that is restricted to a small subset of RPCs that will be used by Dash Platform. The `platform-user` configuration value sets the name of the RPC user to be restricted. +Since Dash Core 0.17.0, an option is provided to add an RPC user that is restricted to a small subset of RPCs used by Dash Platform. The `platform-user` configuration value sets the name of the RPC user to be restricted. The `platform-user` configuration value must be set to a previously configured [rpcauth user](#rpc-auth-security). @@ -90,6 +92,26 @@ Only the following RPCs are accessible to the restricted user: * [`quorum verify`](../api/remote-procedure-calls-evo.md#quorum-verify) * [`verifyislock`](../api/remote-procedure-calls-evo.md#verifyislock) +::: + +### RPC Queue Priority + +Nodes receiving too many RPC requests may become unresponsive or be banned if the load continues for too long. To mitigate this, Dash Core 21.0.0 introduced an additional RPC queue that can be used for lower-priority requests. If the node becomes overloaded, low priority requests are dropped so more important requests continue to receive responses. + +The system is configured by specifying the following parameters in the `dash.conf` file or by setting them as program arguments on the command line: + +* `rpcexternaluser`: list of comma-separated usernames for JSON-RPC external connections. If not specified, all requests use a single queue. +* `rpcexternalworkqueue`=: - Set the depth of the work queue to service external RPC calls (default: 16) + +Example configuration + +```ini +rpcexternaluser=external_user_1,external_user_2 +rpcexternalworkqueue=32 +``` + +In this example, requests from external_user_1 and external_user_2 will go to the lower-priority queue, while all other user request will go to the standard queue. + ### Default Connection Info The Dash Core RPC service listens for HTTP `POST` requests on port 9998 in [mainnet](../resources/glossary.md#mainnet) mode, 19998 in [testnet](../resources/glossary.md#testnet), or 19898 in [regression test mode](../resources/glossary.md#regression-test-mode). The port number can be changed by setting `rpcport` in `dash.conf`. By default the RPC service binds to your server's [localhost](https://en.wikipedia.org/wiki/Localhost) loopback network interface so it's not accessible from other servers. Authentication is implemented using [HTTP basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). RPC HTTP requests must include a `Content-Type` header set to `text/plain` and a `Content-Length` header set to the size of the request body. diff --git a/docs/core/api/zmq.md b/docs/core/api/zmq.md index c6fb85d2b..5cf663f18 100644 --- a/docs/core/api/zmq.md +++ b/docs/core/api/zmq.md @@ -83,7 +83,7 @@ $ dashd -zmqpubhashtx=tcp://127.0.0.1:28332 \ ### Config File -```conf +```ini # ZMQ zmqpubhashtx=tcp://0.0.0.0:28332 zmqpubrawtx=tcp://0.0.0.0:28332 From 613bb3f787f28e88b3ed2645afe0f63c7a1a1cf9 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 20 Nov 2024 09:43:22 -0500 Subject: [PATCH 07/14] docs: update protocol version table --- docs/core/reference/p2p-network-protocol-versions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/reference/p2p-network-protocol-versions.md b/docs/core/reference/p2p-network-protocol-versions.md index 64b33242f..1f93345a2 100644 --- a/docs/core/reference/p2p-network-protocol-versions.md +++ b/docs/core/reference/p2p-network-protocol-versions.md @@ -14,7 +14,7 @@ As of Dash Core 22.0, the most recent protocol version is 70235. | Version | Initial Release | Major Changes |---------|------------------------------------|-------------- -| 70235 | [Dash Core 22.0](https://github.com/dashpay/dash/blob/v22.0.0/doc/release-notes.md)
(Nov 2024) | • [DSQ via inventory](https://github.com/dashpay/dash/pull/6148)
• [Support 8000 compressed headers per request](https://github.com/dashpay/dash/pull/6239/) +| 70235 | [Dash Core 22.0](https://github.com/dashpay/dash/blob/v22.0.0/doc/release-notes.md)
(Nov 2024) | • [P2P protocol encryption (BIP 324)](https://github.com/dashpay/dash-issues/issues/7)
• [DSQ via inventory](https://github.com/dashpay/dash/pull/6148)
• [Support 8000 compressed headers per request](https://github.com/dashpay/dash/pull/6239/) | 70233 | [Dash Core 21.1](https://github.com/dashpay/dash/blob/v21.1.0/doc/release-notes.md)
(Aug 2024) | • [Enhanced hard fork update](https://github.com/dashpay/dash/pull/6175) | 70232 | [Dash Core 21.0](https://github.com/dashpay/dash/blob/v21.0.0/doc/release-notes.md)
(Jul 2024) | • Masternode reward location reallocation
• Mainnet spork hardening
• Experimental descriptor wallet support | 70231 | [Dash Core 20.1](https://github.com/dashpay/dash/blob/v20.1.0/doc/release-notes.md)
(Mar 2024) | • HD wallets by default
• Legacy InstantSend deprecated (`islock` p2p and inv messages) From c4dd1674f9ed97df815210d0a397b505d96f15bc Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 25 Nov 2024 12:16:35 -0500 Subject: [PATCH 08/14] docs: misc updates (#429) * docs: small fee correction * docs: reward allocation update Clarify MN reward breakdown --- ...ransactions-transaction-fees-and-change.md | 4 +- docs/user/introduction/features.rst | 43 ++++++++++--------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/core/guide/transactions-transaction-fees-and-change.md b/docs/core/guide/transactions-transaction-fees-and-change.md index a60efe2a3..f226e243b 100644 --- a/docs/core/guide/transactions-transaction-fees-and-change.md +++ b/docs/core/guide/transactions-transaction-fees-and-change.md @@ -6,11 +6,11 @@ # Transaction Fees and Change -Transactions pay fees based on the total byte size of the signed transaction. Fees per byte are calculated based on current demand for space in mined blocks with fees rising as demand increases. The [transaction fee](../resources/glossary.md#transaction-fee) is split between the miner (25%) and masternode (75%), as explained in the [block reward allocation section](https://docs.dash.org/en/stable/docs/user/introduction/features.html#block-reward-allocation). It is ultimately up to each [miner](../resources/glossary.md#miner) to choose the minimum transaction fee they will accept. +Transactions pay fees based on the total byte size of the signed transaction. Fees per byte are calculated based on current demand for space in mined blocks with fees rising as demand increases. The [transaction fee](../resources/glossary.md#transaction-fee) is split between the miner (25%) and masternode (75%), as explained in the [block reward allocation section](../../user/introduction/features.rst#block-reward-allocation). It is ultimately up to each [miner](../resources/glossary.md#miner) to choose the minimum transaction fee they will accept. All transactions are prioritized based on their fee per byte, with higher-paying transactions being added in sequence until all of the available space is filled. -As of Dash Core 0.12.2.x, a [minimum relay fee](../resources/glossary.md#minimum-relay-fee) (1,000 [duffs](../resources/glossary.md#duffs) following [DIP1](https://github.com/dashpay/dips/blob/master/dip-0001.md) activation) is required to broadcast a transaction across the [network](../resources/glossary.md#network). Any transaction paying only the minimum fee should be prepared to wait a long time before there's enough spare space in a block to include it. +As of Dash Core 0.12.2.x, a [minimum relay fee](../resources/glossary.md#minimum-relay-fee) (1,000 [duffs](../resources/glossary.md#duffs)/KB following [DIP1](https://github.com/dashpay/dips/blob/master/dip-0001.md) activation) is required to broadcast a transaction across the [network](../resources/glossary.md#network). Any transaction paying only the minimum fee should be prepared to wait a long time before there's enough spare space in a block to include it. Since each transaction spends Unspent Transaction Outputs (UTXOs) and because a UTXO can only be spent once, the full value of the included UTXOs must be spent or given to a miner as a [transaction fee](../resources/glossary.md#transaction-fee). Few people will have UTXOs that exactly match the amount they want to pay, so most transactions include a change output. diff --git a/docs/user/introduction/features.rst b/docs/user/introduction/features.rst index fc8d451f5..33967baf6 100644 --- a/docs/user/introduction/features.rst +++ b/docs/user/introduction/features.rst @@ -429,16 +429,24 @@ the winning proposals in the budget system. Depending on budget utilization, this results in an approximate coin allocation over a budget cycle as follows: -+-----+----------------------------------------+ -| 80% | Mining and Masternode Reward | -+-----+----------------------------------------+ -| 20% | Decentralized Governance Budget | -+-----+----------------------------------------+ - -When the Dash Core v20 hard fork activates, Dash's governance budget will grow -to 20% of the block subsidy per the governance proposal approved in September -2023. Additional details can be found in the :ref:`Treasury expansion section -`. +.. _block-reward-table: + ++------------+--------------------------------------------------------------------+ +| Percentage | Usage | ++============+====================================================================+ +| 20% | Mining Reward | ++------------+--------------------------------------------------------------------+ +| 20% | Decentralized Governance Budget | ++------------+--------------------------------------------------------------------+ +| 60% | Masternode Reward | +| | | +| | - 62.5%: Paid to all masternode types on the Core chain | +| | - 37.5%: Allocated to the Platform credit pool to pay evonodes | ++------------+--------------------------------------------------------------------+ + +The masternode reward division supports both regular masternodes and Evolution masternodes +(evonodes). This allocation ensures that evonodes, which require higher collateral and provide +additional services, receive appropriate compensation. .. _block-subsidy-reallocation-treasury-expansion: @@ -448,17 +456,10 @@ Treasury expansion In September of 2023, the Dash network approved a `proposal `__ to double the governance budget by modifying the block subsidy allocation. The new allocation -designates 20% for miners, 20% for the governance system budget, and 60% for -masternodes. The expansion will go into effect upon activation of the Dash Core -v20 hard fork. - -+-----+----------------------------------------+ -| 20% | Mining Reward | -+-----+----------------------------------------+ -| 20% | Decentralized Governance Budget | -+-----+----------------------------------------+ -| 60% | Masternode Reward | -+-----+----------------------------------------+ +designated 20% for miners, 20% for the governance system budget, and 60% for +masternodes. The expansion went into effect upon activation of the Dash Core +v20 hard fork. See the :ref:`block reward table ` for the +current details. Miner and masternode reallocation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 6c043d6e307085817a307f6dd52a63e403eb1454 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 4 Dec 2024 16:57:40 -0500 Subject: [PATCH 09/14] docs: clarify transifex readme --- transifex/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/transifex/README.md b/transifex/README.md index d7597500a..99faf7ded 100644 --- a/transifex/README.md +++ b/transifex/README.md @@ -49,6 +49,9 @@ Run the following from the root of the project to upload to Transifex: ./transifex/pushtx.sh ``` +**Note**: do not commit the *.po file changes created by the pushtx script. Those files should only be +committed after [pulling the latest changes](#to-retrieve-from-transifex). + ### To retrieve from Transifex Next run the following to retrieve the translation updates: From 0b19995b30bd54b854e948e33f4cb9f8e5ec7043 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 9 Dec 2024 10:05:08 -0500 Subject: [PATCH 10/14] chore: update insight URLs (#438) Several old links were being used --- _templates/sidebar-main.html | 2 +- docs/core/guide/dash-features-chainlocks.md | 2 +- docs/core/guide/dash-features-coinjoin.md | 6 +++--- docs/core/index.md | 4 ++-- docs/user/developers/testnet.rst | 1 - docs/user/masternodes/maintenance.rst | 6 +++--- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/_templates/sidebar-main.html b/_templates/sidebar-main.html index 56ad99526..4c5ee09aa 100644 --- a/_templates/sidebar-main.html +++ b/_templates/sidebar-main.html @@ -153,7 +153,7 @@
  • Mainnet Block Explorer
  • Testnet Block + href="https://insight.testnet.networks.dash.org:3002/insight/">Testnet Block Explorer
  • Testnet Faucet
  • diff --git a/docs/core/guide/dash-features-chainlocks.md b/docs/core/guide/dash-features-chainlocks.md index 1b5f63fc6..48fb4a489 100644 --- a/docs/core/guide/dash-features-chainlocks.md +++ b/docs/core/guide/dash-features-chainlocks.md @@ -15,4 +15,4 @@ If a valid [`clsig` message](../reference/p2p-network-instantsend-messages.md#cl With LLMQ-based [InstantSend](../resources/glossary.md#instantsend), a ChainLock is only attempted once all [transactions](../resources/glossary.md#transaction) in the block are locked via InstantSend. If a block contains unlocked transactions, retroactive InstantSend locks are established prior to a ChainLock. -ChainLocks have been active on the Dash network since block 1088640 in June of 2019. Please read [DIP8 ChainLocks](https://github.com/dashpay/dips/blob/master/dip-0008.md) for additional details. +ChainLocks have been active on the Dash network since block 1088640 in June of 2019. Please read [DIP8 ChainLocks](https://github.com/dashpay/dips/blob/master/dip-0008.md) for additional details. diff --git a/docs/core/guide/dash-features-coinjoin.md b/docs/core/guide/dash-features-coinjoin.md index a75980da1..94040f981 100644 --- a/docs/core/guide/dash-features-coinjoin.md +++ b/docs/core/guide/dash-features-coinjoin.md @@ -36,7 +36,7 @@ The CoinJoin denominations include a bit mapping to easily differentiate them. T Protocol version 70213 added a 5th denomination (0.001 DASH). -[Example Testnet denomination creation transaction](https://testnet-insight.dashevo.org/insight/tx/f0174fc87d68a18617c2990df4d9455c0459c601d2d6473934357a66f9b8b70a) +[Example Testnet denomination creation transaction](https://insight.testnet.networks.dash.org:3002/insight/tx/f0174fc87d68a18617c2990df4d9455c0459c601d2d6473934357a66f9b8b70a) **Creating Collaterals** @@ -44,9 +44,9 @@ Collaterals are used to pay CoinJoin fees, but are kept separate from the denomi In protocol versions > 70208, Dash Core can use any [input](../resources/glossary.md#input) from 1x the minimum collateral amount to the maximum collateral amount. -[Example Testnet collateral creation transaction](https://testnet-insight.dashevo.org/insight/tx/8f9b15973983876f7ce4eb2c32b09690dfb0432d2caf6c6df516196a8d17689f) +[Example Testnet collateral creation transaction](https://insight.testnet.networks.dash.org:3002/insight/tx/8f9b15973983876f7ce4eb2c32b09690dfb0432d2caf6c6df516196a8d17689f) -[Example Testnet collateral payment transaction](https://testnet-insight.dashevo.org/insight/tx/de51e6f7c5ef75aad0dbb0a808ef4873d7ef6d67b25f3a658d5a241db4f3eeeb) +[Example Testnet collateral payment transaction](https://insight.testnet.networks.dash.org:3002/insight/tx/de51e6f7c5ef75aad0dbb0a808ef4873d7ef6d67b25f3a658d5a241db4f3eeeb) ## CoinJoin Processing diff --git a/docs/core/index.md b/docs/core/index.md index e1db133b3..154d24791 100644 --- a/docs/core/index.md +++ b/docs/core/index.md @@ -147,8 +147,8 @@ dashcore/wallet-configuration-file :hidden: resources/glossary -Mainnet Block Explorer -Testnet Block Explorer +Mainnet Block Explorer +Testnet Block Explorer Testnet Faucet API Services SDK Resources diff --git a/docs/user/developers/testnet.rst b/docs/user/developers/testnet.rst index b0fb7a38f..acab9b870 100644 --- a/docs/user/developers/testnet.rst +++ b/docs/user/developers/testnet.rst @@ -64,7 +64,6 @@ Faucets Explorers --------- -- https://testnet-insight.dashevo.org/insight - https://insight.testnet.networks.dash.org:3002/insight - http://insight.testnet.networks.dash.org:3001/insight diff --git a/docs/user/masternodes/maintenance.rst b/docs/user/masternodes/maintenance.rst index eb92cf84c..55e436fda 100644 --- a/docs/user/masternodes/maintenance.rst +++ b/docs/user/masternodes/maintenance.rst @@ -506,9 +506,9 @@ the Dash network. at `explorer.dash.org `__ and `insight.dash.org `__. - `Trezor `__ operates a `blockchain explorer `__ powered by a `Dash fork - `__ of `insight - `__, an advanced blockchain API tool + ://dash1.trezor.io/>`__ powered by a `Dash fork + `__ of insight, + an advanced blockchain API tool Dash Masternode Tool -------------------- From d1bdc8df05267f86083e0d9e546c5c4761824959 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 11 Dec 2024 10:01:07 -0500 Subject: [PATCH 11/14] docs(wallet): add android username voting (#440) * chore: add and update some screenshots * docs(wallet): add android username voting * docs: add missing image --- .../wallets/android/advanced-functions.rst | 36 ++++++++++++++++++ .../wallets/android/img/android-login.jpg | Bin 0 -> 101130 bytes .../user/wallets/android/img/android-main.jpg | Bin 0 -> 69414 bytes docs/user/wallets/android/img/menu-tools.jpg | Bin 158317 -> 62703 bytes docs/user/wallets/android/img/menu.jpg | Bin 280765 -> 83469 bytes .../android/img/voting-key-request.jpg | Bin 0 -> 45095 bytes docs/user/wallets/android/img/voting-main.jpg | Bin 0 -> 130168 bytes .../android/img/voting-name-details.jpg | Bin 0 -> 101527 bytes docs/user/wallets/android/index.rst | 4 +- 9 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 docs/user/wallets/android/img/android-login.jpg create mode 100644 docs/user/wallets/android/img/android-main.jpg create mode 100644 docs/user/wallets/android/img/voting-key-request.jpg create mode 100644 docs/user/wallets/android/img/voting-main.jpg create mode 100644 docs/user/wallets/android/img/voting-name-details.jpg diff --git a/docs/user/wallets/android/advanced-functions.rst b/docs/user/wallets/android/advanced-functions.rst index 6fff93a2e..e053a5a7b 100644 --- a/docs/user/wallets/android/advanced-functions.rst +++ b/docs/user/wallets/android/advanced-functions.rst @@ -94,6 +94,42 @@ keys, tap the **+** button. *Viewing and generating masternode keys* +Username voting +--------------- + +Premium Dash usernames go through a voting period before being distributed. These names require a +two-week waiting period during which masternodes and evonodes vote to determine who (if anyone) +receives the name. + +.. tip:: + + See the :ref:`Username FAQ ` for more detailed information about + usernames. + +To access username voting, tap the **Menu button** and select **Username Voting** to open the +Username Voting screen. From here, tap on any of the listed usernames to view more details or vote +on the name. + +By default, only usernames that have been requested by more than one identity are displayed. Tap +**Filter** to adjust which usernames are shown. + +.. image:: img/menu.jpg + :width: 160 px +.. image:: img/voting-main.jpg + :width: 160 px +.. image:: img/voting-name-details.jpg + :width: 160 px + +Enter voting key +^^^^^^^^^^^^^^^^ + +If you own a masternode or evonode and want to vote for usernames using the Android wallet, enter +your voting private key when requested by the wallet. + +.. image:: img/voting-key-request.jpg + :width: 160 px + + Sweep paper wallet ------------------ diff --git a/docs/user/wallets/android/img/android-login.jpg b/docs/user/wallets/android/img/android-login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5295fc6cf46618d3c16b9633909409404201aa27 GIT binary patch literal 101130 zcmcG#2UL?m(=Zwp5fBRsNKruo2%+~PMJb_!2@nV%2!!67bWkZ$LMQYhgaDyRmo6Z^ zL+Bj=Ap+7t>W#ktcfRjG=fCHkd(OR+lYJ($^UTcd&a>IwndfTqY7uZ>8LR{bT)PGU zTqAq{SIgJglw@U%UPCp&N~-ezDz4K22tdRO0NB~PIzts?7j{k-K zAFc$sN8^8`0|293|A+ejClV>b%*B+zv_ts1Iun!=j71P|N{j#C9)EF@|KP~KxU&{i zmca9wfU{Zr58UK`;O?%Dt^}U0zx<|-&VTV)0xn@^>-JaIU-)Y=xtYDTCgG|}_&x@> z0H6Q`fD8fu{}leaKOM3G0MSDL;70U+(@c^9fSMoxfM)u?Y0RGifO~-eK=q)bv9s|% zV~7alb#rq7U@s2{23kMao}!_y~p zj~_EKb3bQf;sic^%qGIl$;&4wD9G?!Oj49zf?Gh4|F4j1q@<+ex5;Vl+@axr_V^k9 z|7*DV2B07z0o+Krag7OZo#NUJifdQj2@SXgxPIf>U(fz8xOV*p(M{r8B!pVi`+)1$ zZV-OoxOJD5l$hxHZNT4Jikr`fAMo9J_zJ>g>_kb${~;ze?hy@82CAiP;+j=fJ~B!z zAS5i}?9wt!!ptHkuL=9uDu~FgSlVHIE*k*WF^%7KYg-mIdl!f%D4`{2{|o=6pK$$W z0-=hT;$H>9z<);m<+w(1{Tbhl2L#ppL=TN+oUWz;IN*T`dwKxF0Zy4N8@pFh2S{_SJvGi3B6 zd3;)|Tup#s&Mx&$Ypoe<|JRZqk7~VBk@9IND1#ZefMw3g&*!lRi)!MY!q138a3O)b z2nZ+oqfEhYm^qv#r|x5!VjEBpsah6>CYVx`k0mN6VSMn4%2FYDaiOMq%^MAyGqLEWoSJgf687aH*%^`(@Ht#H3=vdf#e2 zxqWd@bCfIJzz9B8gLzY>hSPQKd{cLlwg(W0)e#qaTIp>E1zG722Nq}*{0Pa%B-V?4 z2E3?KxMefF+FZwJ`&|4f)pNF1p2?N*mrFO$g_e35L3)C29O4Oki7gIyR3^v!N>JI> zdUI`Axzk!-Q{X=JY-jpY*FN8q$2y8oY{1HE>qaeR+s&bQqPW$gy_$f5_XINm6wFMD zf1Tha+@y$1B`Zv|Ti_v_tWE6g_naAiT!2ZsOvfSRZ3%o19yErgTv*?IdSqKkDQtoxTE{IjAC&$WA?jQ?T z;vFN4kMH8A%~Ngi=clx?Y}_-}Tw2#o>PnGus*)w{&~v!oC9Pn_>I2j*ZKb zdV_LVEGV)Ob+lns8qa{O6w&69L+z)>%gt$@Yo!eQJ#~GuP!_|7OB3A%XI;GUa`bw+MYYC79Gn)GVer%K`E4dRM(XG(T7<&f* zAUs%J>I^@~&P8&^v&>9wI0{f=V`IAe%C||4dBUX`Wcxqf%Xt^%u6G3pI5FH_^Evzl zb-{9)a&>SWNPs_K+Z4vIM(QK!)43V!+9zC9feT-b9y^@3EirUo0X9PSmu`(8aI@h& z5`#{1bsBN(!{sR$Wu%xX(Gm~x52sUKZ3Xgo!207G=flgtyH-!*qLzyFUpJ0e zS_*PNenRq`f2OZYtI+QL`V;kP+7Ihwft^~fcC&D>vU8x$Qa8ZXpq5r*esC6Z+q$KT z>%1GwXCKcKJ^tdf7R5hjQ6MR8y=#Mvv$4|Gv^vjuLa!2*CO^fRU781~I>0yJ3N$>K zznq@YE6~k^ZB;hi&{I#s59128oNJ2`_{)zprUKnWb%r(zLoK-Cb4L99kQ%r0Hjec$ z7aSbo>KL!`Riw^_-{(^IDZ{LM*s}Qe7>9PD8HcBGrL|HINAA;~!DHG~h4UOf?vm$! z_*N4GW`BuPH{8j>Ep2fZS>tQ?t^iVXQPZqVWP4KYbl?9S4#Er$0A!QCA$dylKs$B{ zc9YqZyXQ-RP=X-^`!XVg_Q7nq98=2!k}l$$LLy;e_Cv8mju8uW3#kpSS9&<$Mmn1W zv&)7Z(3*ep4u)xC+qwhnA+bpQJ)7cfI6&6)S~(5l+xr?Hp0d0Q?zTmH#}uh6b|H9a znLobPy5DW~@}njr_h*FsuwtSdVbWmy_Li)?r~=d)7_In{Vp;KiPbEB>m@b^P*xF#8 zcpuCz%gGT14S=re308{>pc99(F?d$csnCjGvB~&pG3LeB*ZH~YS{}&V#laDA;o!sd znO_a^HtOy|Oc*=!3(&jx`3>X4%+!-=X^~cn2wkP3oKc&;3nw$Z^!A`eYbX>0jW;9Z zju48MX&6ZL&$T(-uKzqfTs$TzG#U_(rUeyPH6_htt(@#d7?Ld2_u6nM8m{Z?x}vJA zB;eYf2U#^OzD|o1nvLEqdaK;5I3c^+A*OFjS4nm9I6QC;C}aCe>G-zkRYl0=k*iI= za+PxYat2>N^WMA^E5)A-EA)t?0}XWX3gAB5riyXN*Zvq$>#MGU z_~DLs++4okQnF!GrRb;12(L;O=h_YUXoj_t^iZQB?s&9ZIrjL)@FAOQcJW|y4R*!D z9Xe8AgWDFZ({WF5Wfvl|R)<@8@hyBi3a^Zy&H>&oA+CxH7jt)tw>s55RH3ouPf3$@ zY8!_xHw_+c%uT*NDB=3aqkOwv$phWC+f1qFWL~K7x@H7B3EPgh7h^%e{N3;(hs9i@ zqi)=cOLb%Gj)(dftGNMt{x~P7RVihvq{h8>O1ajLpK>wyDP z>%E`q1-EV~YI~1ad6HRsbn-(ZX}6wTa9SB%0m7TlzsviX)p_8!rK=J*gp2cra1B?0 znpuAvo)NE%K@W2S{q}dKE-67Id3ww6In8i*XK{66hjzxo%f%ODkNL8tcyWvA*5$BM zJ6hk$i~;|%o$kzPD={abz)T&pM^}I_1pFT$$kpH&{Sq?74Me&TweCwUHIO6eia4adT3EW7O~VjEwLWJ{L^!8O+|r2ly9D@i%@Q@^~0r*)Lp_52>rs{-vDS zhJ8-Ci~1FJ-u{*P^hcin-w^5%lQ2r^QXoUVap{OLNjP%cPcCg*dc>?VQc8pifXWDP7EB;&EUpdrM{E zf}_QQjXKu~EN(lG%+VulF*7G-sD7l1%r|w?(jAxg8#A7rUfeKmL9?`ans|~ajCRtS zuPc@*+RzT~Nf#6C_OU#D`o5&Hm{t5@)jE-GKKG&*)6p=Cp*%vV9UuDmeTkH&(;7WE zfje$zDyL;+KH5&jQ1!zqPE@2+t^mIGm}+7*`c65&zW8Kg6SwrUaIW`_=UO4irq<1= z@5h=4-FTIq8|~D%L6sHEHMb!rgW)IJQA{2g1QJLI)zt;lb*q@i9c8}qO_^;zir_)} zFPkQsi|}6otRSb)FPRm7+CRh4c@=+uMwyK%H*AZe5twjlLUHkg9p0wZ(q;i?t6LdM z%S->3IIu)qh6inY*FThFU6x?|^KU#mP0>k7D;|fMcwm}B) zB6l~CLW0Khmk34x;5Cr(8Y2=Jt=LV=m_0Qa+*9+hZ)S_Ij30uxeq*Ae3>14?3cBU!zQ}0-_ zdx87R)<2}A_C<67l@nVD$S1?p6$chS6A?pcuLXse`KVBQgvILI3^9HU zxK38SS$I7soAl+INAeV|6l}2+%=iEPq0n*$QxQcImdG!W5AIW0A|El5+XG{0d4HjWPK*D;Tk8qfWNEhnOK`c;jCZMFrsy`|nH z3W3IaI~NK=b=@<~e%DfZO6;Q2GC4*)VuL=B+SI*3!?cA+p{}_p-zizr2Z)lxiA;2*pn_H zv~5XVbo;zIQoYCoU!J;stnJc|^z=ZS#1O&s4yp7Ds(>Rd&PMdY zMcf=S+COWGq4Cq5LSmu~p0<|sunU>}tqohD@RK)?bTye@u>#?VQ#nV2l}B^vUA4UX z`09$0QX8$Rh$1UoBn#0>s&^jpgh4dhK{o46*~V9snV?_p`^zt83LYnIXUW{zKOA`H zR|+itZeX0JB4_ZT4W?N&Dpp%ChCMg4_;qO8Ojr;qsTOHx9P~Ena22(@|E2J|6@wcIiCr+|Is0t_C^xYb_w;80p#`*fwOs@c*QZAmp z9CIesSuhZPsS{{KrKQJU@E`?)xP|BN<5@aO^>WK9oMsykQ`UysOe3ShTq#q%+7k#< zdT!_+?d+WIofeV5i>vGf#(3;l3-rf|*VSBOl{ibI_w7l!gZq%0>((sR+A8F0I^K)x z;|YDMxD!>FZWl|mG4%R12IJ%GiQP*lsRO-B=>d^Y@x`Hk1jql7n{Efl&W9Uy{%QMH zcAU@%O0HL(`=|YQErVWaH9yXmB{!-GIvvU>c&)sLZBDKLqM2S? z{tQ3q+hb`;+#9KzqxM6NbN{wunDBT}^e4pGW!C)Zc#fIjssE#n=2HgV652>uh}uh< zPj(>GsAsZ5bTpg-;w1Tlg*E@Ed2Ym4lxOz1dpARL6#N3n9TO7OPBd1Z&llLV`m@hz z`N|y|W`#zQjauc6__HU7`%)eIvroDD%D;K+L9Qb#OevAKm#F94sK?rc*0Q^H@$Hr#9FoC+*-O{cGpp!q`=iEjCp)s8o#g|a=6s>8Z}Y&@ z!|5MemrgZr9uWQ$BSr%&ZGEnjy`Zf4`(E>4I{v?GiVds%v4v~fa%>t7Ka+W+JUn-2Aa zhm0KO&g@<~{wtjtNCbWV4X*YE!L0qr59FLK7x-!;_x&(QZUUR;=N^8#k>e5q3WcHm z39eaGHl@P;)+RUxdj6mEHKlGRI>SSKg2}*t6t&IZ9RoV4zmy(@#&>_4ZZ8WYxAva; zC*kQo)9n$Af%(a_idHGy}7ON(6UjHqj$1tWO{6b1<1?U(WX_R<;%!m3*|X0=vpO*!9pNH$yaV)s z&fDmqvi3SGTSjD~1UlSPfqm0Luiwdf!p@X6zQ7CI-!DQcpbYV3O%QMo_O`l+A5rX= zuhIlU6$;B^CpTI>Bv#Yg!u8Wd4Nm)Q{B_=FO@7iGx8y*UV9bohh5RB8A&7ob&$O?w z*{L8%(S?2iSRSaCR&M@^FY(3A+NU>TC*yfZ0g$BCp>E*gI^y{5yE0&5?Z-%H+#s~C zojYgPjH~a9cghal_LV)P;vuIO4SJ~e>4*4O8Rn2+?F3)tF0$$`M|}GaR*@+v>%Arn z9GI1yj6uupjvR#LjLN^&&+{Ck=pu8fbCavCF{_#YiEHd)0;r)@O z33(@N+6yRuI9a{lbK*y{R{&evk*{mM;3|$Xy3!XF;+|p$W^wQCWhwW?m^|!Z=BG+% z4^su+^pw&Gi1O4-xKr(BBmFAFTdOdPpM_&!ZelI}SO{0%C&W5C6`QEZ*8i!;BnH(i z*De*L+{P4z^`!Jw1ifOW_&imez#3u7BC_#W!$HA9$E|icOLF{YTKNEEuEv+-*yXaM z=qbd7iaVq)qEjj{>g6dB!^;&kUl*aX!uS;1MYqk(puHq*y?74MOvB4YPK^E0RDgXB|>CJD)7?~*|q3b zjMqcEVM^oxgoWdzFz`jJCUfpXST_sgEmnnj?{g?yB((SuXo%9Xlevb!5~gBe;#c*Y za#U=Ba#R)HZ_0|YTzydIysv|U8FsQ3a|#SCK)ZVi<$q>{jYawc`A33RXX(tX9a(db z@j1)=DD7Nh2*1povXWTgCGEWgGzs(2{xx3@5v&0iY}-N!neC@R zJ&O7e%PNQnF*A;qeM>)Ev=Z-rS3hN}z-_jm)35*uZ^4z0Ng<~i8?=6K4Km~}C|7~w z1gy2~-9T~qJLjs(c=WE&(kebLevpn5%z7R(!yq1j$J5ba9PQ(K}qGh(S80p z8&>uRYv8%(~!ZNSSGkf@{PHR}4npHe#JS7_B-i9};TvB^c^3 zY&J95Ch|phtmJ~)GacT9SI8+MV2wJ9iYSgA$(6o?Bi4l*6P!Ha%K!J0-P{WjF*3o)&H4}O;oUmkK_EuHNrVd||gLG-8`KsbL2*g=NWKWjbW%bImV33kLZG5~kPT#C7Qg@%pWpW~IboaKkgeB1QTC?#d#eeLaEW>B zxxNLu)+0b-Jm-Q~StqT-yg$W>mt~{EI(8C?=`nk@NPGK6Ksip|l8V`Isqd>?T6H5yKUHow-C= z@q6D0Zxe>n#yQFy(FslJW#Yut$e{d4`6qK$*DF*f`1cG0bS2tnk1Y=-UhD&V=C)ue zkGXA`>Kykzdpk>QNF86yTL<5GX!O_XwLD9br;OuK@7o;JaoZXZ!ll%cH5(j#o4 zkA!{{;^4}-Qx^*k@?4Va4*&XN&hB+FS9{x9zFBoJSb!&Ct5~7}OXkOlDdHVKQg@l= zz+X0lI%S}o2`%Z`@{f=*`pFc~1tN$ug*na3YwsBWgg~nHN*OuH4%@H^07)(PpbkY% zZs9`}$C{Lr3QliVm0wB~5>b#^^^KHOc%<3*8qLyQyJ9ou#(FHC@;z_B*{Y?cHl+u* zXxB=rFfPZwS;b38Xwxhw1*IZUA{6*s%_dOnjE}i>!frdw2l^O zIGyZ41*1iQ55A8(LvP5+pV6)HaQPU<`-!& z5&n>7e?K4veqR|G=EsypN~(5mS_>Fi0iF;dS^o_;m_@!2A2Hr1itc6v7286RX~D0M z#C^`ukJeZeC)Q@WX>B!W<2aE{bF?ND_JLW*1jsi4a|i{fHy?or?#-cRTVde@-p1Ba zStDDR2F&#DCnOdzT zfxcHu?e&n{(>?F&*2nS+n{NkumGE^aET*%C^&ZCy;qyDn<0VqJiqi}Bgt$4g&xxre z+$=>`CM>*PSFC7|EU8PBTOvUu%mMbp=9Y(E=9CnxMcK2%_=ELj5}fW9#P`l*g>u5A z@Q+2if}T)DB3V8yxN1+2n(eotl16GLp2W!&cN?zc?@fk*A*eOIgQ+St+qX8O=6%$y zyvbY<*5NMJHp4=>pf3VMb;+yC#wq-K{Fr2-*C^b_*YwrRcb@cG)Xgrw&g6`ltj5;y z84d=Yc#+-9s-=#!tK5reR$F}nd{dDdo|KIMr-5ig5Ba+{O?(wo3gMvTH`!WbVPH`{ zSa8Pzdn8688{<@hUB0upFEYrLQHQ4uP>8}kjDQ6ltoqh&J^=c8oWYzUB(;%)EU zU|sZM2+EbDZW0kl_FN3q4FtZTjAJPWbUu%JDk2~ir1z`{8cM@`8pAkB8B+{jmb{aE zAoPppW&az?;qnADR&T0pX%-g5vK1eDxqsk*`w_6yJVfmkINQZ6UuCgal@nY8LlF+W zLJ~7X2l)2(B|s3+^M#WPfk+AUCEnhVMxk|Aisc*4m*l%7y&sFog+9fI zluIq49Ss8y^q;$6W^hI8?E}t{TUBvCQhe*{am98&#)~ameC&V+woF+htsE3#tza+Z z#U_%aya{mCpHGQfw?B!x%P-dds`mv=qXx6cG?9*@&MFS!&qwaX9vxx})#*oza9@7S z)zWXS#^>OZL zWWTL7xOVTC=6b|e54w0*$DCA91Pls+t``;bDB1SK@(nJ25iE4IcyMS3tkp-0J+k3N zDDSIFr3z!)OzA&O!OPT)sl__PV_Jn+aO=286HBdWRa9=ncn2x%+8*-3Kc|PXDFMh2 zYGPkdhl`3HP@6|yq&@v!wsB%FK0ZA4gv`biHZ2t^89;0RavN;05gQ0Dy5Yl69~qsAfM9!Z*uJCEW2UWa}<2pUGbb|hX)E#x_}e#mR_PcBT!5cuk|b^b=0Zz4D< zSM!9#F!L(9(3Ff?pkM%*ha9e8;`|JyEV{@oP-{Hd{8 z+H>ZDjupM1B)MRHH%L;iXF3SvIwsByT?x}C#IV;rWYqwN23#$Vd}L7l@Op3ND*&>? z;0jRC+;I9Xy(Q&tsybg@-bkTf4fc&o_v!JJk1p4*heo6t#&HMGQCnzhMU9gGsi5Rm z+1bFSVYD=2;^$kx(BtaP-{K7a(LZ!5DAij!@LeVASe=a!gl`iM`fg_lhGgUPKI%6n zZb&_3wbndb7p0zEKtxZT1(>%J!ssxV-zF_cn^LuUCxrr7!N4(EOT` z-FNsSZ(Wi{X*KO*R@GP|nBYTjj~3uT4Au#=aqQ+jlS*$r#uw=okA5CyBd4&~F~fMV z@cVAm33u;0@bacv+qB^F4=&aYh~M2n|8MtNLunanq)mQF#_hnWlp)1g`ZG9R4n6KQ zr9Y=Hq$30t)3e{H`M2Dg8?Q3+&gs$Bb_yMF$WFOD(2b&fTceO&aq|3nD{aeq(FA&E z)+P}gH#w6xG?r5>yjabl?Yv%co3V!(>QB^wbU9(PhOG~1Pkf8P74N`%>QBgn4wi(D zV79L~>Gm%9QhC>P*g{L?evTW)i9@Y`=}tS7#X`&`$tjBMK;Uh*-X@G{fdl|xJL4nh z^+Lkdv*5w^$Sss=RjvNokD-|ZVUwLmU$S~P;VkX9IM?ykgmyFF!-BFho!8bjzyt`N z`7O!1II^#J!Q!Mtf#(5GAr<#Y6Rq(DsSdKLGU~VKBXF@quaA+AJ%ftP4X=?=EN<{I zEUWFjVNcOYMYXz%r)_@`TMIMI>$LlTvtaNm(HBhox=8Xb%oGXA>i~*a!qL%nLS_yl z;BR^$0L|8iM9a~vgeZ26D=&hccA?Ft`BV#BXrBS~Q(XjU)H+(t%1u<849Nz#a~@ao ztq4=tn}{dv^~JpX-W2$tXOXm9hq2GuL(W>R*50DLybkx9eHsoySsy+Hl3W3PBdo+D z7<4yNRdXxPieZlG80GXn`kgSP=7B2!U#e4XL>|KZVK&AaE0Yec31V|$*{u-Rd>3~G zuo+w@1P)&l3!_(EHcgOMfa(2HmP=NQVe7h<=P};q3Q*qs{q%%hp^N?K5jgYA+TkB% zV%+fdy&L}w3!LG{MgrRyM(8{tq0Sqv7#Uy zeBfzQx7wJ1PxTqo+xdvMu|AgC9OvN{$k?mQX-u9xmWa9*+?HnlbF4MyM&A!^ z)UOYl`<2>fkg~dvD{)8K&A`98aDS?Z0bSqY@6HhazqmW+{?iP}F{jJR(m~T(6E9R6 zBc4)k0|n>WJz8?ksm(6BPR79ISiNGoc)YrjFD{i=#TCvQRrF57rWsAu?O zb=T@GH~&50T^8}y34BLw2B88N0!!` zJ}G~T#kTTb+lsxL`bN@w`*=Pp?L9dX z`JQk{i4ggsCd<}~$ZwAasd#|qNea4Jgw0bY$5YilsGfqo%t^NU3v5g7h?s}(V-VvcYza|CN2a;niL#}>qRZ~uycNe3Q-1EipL)cf+)DAT zTXu_o1X8N_DuK&W$KEfLVZyFZ7In*qP;mP>#40MU%+)q%kmC)uu=jaRGa;-|0@ajg;n5X8Uyg%M2lEZY{ z=Z-vNaZA!;fIszQWgy*4A)D`wfy~HARlmju<+K8o$pm=(@~-RZ-3Pc?uVXGB4RaTr zwyN9H(-9ZmJ->xG)cQ{=mNtcCK~uv{E?cuVY_{$1SI*om6;jx(SelZSw>+BvF>G60 z_DMaE>Ei3`puByG_}Ii(*B8HvmPWF~c&x)ae~Lu0PjfBQeidJ1Uz$i`=Sk$*XEg^d ze;PS^UK^%|Dzr)8(=zNIz5KD}DegsG<@6aJ|GRi+_FWo-QfE7TnNilY*5Q+Sg>g%; zmVK6Tp&^Q{7!2`W*ital$sX6%^;t2dO2<^LtiJGq#^GllBD}*!f9pwu!;cS|=i7cV z4P!|qz)lXhZ!MDI9XXyB77i?{Ac+60XQNBS1yBpaK0O?P8jz%g>IV3IJ@|7^4{-hy zYjt=~e>$$iw_2!dP}+SuoIUEzk}#NcRBT1&RgA*HSoGqMjrKfO0L{*wi_&_JPZ~8H zTHDW1cnzL?pvy?-f?%PBqZRc#|7|vz%&u7BZ@f_{M;rdzQvKYPd7s=2(>Xnh_NB)Z zR@VGNuK;W_mv5xyM@Q$~KrkCztkJxmhp#eQ!cRQUo_86l1~B_Z$#hO6*6A=mr&(R2 zj{iOci2WzO5P88FNjThkHUR_ z`&*p$BX-&K>r^KC*Dr&+N_z!C1C8H*X?dnAi7EZ5seeH|cULHT?n$9$j_!O;4R}Q8 zvu*pPcHyGyL}ekJSkzI+sz)eC59sOMR_Rx2Ids-=#1t zAE~VL_$(sFjrB|9o9XXCy0}D5%5bG5#4&F{_ckQ9i|PIQ_c75D03@>PJrP!b*;;7X zge1U9$IrB>2XC{2;Le5Gp@=?sLHdTv=+q1pdRajX9Y8*uwj#4`kO{*<;c_7;Mso#Idv6GWQ82P$a}az3KKc;CfZOHsTpE z;4P5^`;m2*btzl=gZb+M32(?&;(PkxuApA-AYC~oN15l0yt48kZy^VKYKXp5!U}GI z%i>O7bnu!ydGfP6U05Xb-Q2jgy5Oq$`rCeo&`zlhQ?br<^FXNL>4G^deej;nSDTU2 zH%q74u|}E9HHuc^>tu zGtGrQ#Z54RsT?K7t#`P16uXNwN=%h(&<3^27_S zFmlE}&WP0+0rj)5j^$)Vr5NQjdMOMeA63Wy-n5y94Z7>4=5e~U=?Vm-G~Fz59LHqM zsz0LMN3k`7E171Q8}=6+r%ugs#(%LgIL}=CR#^iYnN9pGrXHO;T@A|RFPI2q*|f9R zXUOh@RA-U0gCj(%hVyg!a%x^nxlOlEa76?a_}|URohUQ*i(Aj@IMZ(YEgBnC?hX0e z1edr1IA)AXKw}Vn>?;@dK5tZVdH8E&iBrxlIoxDjET0zlRLRNI?A`SLV zSorN_#COkm<_ho?vw#1L?tHy)ymPlo%0=8q`gg=Yt(AHY#zLndybo~%pKFF3NBu8W z3J*x0isYQAtfZ$&j8y9)&94cJoddMdDj%Bnh`swjiB_TKOuJ57$omCiZv*1&m-qY% zkS+EmUGEHyWK%27Z`GC-mTp+tr7k!uw#WZj1?Q9zoikM{eA&#HNI8C8-!YU&XEQzT z|8*f>Di^>j%}?0N=6mNwu}$SAP3y^Uc`B=QUs^m|v3uHESuDGtJ}fj-wCY`;m3@xm zyZI;E<0y=OQeS!RG^kSQiFHgKgN=u@8+@j9ykmYos4{Uq zI$#A>==zQ;QmwpAe0+}I&eZRTTA+=lr!WPq1G zA^gMRi;+4r`bgF~&G#XB;?$i2n_*68nA7Bs1v_BfIHUuolcQYKn;e?V3_*iBI!IgC z?`sm}ypbypY0)N6*hW?^BWFXt+CZSMM!~&`IbVYBz&me}kJ0&(tM+_GAY+v}!Xs)|$ZkdU7IG?Z$p;aCR3xo=cP0i%J0(1Cyq=W;L-SvcWikBWU z@5UOFg`qKbb!bi_i(K(e@p(}ilco{rdd}*%xemK^9@p26LLjjRI$G7juBUvs{I6{J zEX(6-hx%mNVxAS5lrbaK)p@rKx6?&s2Ozq}ex+RApG#~Z1HR@3OW_?AHC=;N>Qg0A zspDNrOurgwi7V!$cQHo|%5bRX?DcVYQfIbusf)!>)Y^ZEX}(#DRWb%T(+KiYD}L>NNoSERpGCxY#5$3Jc7&f2bGsTiHdi7U;Us`|q zd{zCDe_LGv8VI-h{qSyfcgoF!NOTB!W3B)o$OU_vwqD(TIGJbcR%^z}fKXEl)vWDw z_3=+Vi?CWVa}d9or!*bP1?R_5Tx5;Zz2{A6*_|7(7i8@}6kEcK{6 z3LDjkf2@Muh@ahdSkG-5d9W6D#OzZaE;`@T+;3$^`udB;V$FuuVQ=rGC+qoSHzJrr z;8%L0e#b&^p-yTT$~#mj@d(Ru>g*FK=RRiqR2P?~6B{Srq_ClW^w%z4L&M?9aza*L zbUVm7^`Id^qhHA0=J%0xrdWo*cI{V3tBJx-O9OqzQ3Clecaa*Zm3T+#o1b(Ty8>8>@FHuoY{2Oxl@|ts``sDfMUOiKvX_w^*aOo9kGe{`7`3e;PEx# z8ezO<+q&^8FVY|e)j*xn!8R zR$3j?z_iCSXMjP{VT-#``>6^^=%~#d3VoC@necAwAV06(h#SZlSZroqYG+F8rvK!& z8W+4@!Ua*tbilc!9wB9U3h$n)sOh7uqs{}TuJ);&I)xd0ZRIFRYEvJV{F%3-x;@XY z+tHpbvL(Nm!513=hqp^6sDKx2={;3!iQ^L5>2@&PWpN4S;2K(l-dDi--hYn7|CZMP zL_bU(@Bn1DIZZe0d!c1BqsdVTD0CqH(mL+X(iL9P}PM zw}!qS$0XcFn0s55QR}lXg;Rkvxoh|c89L!P`dM1t-OBen6uUZ1XrXXTp%I#AohDQF zKEqg%cC;yMLo_3tF`|SR^J_(BMkONDbsZ?F9ORHO;pP2P%0!vXoVsgReYB`}-Zu-c zn$VUpsT)iaNrgMfksK~U+Vy9crdVI_b@$Z-12V%RGjB~u|DwmgIvbMdP3w}gB;1>1r_XX#m zA1_smPiktSQyP8lIJmsd`9ah9&ec+u)RRf1&s<5twT?Q--h3h^Ol_|k`E(;fB)Bf7 z!C|y8VXv>u)BKb8G-Ovmrs?)=`YboTR-djqJj^NX+eZnKwHs{TxB{HkbO6<4nA+C} zYD?rbA|$|shMeF_&siRaI0GT(J;Ji)Qg*H72qelD`N4drM_o>gGL@_y3KvT073ijd z+<0tdZ#SIx@k=ngf@JgNk0;15W`(R+Nf{swQBw|8Snv%-QW}!9_ivOKuW_O|wLg#} zW4l`DLJ)7ed-M}=R3EbGS_MRt*1k{+r5qq**2B6z5~AeH^84=w^~h$$eG|}p(8Acy zq{JAFx|cJq+kv||jnwjM|WDr_4g`j3B^)ro6G$RmgKX+VdtMkFY8|YnKiWyzT4XqO)7lg*X*~+vkZ&4)|AD0-lK03~!qC znKVqj0p8H{6&6}$Yt7qr@PC}@msU~U`DOg;Z;%k3>x|W53q?u<71U?%Bw~H^ERG7p z-WvOxFHXX26s zSA%6Zr)YsJhD&efR~~-sA+ie1)uB&LQ{LOYNypY#u1{mOEH8_21Jd$?0Va;!pybS$ zPt@;=OanmcnpqOEfUg?KXHAOAiPIGTy#U3V6j#oXuCuPO%K9 zfF^wZ3@GGNqfHL83^0`I{G13iQJysmjr-R5@cDc5T$UaMZ1k+0$Mwm{d}2tsKBx-? zQ)aBwCwjp2<~Flj9dQ!#>&iNmfSwY2G+3r&DlF$qXx!v@p=5|wk7dXpCk~|$dteBM zifmL!z>8HUL*=^}qw~$#lNn?mcSR_t)3)L+Z@(Z+P}JBRIH+OHD6pMb_3|NN)RRAg zu!pfwj~T4ewcOBDN{Q&OhxJjJj80C4xALi{m6geW7j$}99jrI zPWL6edY$f}9k!bA?U_7RO1C{;Ou+Ou`wH@TEhK1UAxlSvb=2l2-`8>U|HaXHN3*^E ze_Zb^SJ6Rjs&E-dPzRd zU>-l?hTr1=1!MNHFJTSY1KsVYBvQ`$`7Yh?b@P(BrrTi``+~Udf{55=DPixpK;1*l zHQc?K=MY6f`G^&HU+)dl5*ke>PD z{8{8*pZ#_H-y12Ouj4u$IixX4g&wj6ia(Ahvt-vfqWRXUc5ppZ~vaL@qwC(imeaZg^#K%M6SQj ze^-DjsC~S{+*4V{8;r*rfE~-8;e7r{#N}?4d5${1gqXYb`LGACDscjG4r*i<0gwix z*gknTu8g=1GiUcNayO@LvZjaHO7Fkrv322;kgB^el@2?!S4}8{s4YL>FblD*(pp9% zdy?q@#r|A<5gwgNBq`wmDVUVfGjK$-kVW z?{^a^dERkH^Fj{Ct@Fc2jbTOe6A{Nk>4N?nHqWbl5iOA7iFLffj-`c|S)gHj4_;bw-mlxJKLnt3SW(48{qbe^ zlDzw&e_*=g@8(s-jK^NF1A{=~=+9yo8;q0XeSpvGpsS$boYAdIR*TmWXP;huo_Yzv z{IHi@K`1KyiP{4_=T9G2ZyhgG`bXI+vZd^hSh_rm1n94Fff0Duo&`pr79 z9814ULleus`T3XAZjOPj>~qv3;2Bv+E)2A+^rI5@HQ22bq<*wfvVZMn)GIi+?V8jr<`P0K2YYdS0&VBKNbtfNWiUwaL}kjjKISIx(Cp$7RlRr|@>!8`5{<2|4m` z|C@CE0(%cufvT%ky+XmyuYphh(p;%Y2~$^0!Es-4xa*q$g(ljYMe~>a;!=$+OZpT8 z8BcYKb3bqhG~>68Cw=YDhKu9I?Mmq;R$p$0hbM>DHS^!n49;4cT^=K34^PiZsa}l9&}Zxr1aNMq#YUS$k#LIV zp`By%M0-G8#xZeyS7&8;d#({$WDJs5R6y5?`i>LlJ?9}gk3*M)IxBdQnlHzDuCVZ^ z{mWwY^aA2V=bI{jkeHWX>v3znQAQ49nkkaNH%=qOA=am=pZXUdslTQ((|v93rAhI} z__QsaHP7m9O=BW~b|`x@TqHW8cz#!gkyg~G+6O4?TbmNmua&A-A1*FB0Uzxdug_YN z@)bl{$Et>R0#^nXm(Kr!PTFDi!%9q=Y1XRGeYQ8wTspxa41n_A4c_D~v`!~Tu>v|t z4t$FNtCJGFbdN%DFvGlV2s&5q3N&dQaW8mZDNhe~l?~ID%I4^{P-Sf@-v29cuwBmo z{K_RyP`ii3G?Tv}5#K0$xapPC8fS&7<;C=g`zISFC|{Kq++^CPDb?CiZ_$p)567hW z8y+LZEWS=8Bkk3?1A0<25-bt@(j3HYsQ!`4+{kL0k*0Ej9z3cK9O{vt<$HFSty@R& zaRN*4diXt?*XJJuVLr*8^RzoxxG9NMObKVRgz18j#($fC0EoVmDOXLw`_MSLbp@pj z_B^v``YX>IaRy#Z)S&U~B3Cmmc`v>guMS|q_{t%wT2pWSt)9UG7=BEco8AY=e4I%+ z7$7j~=sbsJi*0-D8z;sG58~@Uo+s?DL64=?iW9kb62+6^99R`tT)wJBYBRP5 z(g57w`UQ`b6Lf`MJFX2bAO8V}V1wCh4uBu-|^RtF5YQBRy zc-N$guBEJ$zt=@0dRaG&Z@v0d6eP?*-a56Ux8#^*=8$AND% z%f*(g7ANkUSTE24TF#aZ-NpL15ebYOt{*O1i7Jl*$j`E3W3yG_~{3$u|Jq+Uq;#%(eYU8Ie=YLDo)OG2GeR}VpY9-fKHVNykxG(sr zx4&;FJfXLpLX_C*vfnls`X``%gUIb zp7vf?k<>?2CNQZs!>^3Tq%S%1Bn>!R#gt-%J+HJ{TRpEHB~(uo9Z9nWou>Kd`NJ7UVOpz80B-Ej~ElZU*OI&xCE7 zF3!ZTX$*KKpZl(r*Ma7@$Efs%7}EZd4z!hqkqdfs0t)iyg=If_X|;(J%pdjhj~leB#? zpy_K%%p^_rZ%_@srQFA83WX@oR>)ahN1`2Wmljn72fl9%|A|G~l`z1fjV-QuI{&d; z3$ef38>rH^lm{!qM3{{|_Zkn#aIseRtI+qe!bzg~=EJUHl8=R&yN$SE#Qe%@H~kuU z*X3ZOgC^jhAV9xn2hEBBUi!!4R+(;2X4nk$4mdF8Nmkl~u=zp5>H z+nec8ye(%ecZZA28EX$1*j)~2D|Y35qB@r9{BtARDC88@raneyZ^@RBmsj@C(1p!X zX2&DWXa~LBcpX!m87B`$en@-ImVKA!)W2*CSS0Gtkn4=H@D8yw5Ru!d-m~rj9p;#Q z?Ap1JC*q(%sIdFwP4?s4JA7TXS>;#Y!x+EoL#k6MkUEhOf3a-I9q1g!lWN=9Ip)uY zO4^sin9=OT+tfB&3#kps+L)%w6ce>pRn@EbE`@M>x}D-%8?|2?HW9Kqz-jsLZerE9 zfQBTeK*aO4M2zOmAD! zEani@9nL-7s&hW?<*SdZ_wUiJ+?Kw7TkhG{JFq*z5q7+ArCjO16RoVy&w$ll+QT*3 zNkMW+-I9(a)`%k&GYVW|p`liA+pV}x{UiIsUUa({TQts7FgOnS=#?q835u6~P^ZS` z^RFi#LBjNIJoBV};my-?p3I+i7m-AMeL4J^)xBQrZn@d*XWqlDGG3V8MEcWKrQ+PM z_u5{5a2KNnTqCYTLBroRkvf~qz5&g=gW_5q&ha)P)?EZ`yS6ge{Ah z)qK8ZGIBQT^C|V}w+S^XSg&NcPrbH1x8u*T0B^JKrFxNL6Xr%J_X|9<$3XYlhfJu< zNq|mL4wb(;TVz$JCE>?B*%#_nF)2BMB!m|rRE7qtNc`W}zln<^T9|#s;MRcAGS-b@ zZVKT7)Mjmr;uj4v>*C!IoD5lZIWmVMddBk$*6P*^OSr^Y^#^j@Hj?~ZrqIttDSY8n z60#!{XS&&zkt;Joam^EtkBItS@r0SQxSFPrec1~^t%Tx>%<{m(UoPFcFGs! zus*$6HA13vUl7p)&HqsxRG4uwDe(UmqeHr!YaA$^6l^uF3 zXfwm}e7q&gJ~k7|yVn&YWiLZVb;80nK1ceMEgfW)M1Zabd?;OU^gY(X+1Gr@9)1z8 zd*F+k*rok|q%u?&uE^(<1kh61FLH_Klq&{UNp$dA-p6OuRp81>q03NecJB zQSh=#=?84CeZHxt9{6M4@$N`|9>Bj(uWGPMGp#P_rG7ZC7urhgnt5}|wS#?mAm+(= zu5aY`>8=NcB3W>4gJmbtWNw+{K5Cb0gQb5~PQKx4?ESlisZN5Z`7#M-mmS1iDHUcR5syLr-G-vlvtO2&&TZ0kAvCLH%_GD?12ufuF9+j?k?u9 zDhcUdOgsN^GXuzvk*iTV3R^q5Hb<3824witX9=+oI)?hw>lGH#W2cBI! zIaLcO;rH3?_aAdG=A|`$q6-I92Wo_T^?Jc~okhhMl`YXXY0o>~Fg#cgff>1OE6ABi}jq9Vq--3fl1*PJ-n=^gVyy{eGz?h)d_vwM(}YqGILK z*ZiDp;Ik_MQJnWm7;ugH18up6#?uIlUQK{+v^H-x!wKVO$^VPdMChjAamIWv7X6(E z$bI;(8lT4zIT3yPOeRhBn4+9@kyym>F`gDC25&UcqYtWNtj3x%ARHtcYC!(qDBb!0 zSR}p+U`k9hDwPLAL}@PYqq!Ez_mD|G0R@lxxAV1?1-Do4!S+92lR|AV(n~hdaW-og zG`CEm8f;Edc+AEf4E?DO&BQLlGh{H4gnWc8{{bii}LRKP%{Dwd^TNhvo_T+_{-3FYqDcarh0g6 zWwACnf;FrC;#pGbcuvqo{udmf9(&g5fWe3^nBbsdPmyTvj{6#xT=i){*rEcw+yv+} zd?(i}?AOtU^%$;xm^|%CD*h#rSXjkSU>^Fsbm863lIN-2x0qg=K2?XzXGwPV2pz6# zY6oztwlFIEn75v+)4Y7(Vs|IE?!a#xFY~)N++;~*B2|XVE54=6C;|as+`Os`@`SHc z$>o`6!x9s>d)zm$gnl!S+21!=(K7qYx%t4@K5$0SYBW_y-hyKv2|o3tRNG#&*4%#% zJo)#*^RWsxmIrZJhNP=;kvH7mv1SXgQ@AQw?9PSBvM{NW1@2X*YBLq zTlLkKbhUb@*pGPLry22E(g2{1qb&-A3*EKNi7jS$mOXvya+?jz<XREWQwW zh3?bNqXj4uvo(Jmg`bo}im@^CyiDHA(lEOG+4*#+q==d(hW_9pq;&PZ^=j&+rbXX5 z=&H0`a#J;?bY9<_S5bOi_W79eOx=7J@KLI~4v%`8L9m#^gY9)D|45sDT_Yrny>y~= zc$m<6_ZON6;cX|jvKni=;3#lZE#wX=Cv!n_z;&pj`5*ebyiJ3*BuDnY=p1QH0uvAh z{kZ$GmI;EN4_ajo`cV~M2Bh{ft?>r@WVoekc1g&WiF`$cgKDWIV0G|wd(gI|APl-C ziIQ#+esqS6|I@pd8n5w-kxhT0qp9TED}=M1zkxKl8H~STlUbNjvjoHpYDu64w6k-R zNB|Q-O?}lzbjy5k^@`8NEgnX-XY;D&yajMq~c+NhctU+e@#FU2mpe>_FHjX-sivXYM=0v{eVN496%5a)WJxD8U9)%pFXeu z#;Ajz0;6w#ecL)erjZ}cnMmsrecw}Ent#^~m4jF$oz-aK#t&Yt#Ck^ai((_u#>Gow z3BtHpdt+%hC1AK{l~^aS_zq{X#{dH5i_KFxRGoI*Xb#pcqWPtQ5MX}siPgu}d4QRx z7-D0p@A-Pl+Z4ne|Gb+6ML}?j-cK88+Xuh{p`~O7RA`f-Vj(}V=&@ZahW)(&kv(zP2y1fwQ zn*7Q!GS&wm z%@&kqG^9-0?=*Y;SabF$l%)RTYO`IuJ+5r!y_$7~f4gh~f?O@wA2b#v>BUCB^|zPu zIdbm}jNBcmvc_|%_Mm24e}jHL{;xh0sh)5Xl_-&`-70ZTWjq@DXJx@I%ZxV+O)}r2 z$K-!3-?)4(3xFf4&A$X5Gd-0KMpO&Wsg@!Tb{_(W;wI?g28>VpTce~Q_8D_)vmd(F z2AJBw?3I)igIOnGO`xv%?DI}Bud{H`<;S0T=TR%`M@Boaf8U)l(~oGd=D+k$Vyz) z%5g7*7bl1aQ|p3DooEb{QF;~ARo8+-Ep(SC2wT6qIJy6&K9&j)G5AzmGf zxm+qy@Ey5lA=6~~^O_upmx(h~@pGx~!#|vcG1sARD;e8EQ3BSjr+#ywbyLk|#*dsG)E$cQB^|NvDTlXskoDCKfnjm9u~cYcZztZS z-+K>u;HYMAo*h^xr~=UiJXd#8zb-GM)C^+#c&%Pc-7QW{O~aDCO^9jLeATMU0xuL+ zxbrXdfnuW1Gm1pRT(@k3%du)dgsSD9Ggs{esM@R?*dFi=Q@4`ly->u%oK#j`cikHB zDsx=vpu0&@F8ZuiiJo>+hpe>1jjXX=&vs6n=W_YK3DBz1P3Vi;TzvjOj91NB_Uefy z)mxX(ec#LHNRu~Z1mA)7@M61jUIqc{DIq5&!bUhxd%17qu?I<`+_K}mBC=#4qf91* zryJ=+U2Rfu842GEFdr{F!#xomI0JP`S{tU<-dab1sd~0Urz)O4MRA|bY z)!?na3CcE8D$caPAynZ`)VZ{dc54bQ3mL{Kd~C>V^PNw6LlE06&aYqBM4;z8xL(IA zZoWVfHBySj8+F|iRsH)?=7qvAz$fiN3&Tx)QO(i=iN#6Nc z(a&ME93#XZ0ENI%pRtF2%8ycGYISDEoM*=sgCpkJ)gm$uIGHvnRCD++gV-#Y77U~N z>V}*tjL^bhWkk~K34cL=ZPOSk_^E~ea82&rs*~Oi9FPQwdQWTWdaF^U{Nbv$;#7q6 z(6uk=p7*)!VY@uNA3#_MjA_9Xk;W4PAwZ&u~pI5&{It z9$aunxOtBoc4;GR+d9kvdTAk|*Ckf734FZuW@01clwpWUccKHh(;sfi5JZ(D(b8KI z?r#f#nAOrf{A%;Wk%s_>S=h2$#S^{5P`Pd~(JnKyOOPb%=%H={_WNSl3hR35yPn^- z8uG}Nh(0_kgi?RL0XFNwnJE+egCRtnn?iG#b-A)NYwMOrHb-++zM)!JmhbPi;w|+z z6{A#qU_|FUhitIa2+xs6K9}$wWk73h?+W$1>QH#LSCLHqv(zX5xWiqALLI$o?N{?U zH{hQ;lhAG?L@5JdH?kaSye6t{nH)^XDA2c%iC6S^KGjf#VQOCS^%}m02`gHvLSt%oJFiN}o293JwG&TD z6h79gb|XxPN%ee49#uC?;E)OW>yNsm=$SCQ$zu9QgNCJR@1fs^SQ)0*2aT(qt+yAd zn}nR#6Dma1B6t$rvZv9<7md?{cq$bac_>OGe#{(g9SZx~(^FEk$s)4(Vj`2ipvSJU zwwF?qw<3M*Ovu+Hl!qBj2K8SIm+?1#pwS>MVOlDFq%f7v#bxE;TBIf2Vu8%sM<6ve z^%<-@5o#9F3OHAiad3DX-iIRUA`wl%39M*Dx*#t-vREouRk(^i)(=~~bDZ;SQ&U0L z(yHTNkUO`ZoDWhs)_xl(Qt>y#mMQp2oHh53K`UKX=5(MXdDbYRq(^{&;_85(P8VU- z53%UDT1C?suin&sZ?%Ph{}iF!dbMiz4(F@M9MClDW@vGq_PQs!MHN@IFKLU!A6@Mr z56{s;ED6gcqJ)t05~WSdP(rs+TQ7_<DI`crLtB>rMyJGSxH~e5EHS%jKkoZ~4 z6(sAZvAm|863$zhXB{TBJkO&#KE5$($(?#XS$9e=Eqwn{LeupK#THdRm>x$>AhP0o zK;Ke23bsDErlpS7IUr+FH*+=P4`sX^&z9a$$BMEo>SY(=0KF5Gd4o5;AZJFNl?Pu8 zSm&`uJwBSP*mP_1J=p?vd&l+jqUgbCdUtId1(*caiZ$P~B+2c9h9QgjW^GO4mLtTgG&l7!G1Ho?iveS# zjWMWMkXm8gBsDYPes;CqNXo-TEY1f;X8uRF6jVb=RjkZ@vKQqASXBwoDm`s|Cc zW}4}8LQAPOd)$hpV<2I9O(J=?2LG_iGgCo4VXqHh3kk~nI7)X_Ev2+qBofGX-|T(Y z0NmNGA~wG0`WcbrDlHOhkC0<%iueyfz1!U{0y;YnC61`T#FFuv`aUN@vIcTxJDV_` zQtn*sHyJccz<`No=|N*ILiiV+`A|-g30oofd!-qonj0ept-=_|Ts4j?RQacf<(ezg z@$$dVUm|}o z*XMYR(`_8iNvWA4ZtGw9ej|ZZdU%TJ&nT#{xd_Q;C73PbOz5ebUH1gg8_j2neMhx6 z(u@1KC|NhYt1WXDgV+_n3PA}I7Kzv9FE1qNTT>^i>A|pg-_c#(HyJ^pO)(@=M4!y# z;j^-vH!5FRz?N3;){kQtd%4~HiH0NBrE)%vl*d>l-qflYc^A72EqUTdS~mt8L77O( z4^2N19uNR{ zEN~2`1zYBXuVGSS%FwDyGLC*+XPevZ?R&LD{fXfxx^7|wI`heJB>yt5osuhd2;VL~ z8BL-2)(5{|aoF(|bGYTP&J5`;tXPIpA-SgSER}gu@WKeJ(Wko0B;QbzI zE;xnquCz>{sP&6|*VO%r5>P-}ZhtAD_C3V8K?be#Lh8h@D0tfVLojrBoTf)rY=y{Q zJoWqmU(uU_=|Pb1qml929C@LEHf_EIaBmm{W_F8s zCRROdfX^kld@+H&BbHi+Kp&=xu`O&Iq>?cmrWe0G9pf)xg$?@t5HrNda-O<!eP zPf#-SP9u^ne+2%y;-tE-j9BDru^(cj#ggwkhXXuVsDD7NW8eng5w&+wa4s)AY z{&`KhaaK;L9?*s(+1M!*58$B9^ZgTKupGrIBC?m}#Cc&yIK9%gULlgW#gw!9>rb+j z$_e(pLpZQaCQN!u1Q}=z4%L!%v5tdo`ht)|)kTlhAe#6|*MBUHPWD#8mJpF~za>q| z;>}|($567XL*9s_6J!GEYyl!|J0?x`+8VLXTknBNY@IYJ)g7|Mf|b z`aoDY)328KW-Q$d8PX8*&31ozK;A4|dcbZpsQ)uudQY-y&lKnNMRU^bVF@d{o942= zQyaWl*IUegtg3RChX!4cZ85u#gz)h-Q>PVYlr^?~x(L8{zbNQkma*Qy=3^o$b(6oxulhyv=d?v-Vo8~$t+M?# z6Ol^p8TmJd;uIC9Bvfo;1_V|?qz9!xa#~Z1+EVpSlXS7aNnJT%h`d*QbW5en${nBM zai(8KXmF66<78kst2bdekCHVq+yC~;(JD|x zL%hP9Zj1+jK*kCLNU>0*rSIF?TAn|w5|f;sDx|c>(@b?{(diI{OA5K$u z5A4o*awEmYY7_(iV=)>ob>5i30jnFB3G7z0k(G?DjUSS$yETDw_rD4LX1z6S*xaFS z;MalY-QHQVn;DAK zq^{G!vB))a#Zfu!cgih?%;<14F>CnttkdYR{7u2{cJQ4a4Sf8+c^m6-RdYwYH$^Am zVi8{)x=LKld;dgVzq@28UBBQY{CH?A>ksUVDwiMG z+G@Jx*f#(01-MTU5~GFj?$UYrawq)JAO1`@U@)YZDr=?F9uWTXa&>TEMR391anw(r zHn^LdRB=^3#-vB{qUFz&uq|U(jV0F-#ipp5QM2rwKem=(9`}tGnyv0rmplUJBx|S) zpYA0ClkpPxPW8@~<&%b^50;k;sgI%++c7&Ei}Rxy8Q>t956#u98Q<Fk<>^@k%lL(}u@ZbIuO! zDmX`n`X+MIefwK>bj=@W=@03o?I@#~8p_`KTwhLXxCK8nz@s|gK4fg|vEJk{)-kCB z+}mf-q~P!Ag7q^zv1xkOSXZQD9d=D-){j#sK*95;Oi7rZN6AD}Q+LSi$7ze}(G~Z; zAy*qKjPTjudlaGDx;D|D{Dh?Ha_-A#^wfnn*ZMe5agKyP|7ULnhg ztWNGIVw>uT=6UJcWJ{G*G`b4@C3G+0dQV!jvvJ={nS0fou-W1*{gJPifMKe;nuyGa zK0s`Ss^oUl)lRiVv`m;E41JTzbB|iE=NhTG93D6xy7?&bGiM(Z`W>#dmL_DSsz5X)ylmY++fL+?V9SA02IVb!LzTsjKxvSc2ap1BNaaWxniroi{W!_Acm0 zZAq-v<>BZ%4zyIgX66L}sQf=3hO_OL^;L^+-3*U?zTh}?_~++;Eb}4%vGluhpDFxE zLq^N)BtLoLPl>@}I{V#Qc%!Ai-7oqSBYZ}p_HD+!7Sy z`VW3wy!TO_zU3d9)0K?G)(^0lxqOUpv%w{sveG8zridHE22mH5Mhz^=8nyvJqjHDZ zS&lEjW+f^c_|7tNKUv1uvHIP+ov{uJJC||#D}}pF-29T%vJ8d_b$itIXoe7b(-oh?Ijf7+fw?-+z5XVKHL3It-Vi%o z8{o72W3whRLz*7kne22AXEFO}3tC?kh+X}GmJYVWM9(LIUN~*yRu|0l%Le`Eo1ovT z)wX4yMZ6heIYM+f>O@Z@Ec2u(CDee;FRoFPK!i07cHVe$O#+Yg)kGt zFjY&~X|G>+XR!W6N9>e`v~cd+Sd0abPnQh%aIJ&dFxj{M%Jj%)OJ+1ydh@o_{vz{M z5jbz~*PyYCjJe71kQVv0$9L2MDz5Sg9V*#<4cqZK?5ugXA^@pYchRin>a3=D+l{pA z0uJ4Z0^^Afjk+NuYle!DZ!bg=JMP|H(4!h6uzFKJIi-qvH{@J&C5G7H$+_%VY^L;7 zjiVR0`qvNfYLRR^6-60n6{Zy0ui$7-aYb48*gR!9f8k$qGc^+ZOt15*GAr^3sS`ntJ2o4eOVqlPG9g$3!64MOxiv0KI^F; zHF)AHoV$Z-KRMo3@(!}KgFeUV)iPw$`qS_Xv`+eyI;B{f7>2{}cGyo-$4%Z97*>WV zE%a_D!&PkZVM{SlfKdOHN4mdCs82jDk1|^L8fKaMzQ*W> zn*4Q>#IMS0#hJhBzpKxj4DNfApZMMyPP_b3ZAirT$?TI5h5uM=pWOFds#x_Z`fYsH z^CRE;`jDB`rp<3qjC$&aY(m?#%hV;uQBt}HU9O73oel_ zZVJ~r-+VV&0xPnFfImnz-CLWyT)mljR5PHqc+#vpP6k~HL2D2R$1)>JhE#onQ^TL@ zlt0t+3p?VKi@EZ6moKpkjNrg8R{zvz=xDwNj8a`1vAasXBS8kE?cEf$Cua)pZHL_} zMHFuJ!yA|`(;Eh;Golu$+k}BJ2uq+@?7)!rt+l8M+Dz;%+J*SSh5K( zj|DbNT4i+Y$0HNWj($XtMp@1iP`zrpxMd-?r8 z7M1Z9#I0GwmyiEraj*DI{BZlnUvS}|5CzkpZ1uBn$hfo#=xr!MI`wQ3{O+ej-LJL& za%I}*sa)i-G>i@ou|!1#5ECcBL5u$P0(s|F6qDxCCiLZhjgS7vBJ*F)j0eMm|5x@#9zAxieE=7y66oY)ycn{s5Ar&;Uw7&&V%UQ= zozquJ_VFRGqZ^exRYbQJVilAe*VJ(00D^=S&>)~>=m#mZeIT9A-m|3f{F(BE z>||ZUQhyELK*_8B9>X`223-<6@BE-KKSG*yY5WfFMjcEQRx$83**Snqna5i2G0hM@ zLi}x1m~7+z-Rd&iQ4ZNEJ4|P5yI#MlcVS8P?Y~SI?9W2u0+;k%Lx+QNniL zIf(8>i#&6wgV}bf5#FxKqxSm6IW7m@hO&iK<;9p@iv9PMX6>w{f5Z;(sL{Et!^qeo z$Hg?;mu3T~fX#Bup0;jfLiP~N3R8l&SeKSl><4{!ssVnT*@gC}G`L=TVSrY5eU0tn ze6X`m4waH%3~x6G)4nR0-$mKmnqi?=;J6B7l@ zsXdk)#rEvdS3cU{o%rr*KUJD`u24%YaCPUJmPTaRoG1&Oi>~QybzaE?0vD5NoKrlx zJXn92`kntRxLl`+49`J#f9c|h-_B;o>*v&j7@U5j)QQ5w` zlII=rGTWqs_CFZAiEw(bDkb=*5AYzq1(k0j_3)43^wmkx((#7@5ePxjcR5DUo6`)J zU+Se#&c^>^>8RMtaOpmnEMj&Vtp8)Vnm1xw$1(SA@;HimwJ4bS1y0sXw59~>f?UU^ zO9D#gH%5tN6-tU^=|nv~1l#X-2*mJIexj!rJ%YNamj-P4(Aan{BB{dBdgTO>3_PaO zK+PQ0WM-YfypE|)d3>Z~aUkg$NBZZydYTIqCxV8Z)B*zJY~B$Ie^aVmWjMUTvwg>_ zrj7#)GsApK=SGVgjWopsD#L}RGQShhaNC1bddFlRTxR9P=7DCqxNV6ez1e=E2o}0& z5VlVMH-o}ysNJe;ijf&;fA_W|j@GLY@0YH^MZ-;GDY`#niH z7J-C4t<7%@bU4Bjui$U97$}Z){QlFreY)ha^^?Je-fWY=PJ5Rr< zbHJye)Y|^w-$;nFG2MW+&(AdCkHuGP>eMbzKGxC0k)skDya8wENahQ+ao%@05#0Jb zfn8kERkk&d({Z$46mp!>rxP9&klKtZQ~V}teGw9a3NqpqXIIdcs@FIc zK20vUh~aDTNRHyOgi(|)CDd|e+mT_H1-s)kDt4$grAq@u^g7DRi@0S|Hb*)E#$r1GJ%kPgcA@@1;RzD zp>^Kr%hc;UuGl7K4_=}lk7pJL3@_=Am(9*qGM4{neRC=?lkeEtuu~7)S9-~(JrWA~ zjWf6KD78NxWOl`E!3SCN5`=4 zcBtp1wRwHyfSzW={H}+G+vW1+mUEJ_kJGMzF7yhqiC{pW+fRFXgl*JR>`RS3Qvy8u zM(nO7X|9N7kwrxm1xZgkbl*x>sd}U2^|Hg%t#kfvlA8_T@G2~wRlogWG8BeV%uNY- z;Evs66#ES^Qvivk)26*w&pY7HQG1-bQeGg=f0YoqfvFO0ebEIFKE9YpnBatU;bK!( z8zQ|y@281Fb#D02+F9AwpIXhnW@j4Nfd!Jat0qtzM9GYp$DqtNc@7ExvA``w-$oUoZR=z7TS${Z7KuncX#v4A)mRXr zLW3BBwT^X8XU$fYRM7TO3a9VmL)ZSe1(K+`x*i^x*6I&K@jPAT6UdMQP{_16jlOC3 zXiBq)Bl+>7()RU;EVC=e!rWvdYfHY-^lD21?(lYun+GpNQ(tei`|an-rW9r#d1KLT z4(Fi>FeU}v8@`MhzURQu&N;xdzkzz^m^oK^gx&H0*TOg}ez7jZS zM{FE16(h5PM*q1!#RtC^4~r6%HbiC{siIs9httSay#xAF#!g+U1KKj=YiEKU?BuC} zC`j|%oKv4)0UxCg72T2~NkT_VMs+E`iu9_E@;cgxA*p43Q;!bv&gD-4G&|pNO4a4vFI`re2hK0T{dLifODDsl<5F{slXG|Pliy5x)R6+k4MJM?#IA}T^Y9! z)HE-)D)5to-Y5(|0wNY4qqIY}TpeS!{|G#rDzOfjU(Gkvix$lGfGU{vr&;Ou%%$Xl zzfNO+Hb&D{G<|-j8Z7Orj#sSL`~sC_(ZP+ie3~QGv2-|uP{Q}#UUw30R76Z6?$mZg zv#SFjSNzFMIap#-pEG;~6Q{`at}Nml5`&7SM2ffA?|!}07Y=~0adR}w$r?UU?AP3s z&0HS9|D+m@hbRHHiGOLxxA zVLBH%H=H*wLl0wIHpPoJ@E-<8m(A=-A*U#UHq)$59+xVQV%_@v8qRul4ZI7M&*~yx z^;XPt&quboI_Zjb)kkefHXlD1ak!H$Y29+1`d!?R-r{MZT1Jgz0M zUNRoz_wO|5Ah}`tvPdgm-LP-tSN$yCXr>QM+T|O{T!8m&-j$k_*ZcguxB5~7Stg)0 zp-9O*ObCVJZ)c;MFTd(dJeFID_o5-y%!e*W<_f<*))Lnmw%x?9!iOiw%IXM%r2oY! zgv6@==@_wvR{-mR3Ux)3$_njDSk2avw>rS0sKDV^x9W)}S3MvwWy2pi5+$OF@1S=U zRaW0w5Z>PmaH99r4wFZOoIZ75dhx~RE%Ta%G#21=s+CmljvWO?Jpt9)wOnL!_9Kp2 z^MuQlWd>NEUzhhEG84Lhruwmk@3jR;QX%?zd^|D9wwli8cE|tR8tCuZ-m>hHlMM zn#s>IBcj&dm3+vi>kbVNst1|TUB(xkL<`4kyaevMx9*=B!u2UbH@ zasap~s~Z5h39In}9q5_R;*HZc8%zR#FJKg!C(@dyF(K7p+a-*I+A~92pYhuKrBkTi z-Wii9T4}3Re){H0-%>-eau|nYrd1B4ISe zRV7EtgM!X#vLnlmc~EHGgqLck$_3piSggoi>-2l)nHbqzqGiSy_v(Y3fN&9B7{sqr z^6wc^IxfH}ux$19F0WVR_&}nvr4@Iqm!R?OL$gN#ozx=&Ud!npOE|Fr_{78Bi$wY} zt1Ay2O%8T?@X{&U?f8%>^f1EW?6IxrB}3k zV4DmU4wgpub-rJS^7FMNfc+l>I$_0c>ij5X#v(|hK25o!_7T?gXSG)It?Snv$^r{> z&F_3Y&A~Qn^L<4_LWR3?w5m2t#H0c$bq|$HTM}~ne>j3OYy)w!THn15bHQ+0wn389 z=_cS{^z%;t_%fwEmoUCGI2kE{+g#HaYvYU-w}kIhHF|E0Wy<@E)y2i@1^S02+~!~F zuexhz&`sg6K=pq3YuJwm^Oq7*34~b>K{7ZMW+<}6h-%o6(y^rD^DX)fQ+&itV@Y>t z%s4lhcg=1|J5ZgyquhFMGB@nSbIxgg6e@28si4+i+X-w*5ZSw_r#Yp7jlOK~e{{Wd zSXjr+WuK#`X|!g$hX zER}44=)$F$DVzKdO4fq4nU1V<*Fw4ajIGkd#^wO^pdJ%0zM%Qu*@{x6SS%gAACtPl zYC-5ru-UiRu6&RHmP|hFwwhBg5v*M{gGvC2%l0dCm(31Z8eG4sSf#oic%tfqSfJL8v zg^osvE|S7*V9iv^>a#C3C4X1-^Q^mv%p{T@oG~L-JnI1yk5XKqjyFuOGS0-@Lv?Qg zX3i{C#izP`@sfc-hl-qj(U126)?L~Rt*pXh{H|6;?%C+=U#%u&IAm?76&NI2f?eE$ zqfKM;Y8?FhiHm`EWyFn-pdW!XP?U>N;26ZADmVg*>wSX}$&YJ03~ZGMYCjk~?phQR`z|KkxYTl>nNbW2Q+noZ=x+hrPDu4Vn zQ4Us@f;jjM=vrc4aBHXFUtT*O$wINBz)DQzYGchmI@%q+L5!NnpY$7w0irDOS=9lM90rhkxyE9tPbc|{&Bi)_!V(#+?TUJH!nkPfVW z>1MId%BF*a7nC8YM0!S*Lz+(8*?o}F*}$hPW&X#pg|P;TB*tI0yhQgwdkC4S;h5{N z6tASCD~4Nn)J?w`x@`BsL&Z5VtVxpfzJsy=z7^J*l5yUThue| zxZJ!HGtr?q6h=0q?;ZN0y5GOYV0LRb`!_%c=zJ&W<;RR9I=B({Fw`NT@ot(k7dRkR zi9O%d*+%(`@z#`)SM>B27=ckQ)#2Q+P)brTwV#uuc8lwpU7kS?BKk&|!sk6k<0WaL z3J%hMXc;y_lsq5)Vj!dAct0C+h8l*GJPAWl@1bx#ec>%3n<7o4p(=s}eXcF*U4B+`zOo zuyyVkQH!2PjrH;tdujF=tB0R4{S1G%)8q^dVfa~g9p`tb7BA|hqMA`x#jay-`K~q# z>|H?a!@1}6mIqXK zSi3ClrDhtxwxmWi#k@JB?EX-jAiC^YhOoRRTQZ-Q_lASq3-}vgYZ1~)TPqQjtwq1P zLUqqIV)j$uXSh&YIb?%dSs2NjST5# zDC&bM1ky>vjc#WvK_y%!gG$GDG6OllRwr_)Qnkr^3b z(WC?Fhr4PEf0OuO#>6y=ZfQ{O%5FHdeB4v3@Hw2!B4nU9a9y4Ejykm?I)v?~GP7!b z@8kaWXK|~{N@Kku$R6zgsnu6URkB?F-1a{u<2*924GbrL)^Pp~*k_p4o~^t^`k5jo z%j@fG^Eo92_7_Q|`O|Kg)gEl6uow$|rIFQSk+tt**?T#cYMtU}ZuJ{*r4)KdQ7*P5 z*ecZ0-PP}`+*e&shfo8EoB(DNXlURo9qqRlpFhM(t{$0*H0Bfk-ge5!B-wSLIW7X z5mlV(Dk0v$=xsn@Zug+5QbuI#rSjtFUTx5E*#_CA`kzwnD??DPO||3OPu!V=SO&Ka zWAvNT$L1c7TV(Isv`Yd>qKc3F?4eqw`+56xNwC6cDNuU8jw|Tx8JaQcW8mR^|Eh^y z219iBvroH@TknkQvgX8#^s?NS+v6=ny3ZDxSNd{}9D#-lajs8vgQ`>fobvWEP2G8~ z8*lW7;F6``ihUd*`8+vS1fPx(6j<$z4@I3& zC)p!!orY49cuO!Y%~&4!#DG|vim78xY9OPnzoldIyLBgjul6^RFjI4x0!`|*%i^%a zUF?0?y@kwYYn`*52R@kjI$9-9LNiq5pRYRpH_>*dIBcgub7)JB=`tpae-b}EX^0_~ zbc#cW+uT1G87Z1FWynPFQBcJqotc94ej8h z+#@?`AVIob$MGG`V?tJz3!C^95E7_ipH-@qx?dO=A{Tl{*{rAh7?QNmy>eAg(gIRy zKxMK!&g#sUiFsKfTpp}JM@xQ8Kg%`gsz&EoOb%JP%X?BRDQ@%i%m#f3=dwvpj7SIe zGdrJGYB_!`D5HS{_j1DPr3YTs7%19R*dcWfrDxmk8u&a>JrjD^-%YP>VzMA*xPB2c znvy$+a+<15+7mZQ_inj&ZKX@PB(uT(tYky)vWeA*t~mTj&*K*ZE(wD6GE zt+xQ-6PRGj7LcmCr5W&C^gTxl5W%C=gE?qZOtocA5b%tkF-q^kH={;FS4Fhg?bdUJ z3+4Uvj^A5~x_X*ObxkA;L$!rONcQWilb$7-S@dhr{wMF-yv6-|K(<``P&-Kt!w-pq z%PwLAtkIgP-p+A$cuL-HEE1+f%Ns1yUAA95+L#|H-szbOV1FH< zVnB`7`t}F>fAjq3lhuQ7VTzr1U`O(DQY>5246PWXzq-KRd@Ibb$Z1;y_$vDcN``z} zhkT3cz#khQRz=n25{6|w{tal`IET9Gwy3`!c4kb+%a^%Tne4b4zN;K1^3mcE{ox|Y zzX9VNcP7@&MRiOv8MS|1%e|?9nhUHtq35f+56|M!?3P#ot%+JT;_j5D40utf`6JG$_PC9 z0Sy^sb42trUMSF&R8q7w>4VE!oVsfkJf>~tqC$zBm2iP-2Po$Oi6RBp>woUrZgR#8 zD(uUjkr5lx5H&I1ts>3s*m=pDC}BPV!FM&RhG8d_M!CF=v@aPXKt0{M`~@AOs&UTB z1|QfJO{xs_lf7#kNKr%GtQRNA9U3r^+~sPZ@P+{nb5M~M=1?Z_fvYKjO?hJb=qhOrK%PWFqaBZ-w)tFFF^7Q}X;J4X@9?UFBwPa!J`9GXj?X zUDkhK3V#E*NW5-ql@W)Df1Ox`8MxleAr#jok>hF{2=esy0u}bcC%5zB38qE|swpQA zuJyw#l2mk^E%Ef0`=CjBJ8u9-T)iP&L1*zMNv4=o z9_(Q1mHbBaf^EwS@FG=L__}&>Zd2PMdKq-o`0xoUu2?Jct|wxQ!`n&UIH9mgKdfYn z{6ZXkZtqEwZbrewO1JLWV&#K>14>4IEeV`m1OWc}cXnZB+ZV>$Y-Lpc;75TbTnoxDM|B2AIfUEB5%mO|2XPwav@D z9r*N06*ZuUX}?Ez#fefd6OHohZ^19+h*}X<8p_ToVX^*Vt%1u8bMNv=(gV}l!riwg za-O9*=#Uv^%6pp^z0S6zeAN@GCWk-t=qb!~uAz=eH0l2CaN(*!go*bdJO|;L-XJ`} zt1zvA@XA41ees*x;})h(RSln?V-jFYH%#QCY2*`2Ehl88R@`S@wV4uY{q8~sb9#^s zmeE370jvCw%8r7Ww8#CjSGbe2+?)EVJ%}e6(AN3vU3SV%(;H-8ZM|A5Mqj#n^r``G zn9(MVH_YBeCzk8K{|TLqx+=FlS5+BRXBRtyw#QWe_u2Czj)J%3-2X1mds;^4oTry} zeicdg{-5NHgUX8p1{@tzlnxc9#$gNcQ`4EttP%7RrHLs?RckFsyFhCGQm^>+gQGAW z|2jotBMdtfp0E|phrTF)Wu?EpA@uJ&$QQ!63g@U@VpKN$!Y#7vsD79~yCRN+3zb}K z32pRi``7^<0RFgCsc2rS|J2M)YFEGSU&DR_RHv2BIj@CI{(UV{I!t2QB>WKcSw-L< zxM{~2Cmt$!l13RrpB{vfcC$4VL;2Qkx`W{YeY_=*{D1~+HRie7HG>Ax0pr&uEXy z>@C*6gohoFWX*Mf=DlTzDRlh%U(bZ5zl{OUDZdn8hVaz5cu|X3q-B3Y@EHAmfHZM(MI6Xcg2$s#+y5?Gk4YebQM7+>zoylb}KRZq(Wcego z;R-{nGu@x&vp+1c2!*9nYv>z`kv2)0zKlUqv7aTu78H)an}Tj1GIjap9U=&Z%HgVR%}9J~riA|To$^~^gE-T*!> z?a6d+b%)u=849M)HF;rWL(Pdo&EGz4AP=tPUtB-S59gjBwXako&x?;H0ZexP&Q0Zx z7u8{k!Bs`gCic|%%;@ua)z7-3jtipYn3eb2?*PD!lW_a+!8cT4FPcG0@0KoszhY{G z4^%Hqw*Gw?Qu@kqviS)0lOve~xOfioD6Vn;l4}7ka-zx+vZEyLJyuIf=sb0U$<>ol z(mFU7X58@N+H9Pq-{CbW^HYvw2EF5OE6YKcO4r73fEQHsCicy;+D`f;HwaXPzFlB-oLgMi_b;EN#d#KMn4U7w7-{>ACiBD_D zso!Eg?0)Xsl?o=VbPO`Esxo`gIhP)a5 zGOw#wNvDqAhP1wt>bbNCP_K?{N;=~y^k-X~$94k0q`Pc0XT^sD3Iu^@Zw}FF+CHa+ zNoPMzC8O=VlNPpTd?hGs&E`tGD(=?6r;%9OJKEh}Zayv`m` zuyozczR+DB=?1}_x+{~I4+AtjZ2Q_xchmCg7!%MUjk#joDuyRFubK3&O3O|;U;=0X z#Xye2%Rhd_=KRygk}qul0B`^EY=A$`U28~l+aCCDz>a?N%YQKUYu37dQUO#}yH3K~ z9E~f{{os3>fP}D=b14(;bzIdzbC)7qgAh{nU>UyVl@llXWKC#^nT{Uw81 zSCzPDk(MT#SHoF^6jJu=Q8!yJzF@S}a{=cgv5&Pij({mItpGm&Je;|vQ#_zmH`*KP zF84V1C1maLkX^pU-K>&!#!~uwW{t-%GY}b(xv;FbCa3|QkClEOoXVzS;-te}HJnzw zTs4sE@N!ElNR9~6V?~yymYK&nmYQDGC%=|ZMyBwh0xz;mOUVk|#$V6nIJFX-#h?#c zno*)hZ7KhSGUn-8=_Ayyl!|{wZJY*SX#m!Y@Bb>C8zAF=LDKpRFR7WDk@Rb!N*qU>gUllR>UX;Y!>~ec&O}`M$8yp0 zJ|6C)m+XlR=Kv%%YD+Pk&=2E{4A z0Y;Yz2c!zDsim0q=8(G>``&*u#otA8xK&~hK91KM{Fzcru*G0CnRZ_{_>-m@cNo}v zZL%%>4Sy{ij3i6=X$9grit4F9y&<*BB4WP+jV?c^#3TPbTO!#hoQKy0&5Sv_pPPV5 zESTnqEeOR`xLrH6416(VQPczl72 zI`2$09-cjaT=(I)T)-__`g!(KapuaDrxCp{%2)57yn0?;$9em9@@;Oa5?MylHb`*` zSWdorg#f?DeCnOw7Z>Enpo`|NaKMHN@5c1&af@bT>-B5qA-RO*D|EO=?Stt24+#@U zpC%T?WBDPsX|zdx*2~Gw-XI<`_t@(X!m?@DlauEreCTIjZ6svMaq z+hk$NPBMlzaAx*}wD)+ucP+9vczJD+N1A_(|I*Pp);;HtRWWzw=&V*r8ot)o@;PUD z3t0YlRva)tzf97I>L5D1xPL^Q7-~Ygud=c0MG`vA>q0!jAC;KGwR#u}OX6hAL508^ ze2E6{n^J10rD@@wQTcSsl1tHFv6WQ+;I33L#erim>)n4LGT;3Bzw-fbWCffcO4=qX z6-k|;x3Ws1uCK_(Ap94+=i-#5pVZbK+y4fvH{&=I7J*Ku10{3|IK+weo0P=X2!uHQ zbzC2WjWUJyBu*!}RX$^1*NoeEfzW?1PWTPtqlysnIK}Sat9iSWIRlP06~Q%H3(!?r zm5GX>ziRxvVz>b2x()Oz-XCz^>Rc};U=^QD{swJ4WHY||iSYKj z9e|GP$)k5w%0a zlGch^nlqqgo~h$#SY+Lov5mZgiaP3$rHD&Vd6Bi|uxWaZkCyl8wgVmY+FX*7&fYL7 zdWh2WYKh6XBY;(O0e$ZmW7YZ3@O!eJd%b0Sf9>A*a3!@+)+*gB8-B0W^`GxjI96eHgxhS0>0lQdH(0 z{`DokF#ZN9UUf2j=#R~J%VC9zRHSfKlFQHwosnnnNTfw~m36=|TH!MvbBJ7_raOO; zCeHIBc0rjCz{dL<5HU){uBU7=iFRl9N97s~1i1K=?7;9|0b@e?ineqkHLJwc%nu8+ zv#Z);{!o4SOa=8i$%cAKf3+UFL`i2*PIk7fD2NMzzt~jGaLidhi0Se_+WQS4sxQsD zVYg;7{ZX#g`MQJ09kOci$frc1Qp?+TQa8o=OQWpnMqdZ?45A@bGU<8NHpa5oyxztBz;Ws7q8z2X@$ax(bM&E4Lyegsx zNo6-VNopx7duV)h(5&Bg*YX$lxAP@Ix1euI|O{koAmntn74O?K(=R0!Uxu@3R zyXx{5kJDGO^lA%+No<8|$P)XAY8CQrJOw7K27P5=ig2JGa&0a2B|0eKw%N!~vG{{QpKjjtPG@OqQe7gSkEQ zysG0k`ZwTyfaTr{x}O5J_T>97me<23rz>L|qa3YaOjlB_hwor>A4D+iU~6d%s-W5L3bsr@0JWNyFCvt^DC@%7v`|TlL9H$rCNmd+Jvp>!XNJ zecAthomA#wdfUIeQk=26&b1RmI)rPkt&3Cl5EkTwevx|tiPaAp$Z>C$IPT7cU=R8q zY>s7Um04^u9B41Dg!HQC8L853fNtOSaX{3iU#l0{aQDXs2vj<6M@8#R&M0`J7C66x<3-5-;q@SMDpf2 zU(+2g50IGXOj{-dd9_3OM0du#irCD>7IkieSf$DSCo>nZ4TF4XG-e4g^~Voqb~Bi8 zU%=0Gif*8@|5Rw!&E_w1zIpNO)U~tXQvtr`llYyeSbw4Y_cX?jI*Z4P)8di@=saz5 z8!%X#4FAV%9&S(aBCHenn*{}!nB?GhA6XU0@J8dmidAxwY*BLIfG*IQ?do`x{x}e_ za3Rd@qaRXfkDJ96;4Hr#TvQo!jcS-*oE#2^CH)1$kn?EReSXn@*Bwr2j?!u(o--Ee zd5Q31?xWQvmdKSUe2{L~w_`HhXixxBnw^pq7AkGaniH?~jR#kw?qI8bD$y>>9p&ng zKHfW9fJg`cg7X!%p@ub?KR}owL!u|#r4QSomkp^02P3>Ts$FL;`a*-QCZ@+q47H9Q z%Sl_KzGX58N9?Jl0~7P`mS}H?YaWG)YauA@AiqHdIJ+Qf%QDja$=BfZI$~ z*!u<}*oQc0olJ~!)Vxqo6HB%Judy=2H-)wM+ETR4iw{V5>CtVs-YH`NKllo=A&W(d z6GuxkcdME+mr$2)`$iL-0-P1Sb!TQ6-n($AS<<14V%Hj_P;;-XAq?!IwP*FB`z|Ro zM}Rt_-+Ng`YIJ&9?v@0JtC`jpJ5qi}^l|7Z1^J&{3&^(Xb%_x1Adfs7F}N8}0K@k| z1zO%+rZKWBQ7@~PBbbtaq#IetN_^kA#9zx%9$J){@VR zP4=m78k@fT!$gDf%M<0B8hh-2{GA5iR0oUyfqCM`$7BLr{NwFK%(J`u$L zAfilM+yRsyL!}IP#^fqD8g{z-Dq2Q{%_?vjeq!~t=NV?{vz9a(8=^`tCkYiwPitfL zg_+OS0t=1$yg_{0vw7)i(skY4#f5fti7jPXicHC7ss~x*;;fy?Owk(omb?}6@AS1& z6Wux#+akti3>0rC*GSpw@enEug=6DB5()!FqT7l(Fupw|-&civiZ_gfXPG@p6`vOB zR_8y@vyRg-5wSK*t`_LUnSgA`HmvB%1#5xw-N^$O%dmVw*xVzgMu7r|cMGx`VlJN; zoOw?T8*I0zMNHekDvmJmzt@eNSl3&Tho3|tO-VtrdJ57<<+Q#l+^(8qw+Xd5pRrhe zHzy1A0f!=~4iL4xbP-Z+cOjDk^7%&xIEz)cM$654Xf3W*@vmKmcBZ7;--$TCS54HT z`c{Q$eo8+P_N0L73^U2i!9e*`{&J`D9Wy;3Fqt-{v z^P-Z6)Oi`AP`HHY)t?%ReIA=QF}=>bxFh<0g+mP>qEYSqRWuKjKdZ{?ypo>7o1 zF5Xk76|DQXmqlESiBnBkqr5~ai46I{<;566{?Jloh4?WSHOb$Xu&}}S*B3+8`sumq zqYQ!Jjb&)q{iY9Ega)YL#0EpQr(;jSx(9e7&votC(J)hUC|K3Kxwxaq@Hc=IvuRf8 zx|Y;drAg&hwkuM<3zw&}D;4Bh;&qnPoexNOu=6Lo`+6sKo6GDMtOUAZ}r zHE!Qj)3uOK_y2-XYe+v6S{f*#aJj2LYtNQ8{tagYuSgF_eyRp4EEUExVhAgNp`aQ5 zT6<>QY~klN^ftIOpxoLcvjTQQP zwmg;z4(BHK79w55%>+1Ujvvha{eVKvc<(lbCnISO_~onJ*0b9IRAi4C^%rb0h8mPS ze*+3C?3Q>mp4f1JnF2ZA=GYHl0?M901mCgyD{7CC=WUs1BwQEj>E63GtgS?8z;Dln zC|}*R)Po5q+tvrG-!)_X1lmfK8#USD5*Sg(ROJr6TwaH-YbdfKK1y|Ek;S!Z`ksgv zc<1hGJj&ejyyH<`OJsC;l1?2UrtM1RX}S+3sqeNW5+k3ZzBz7Ytd_9q#Ke^wH^N`!qZS3@X-R2k@BdU@5wdW{$)n!BBp{xV1L2Ys*8fX z+9PQPV?B-+iby4sgEMe*8X2DxTl@`37>nfX`Zg}F>{s{hJy-}?`&>|E|<_PR%4TGyL{2&e@RJ=M}p6HU;<-x5koIbhZ=iRt|bNPZjVW3}bH4IvrA zsL8He2&IvS5>_u%tQ?+~JA6z_1Tg~no9sW_@6jIx9x6vJLv|pyA~tQ-_0*#f??kCcBGtwK^=~Rp1Ws7p@js&Pr*{WzTrq1idhdiaeVVhUH%I$aPU&zpg{C?nk*p zA7Wf7OEZ;WFyz%{mpfNg$#aLW_67ihz>BgOSaBhzk)|H*iO)Xn3)`u-BiOT3dudhZ4RGc`#YI&VNMNX5SpY7nAWgpZ(^ zfZgh}vu;6F2XZHIk5k`f>}jZ>Iust67G%n8a}X3Y#d{)H^5vqfLp(0omNk&6KFgqd zV22tgXvRP;nD;sj-xL-BJq~i_eZ4!hoB&jkr9M-eX?|D4vz|Wst?#}oo1hBW)cb(P zgP(HaNNi?xL+K~ZJc;oRtef2TYDFSTlzM9e$OZdv7u#W>G@PO~5K|$wkIP}!0JUYBC$%Ze*;|014j;~aBEP3U`UpOsgL3W!X?_v;iqpRAw_##uN zR_DRhr7hwi0!1I|!V{oJH!u-FFC(U=kp9?=Q;Mbfi}6`sRU>y{OGdpz!dQ;bynKh| ziXckaevs?wpeCJnS{1vekB%tj18aGgWN`|7AH#m^G1zZJ$3GflAumy;W`gdTG&z)$ z|0G4Zol%amG{k~P_| zOc+YsFsL5*@KZNLzz)VeUJS81h*8tsnM2|rYIP4%P_efKQo9{$4#k7>tN6Wtc;2+v z85Yx@s5AmDm>BgPn2^NfV=na{ry0@cwnGE=9?Z;_aq+0Ot@1c_*|S4FDxpx)X~4v= zeCiRo&%%Np$`v`c$X@~e(%c|xir`fLyTDqbBZtyY^$ETPPQyj^mFc$ltA~lYWbegQ zeJWMmvnZa*nzz}Dc;vZU*zow>BQvBPAo-a%AEoHsZUfh8q*~a=O<*7ut$_;Hh$gzm zTI~P!;-yX$iL{Ni(|O zn+CW&+i!zM@0bbk5J)eq$-?FE*jP+;fr(2z_bNe^^`VGr;QO2wy5(c~&Ob|mx0u?P z?0O`eg})EgMiU*gn$E=4gBJ4wAyg{Cb#}#bBJz+$qB;D zsyCK10ZJ`yd%L7u((px^QkOJi@s|MU^`^+YdkBkXnQ@&*oLUJC-;#bXcWdrn$7Q+f zukz*9g$y`mHbBLJOt2nTA8Y5aem{G!BhsG1pVhwsCtWI&>POjy^)I){b?5JqKPy8| zP8q>wt)(nwHN|44?ggg$$9G}BHK57mCXHeZcfk2WYPe(NN84kNMG=n1!5!bJyS^Ul z@;;eT%68dslU3PgSP|YOQ*iCDu=8+bOe+qTP4el6_clk}3^>r;ku9r$2rf{FzJW{) z)?zL1H=@*KTQBf=V>OIYvI^Kn*En}i5nqgHfvME2;0UW(SKqjf5@5k(XvOJ>o*+j1 zjTB>J{gavRp6;06?N=zZysxnP{+l8mX~rF^N@{5nqBOJX1NA#41wQHs$)XXjbjVMH zC5yU6BA-NmO4LWTy1SKn>SefjHjj=cwIe&2L8RJDEdediw6AQ>p4wrw;v)%R9tnW2 zPp!jukkG@7Y@tWnwie>H-6MIqPGjR2hE)?Pw9asedi|1}g_~*ZqsZjM6G`m8-OyHd zgy6mm&C^8`(50GQigO2JRy$bt}{_CnOt@Bt1POI3)jlAcSrun zlzpSWOh~R%QD@xTR5k()sWYEkS%e~8m_rGRC>GP9n6(ki!_nFK4q(3wueEVJ<#w!C^5xS185U zI3?Uq)faY3D4li&XR5(B9=Z+rOQ8&g(Q0}5b?svAWuLF_O*nk16d9~d(u$p4@Vx&5 zf9$n7r9yw-(eX=%`$g;Fsrn}8<|l9Wjvw`yr`qB%u}Q63*7^2mcSx~0Mi&DX+gQ4_ z7usLlcMGlC9eq@*ns+XWq>`#pscA{8r|8&Ik5Vc74cME2t4Qso2a+_gl7@%AHRQMz znok-b8TRbK>Cs_5$odJ-2YV?LAiWVOyw660y9wCWUXeS!%ULo#z$El>CXR`IJ#_1}`+LIaeOo)JM;y`Pi*aSgNO~HugmnmKqXk4Ph{XfVrj|v3)9& zmCsN>Q&^{i@BYpQKZQw1FwzC4S%K9O()@!93Gqly=4%KUglAauI|!%REciJk!5!K2 z+BB2F7B`_8bMjGmN6Nv{X}bv=SfgRdM>{MT;V5`~sOOQik^o-~cs8lp@ObZnp|(RP zR5kW^J2H6^p_60Q(T6h~FV5l+7dE1Ec5J)b9S3G3?8ilyoX)U_$1AwDF`9FTKK(0? zP)FWScU$tr{(Lb@{)@qaN3TniOp=Q;-tqfrFg~|k-gT7<`3NsXP5%xxww;}#b7b?2Fz0!&!=Jewtvtkn}>M+-MInC{_}-(@dLKo zozDR+uSnY9f6>GyBB426jC`;q9-KFJ{y7>JLD{0UbkpoF<#$rt1=afaI|o}ozQ-~p z)2YG;?d#p#E*;;BvTvv@>X6_%D0jRB_l0C2dUsqj6*A=s-gV3*E=B1(JiPVn=No5R z+jp)~%%8V)G4Kdz#&JSJg4+VEo;k{1DNfbVdmP~@H0lSo0KLMb`AHHKQ>i0H+IDJ4M|tccW+p{mbZ=}|6AQdzsFH9x2G+lUsaRtt0|Ue+`H4j ze9ZnbDGUqov}u8Y1@pm0Eu|zTx!Hcvyxs0&A6wm33|xH5-$lYKbYE$`FzXt$I%+Oe zKASL`DzPa@++=iBEZlM#DK5v+BzEYjRSxgpZu2sb-1ByAa_}%noE{?C7LT~5wrStd zVv`p;(vw_ovv>1#DoOZc!emp;le_LqZAM#S(&1gov*Fg+>4SMM{WbQXL`$TbWBgM= z-$xo;bf)QkBI2X9VIO3T!uY@&Wx1!aHBu6ZqoRnh9MY;Y@;WbEKWh5$+cip>L|gWJqDO1HLTo47x@JCH8!# zf^jdrSHvvc=`x4cd`c6#mptU=+{%0(+P2 z8;wDizR9>BALXkAl#Tcce57EfTEt7LKF1kJWySellJg24bW72P*fN*gf|-KqY{8#) zc}cD9{R-kh)Hr=n;7?}l#;+SAE)Zk2hhA~ca^4ssNz8!iPTD0Px7b}aKbfbmz?{Dw z5>g0KNnLG{ocHLdg)Ii+F_xqVOrfZP`E6V9B6L9VY-4PsXt2a*wkvjJTD)SY<0aSdNqOmp{#hwK zt%vKYnjAHnSZ92Pc%X+_NcO{n5-M;>-Ub};v1Whtm^4P31kct}RI6i!4&(JsY=gYVN~I)L&P)Tdy*9V7IMGe(64!HAfh^EnYO;=mrQ zv^wEZr)eG{SegA`9nnK9?xI~Ua%AEj3MR^K?OpAclT@+~X*fXfmRDg*N2vC6xJ6qgLc=$NOg7Y`vt%72X&zt-WDL>%k7a}N4Q!7x2JMlOJ!n@c= zqq~LG8Y~fofi9H#l|(jNSuv~r<>&n=2Nkwx4w3?CS*ib%g3*z)B?!UeapCmPE_aG* z+7YBL674uQ>`+cp;NmETI@&9$qF&EpL%oVDE)g)(yAM*{2-qJwZtL-VI7?C=s@En| z#dP;=kofI*qx$rIiLMEuUp9J8BF9PlYm$9psQeSuPeqxc+I~%f2kLfVeLIb_km4CA zXTA2>2XsraZ0-;f3>GL~JrqjXU+N#Nt}W;n7LgQwBx(sUDflgrqx6l z^+Ty-9X!7QS5yyKbD?$Cj3p6JvqNyNvuv_{QE}TYpB1kdU+v1uP1m9u&>yp%FBm=t ze9+ozj+DHn`8ZO%vy*e;T8q~<0R<}hC51{<9H^+M*Pgbg<5o^pf-<$W8`9?38`uvk zgEH>?iVb0bhHYOWld@CTnN}`6#aM&(A&%hM5``2$xi0VI3^eb-R2c7YvZ&D9jMd7k zBIfGh53>*^&aVBzQkYimi9?(ZN=~=d6`y(Gz00qc{oV|bQcWltT`|@=YLQ%72m9vj zC2_WE;-IeJnSk6AgX@7py`*-KsdlnnoOYsAnE)`j)37EmX5))V0dnmtiP0sG}LmW!X#F%KE>*uaeB~M_a(kug=BfY zk1)+*f^I4;BbQ_0SF=1KiwDFN{n5JhNL!Kwb&JX^yZmo8k2fH36(+oVMnB|e7Ym2i z7j4TxS&9Q2y=Izyj7QZ6^3kt~ZgyjN9MelpBa+%>L}#RMh&r!;mT2)rME~F6OF~ww zAjUNp%{wwHZu*5&=JD)565|!k_HP~xBc@w;a8Vj&pwb1MwY08tw;LCe8y)2U zy>3!4r}^vCTl}9s|G~sLxn|a2|B%}^-bdDsfKfeXQ)NA)%j6z=R?Sn&W*VR_ayb~; z@wG1J^A_~p6|)X^d0(Xy{`B*XX-yZDt-;5D9XbT>wtfV(VdBko_~{%J1>?{yb{P|? zoCcW^LRNxCCqi%6)DW|u;_3)*TIy+?2aQ{rS#8NY5w~!6eKYwqPltS#-{1FMElVQ8Ok*v!Jd@;a>a_wiGg2WUWwwOeLY^{ zZCtw0+`%MqAJ9#k1c%=C2UB8QFFThLA9vZbXyBJH7(GuKB@O$MUYDWqwi0bWjG-D9 zZl`5(@p8;hi3_$q>OB=vqjr7Ao(rZOj6}Pg@Yb+&%Rbrp9MdHn7ssa+*x{W~D*?i2 zJOUyxDF%;i;kxX%kZgt;2ChFxOH9tAYCeFAv(p;9tKP3*oin-;@iit`O$TSj39^d& zew6?XIw_DW_jxP9YeFE30JtOqqT)IARLNBy`MX=L&e zrIbJQwe2d@C6aWu@>7a@mcAH2*Cdfd3PXI#JXI`Z%+KO;z0l4Fi}ysBMbgk6IzyPs z%gRH6CBFIzJB{m$FkK_-FFY%(7mM~c67{2r-OVB^dlrHAd0-fn=_TEz%11K8U-F!U) z^@X#y$GLzg*X4NQ59QaC{uaNvmQ7NU7So84rYn%YGy!ur zbTJt+6!SxxU%f7*ib4E1ZIw}Gj{kU1?6eEQcud0rjo@#sKYCbmyYRK{zC#?!!?30+ z?AD0ybl~FY0gp$p_s*)I!8By8ERaEqKf&}MJw49Y!?n*Ve;DN8Q)VO=cj-U<+NLfY zY_i5b{p2Fr0zdK^)Kl!|1x?1~4Kh?Fmkc=+o3G7q&-Tu*&9qzeUHt$bEquZ&Q%9^V zbvvW?)(y0{*B#?jc`lEDCh4~B{e{%bl|qp-S&fHu=P1X*ub)~93v}30MB(_0w`?+H z#%{v;OHG>|A-SUBjwOjUUv0hb{?KzU_0d9c+x%hgh|#cp94O|=@u#(J+bXY#_b4Q~ zmGjajN<;xRD@qCf@v|oOc4e9&&3Ah5?ltBYmDasDjgoP*b;G}JT8r)TG1>{Ix!sJ7 zF6D|y40CD`kUp4j*o!8^JR?IzC_ah$oAb3Aa{XbHBU_Bf$Heg?iSisDs%JT?Rd==W zgJPhmEp1Kts9P_6)>pR|qW6`gioNK{S98c&BK8-9Ko$!RX|mnN)%h!t6#h{FC(Hd8)tK*Ymx+#j0Dp>1UkRfyk7WJ$ac0qV>>0G+yf@xxh z9=7-Zp|nw?1KUG{5~bt?%R_aD`DIa?-KTr_7q+7wvKaoL9`U^1C|;XHn-P~jM#)V@ zyBSO`t`FCR??-C`pH>bhNwGF^@i+&)9PvJa-p@4m)C+7GuJ$D7{IKS?ot=Bff;p73 zcDxPbhr`k(y9ir(P3Psh$$Ef6HyxRWqh4C|b6Y3WcIZYIN)|nzMYxR=(fbBo_yBpG zUv7+|%X7eKqSDxYh-oZCV#_law3D06&LOvv3$5zmQ&6VCrYWm%<<(!^^DsL1D0a}P z)u7aNtREeZBSxx%yQvc%&t&?Al9rR&@1;2pyG^4!%Z2|Rrp`Mm={I`(RA$anQ*&4D zy>V;hKyfBG!HsC{ZO(?Nr6MkHj~u9od!{)ubKy$Gt>xaDyR!A;^F811IX@2n0OxSv z!23S;xzD|?SHJ>{gjWkxV3AMB>Ph?14XcRX_1|01Jm~LrPpx=+DH7t^|EW0q@4n{Nr4`&5sZ1nrIPn;?PwCGs-pQQy7#QVDoB>H}Wh;rU7^xvy zP;2AZkTiN0VIA+1MEB&4uOh`BVj1)pZ)(Rw?Yc4*oAF^IYpB~HI(mz(qm5$yPg)y({#F8Ty1O3CPi=dqNuz*K1qKgisygLG?r^Rdd-Eo2N~Eyj1`ifumJBjT1T63M zXrIhB(px|?$xr+-G^fS$v4HQ%81_h(f(My*-DM^@#Y7_p$nyAvzKoX(*(;0w6^}!< z-KL5gX3tWK>OPORy=}GYw@#9Rj7b44(q-Mjj(PA*gpjO9!0SQozmm!UuZeS@G3KA*V0YBgq z%Quw!AwKrB$EH8O%3!~;EGRZ`*VNd$J8|4vZMtpLO1Ni2S3j35HZ8@ZyuXg(*i4rL zWk2bMa3wuY9>9%b2s>dW_^Aw)Rd=Q_o%H}8k&1*I_VYa2R`AA;+zM14bRc^4-AH zze)TpN@BIx2~xH+LvjszdO`@Iz)*;{IB_LDtH0r61=$%eC+Y2Lhb zi>{x&&97%kR#7NPoVql=1v3+uZ-x^XZq^aFaRYOk;}_x?jtibJ+c;B}yw<6SfY|Dh z)qWBu5E)>#Wr4VnH;67V%n)_QW*XEBz#K=iQKE3P8f?wi8&-aD*jsdD~l zFFLW&hMD(ywVk^)=x$xD=;TLv1DI1K6|TYbrtv0%d*}@Tx)iSL<~iwK38Y{Fux#EK z88n}meIhr}Y^oSuV;Tge^9HWzUjNm_?@8_+!XrLpPCX$~s_}*4gis}JX2W)?_tNQ7 z!a0_1W;C?xJ1Eo*GOGVZMu*6eI?iW{tS#?s*uq#R**yDAM9l;fh|G6w|K@7}=)&Q+(m^s+UMfZ%5< zb@>b+6_Iy2G6pxmP@wfAhpBfZxpsYLwI0*`V%_*@3m>N8P>)@kYF(b9#j~e%kWD4v z%8;D;dFAQxAJ{utXuKE0k)dXHF77(~si{ z>u+8Cdu<5$OYRKeTRnkQ3#U_?!ifa*scPg?9!R>|B}gw$2d>ZXF4kwHH>Q0$Whs!l zb|(Pzcq`wm0|d5-Orl2!C;+7PNI#+PGZts?_l1x7o_&B zf`jDxKGsrZ?7Pj50b|ca9)8mN$-xxgs9pCY9{c`80>08h`^LgQQG3$kLwL4_`a**3 zQ&$D-P>_s7y=$SLs3Pqxk>uIAL_6L1WNSOUd7LoGsvm+BWhu%5gHt$ciJPO3-GO4` zpXQA+Z~H|wfNQQjt5TYIEicrSQYEnM|L#&RU9xJp%p_e^&RUTJeS2For%W;yEIi76 z7zu(+cj)^;L?HPKoU$lUE#<|Y@s-*tOB0dxPwD*LqiO^VN_NN)k*N*=Gw`oNBVVbl zwCd8Sk!SA3p;jO{@4%lc*k$*oSZkYKTNG-VLKyQ^rtW=~p6aPKBiiBNj zovLxMl7x1L>N|0sVakGHIWEXamJFkKhtaj|Gm)66T{|m`zlr9YkVtfI1fA?sR`z1a zT2!A3%IbP2Z>W(+x<+n7QF*h8R(3ESzk)2qdJge^=7V%-yG-BeEhth!q<1g}Bdifrhn~*yw^nJyuNpWeRAQd2a3)8YGQ7-} zo<;aoPj4#sXD%Mr>lf~_0;_GRaw4xbXQa%SscToT9m&1f=u5Dpw3>YK#n<3Nar~GT z^y7-Ih{Ie0uz`3XtCIoGttZ0SMAfrG)lst6g4KwOr(CBFr!%G*sV(xvF><&qchYhG3%k@Tjfon2{@K$e=>z-667!axQZ?-tlSK|}^Z4~P5G`%ic*Bb8z-Z$9WL-r*x~nv*0A@a zMruJ?HgwEV^VsoH{H|4x+Wd$;O2>Kn&@;H+{@j;7-wpiF9-G#HqBYYEPu}IpvfPk7 z&i6s)r``K*;W?4%Yq!kfCO>|%PH6M|f^y`}kv4m^N!&)h>s6}OZa4I1(;I$!Suc1p z!P_L-<5|pM^Z7idiQKu7J)R`~M`zk|KHJx4{8XOs=%a}ch-o9;7qXk38(J%Hl6P7+ z0AR9L1E&cvU;@3XKREbMDlHZAB%Z?=y00>r)f!Q&y!C- z9TlQQ+wWkQ|L{-ieI-wOM45|pnbruak5riYq8e6}p(aiq7M^Y=46C00C9@wr+xn+! z+JtEI789bZ+!*kE&-C2wIC9JVFB8A|_jBv|+CJE;2}qSCU*LNY=k>Cd0xxpOT1RJR z06RN{v}FD#=NFl*gY+rM|1n*zlc;1hb@-z-n~R2!Y|IG(%yu5ay#lX9Lp4oj$@?2S zluP}1FUb@0c3!t6H@KTzkI*T7rSAXp&yxcNmXV^w8$RI= z-02tJw}#Alx`Vu2n_8af>gTc6!oH+}IpeA3i6ssfa($dk#h(Y7LAF4~Qd{kIyB+~| zn*03}ct#P5O7an1ThgF5I-kNFL3+ zxjr0Zvw8&2nzFog+Z0?Bnw4ikI>ez%8!Lz=c+da`f)_8P;8LdW6>80y-uN?H-1?x7 zO_}#E`9Ix^z=cRx)@joS7u27R%1*$vOI zIe%tzi0Cn#MftzkSlpP&Fjf;`J@M3xq;uyhBo04a^1?G^)lg^28WS608z_J`vU4GJMZY;kL zkmhP_bLr&VyRjVGLhG7ls3<(uqi=h2smiKbrwsG^)&uToBZB*(tmz5IVsMb?<2=a| z+FK+)@}Bx#^Tw{Le;(2z<0&wAKcM;mp&yDKOz~+EYsV_Pa4U7rk<6&m64Pq8W{OH-!{ z*}C7=Pl>EJXZvn}6>b@YkX^bN#&RVKC%ib8N63r>s7;5gPQJ}<^R8+isPXO3#KFl8 zyucnXAE74iZmCgh=eLoHr6ZiZeOaMV!*-XCsaG4Z|>|+;Wr|7K0AoaxfwB3Nity&4+^9bXD%G2LD zd3)bSSkaKug>9F9b@z9&%=Rhowuc7VC4RP3p97B*l=@$BE> zXYKR_d=z}KsC|`BTmCzlzrojJlQ(6YuVXVZD{*z2{5m9MHs>KZt~Q!_Lh5*ki(2#_ zzL<+|L%~>W)b5JJs7-|cdZz=;RC+U+a<_LC~{UfN{Uln+g0#dysKul5ewJN0fi5d7@McySx zsj*==Na7SDfB;UGwSm092?+NWwz5^yxrcbDi1!NvmwnXu9q{C!^c6@z$?==gdpk!d zS?v^~`xLoH(B*y8>%EBh9wy`wL~m4#6T#mI1z5`orOB`(jugdpB;W3ScH{A1m1MDj zb??H#0-JtKDvbURICp4uWWT_{s`38NAl123Kp9H+jMHCRVA-gKoM&yNzH6Bh=op+`n3a#**rsGtl~_Db#0X!ywhOeeu`|o4%ex#j zFI|fnZXeZwi72wx-Rnh}Vzp1|(wwlaLOUz+j*s(%Iyo*f5=<({fHUk=T6Pb}O$fqn zYxuYXHz}w$))wOI&3jv4QcefKpVJ-IUaf2pz@oHi^^D)bN-;k%M<%K-EZiu>AU!0K zz8SNct3T0Dw82&49u~Oqd3z$w_sMkSjI0#}tTB9E*%ksUo(fCMd73%$fVbnTq+XQ) zs&|W$2J>s+RI+qKXN)onPq{O6tB`lPnP;b{3Ru?!Q$5x3bO^7nGmn?5_uv&NON9ia zZ{JPKHcPV^cQke{mH8PLwQg4|pbQGw2FAtFP3#iFWg;brUcDSLzWnr{Vc@bOVB z=RX#E+3F4PH8mR4YX&ezn~3r|#G}phlTx1a3tD}kQ;Sw=@JL};rfd=3P*AO}=Dbo9 zZOrJ(Bu%F)%2l3hYIqZ}94nlDP2$C8nJSIS&#l%f&?G3RZP3Y*V>3hXWfZon?DOs@ zxm>~#lJ3ji*VRg%sYq<*8Q3mg$I@Ri_scx~bjfY-U(;Xj(q<(6uJoLzPD;unhc3wo z+K*Xj$&%9k-#%yDmXcgoI@Dro1$PI&7Lo3gt&$UqyQz9T(apI>BX)Sz5zifG0bHOy z6wDUQ-{Q&pDcYsIWdmNxIk)TA=-kQuJ_Mai@)K`%Gr+(1ZE;E44bIQE>v#(=1MpK( zEVqlaYQ%IKI@g!}PTW;!^+4b_DOPfset6_d`0YIQI#V$dc_)$5q(7x|rl5++(8@d5 zSzGN>c}`K1<~g4z5oh-FZlw3grcw*`6)e#HfmU;Qr8>%ZN%6Bc4s9j^)Of9#+DA)_ ziW8&GM%mL71N!K(meT>|X6@i_`Nk;Xwn}~jb6Fa^bL@?|+^YX!oBwFOb-M6Obp1&A znc5+~uNNkfiqm$eOo_Nn)N$}|YA=1t)Lzn^faz3_AZm$6)w|^Fo9kQK8lI-aT7@fE zLxJ5n8)=3yL~pyt@Ielx?s?nLed6Fimdu#~NZv}^6Y6ejFqvDv2r@kd77MYuKsRIU zUvggT8GAP}r)^t^CJu*koMpsSc|4`@U<#K*>MvCzbAK6#T21Crf6m#oe#um$qq`se z;CA74_8zGaIg5_?+=fS9tD<9c^3?&W&foYXI}9bi;3UhNlr|2X`ZkbWZ1z2)v}4q3 z0*IL_&At2^JULnSp{YhP?#(_QdgV7n5W|nUjJ&XupSsNh!0q11hIEJ3FY6=z>*XZt zGPTewSfsrcx3y#Gc#7F3_%=&?q^}1F*SR^O(`icX81_e&YUmN!T&SU_2u0bRU?Y8- zapH~U_6*TMbEp_T)$F8}*d`+IlBxNAhd8#`80y2{KOSZGWXQ*W!JlKMtIvEE95*wmcw&_L=`XS$arTVDM*v#1ANNK8;#qrhQbMkNX@D$La$hx zsKeFFCL*7bxDSH}f9ZY*C3hHKa58UleX_NQwai32xC@TZ{4r|nEX6);g~IkLVS~5x zX&!ApN*}d+>HHh@j7)%2DjGXy7j}*TU=fz`IbV_lwh!#^W0;j{(A|kfHmm=;89gr8C8Ujie_c(qVZ^R%MP9xHhs_T6&?E5n6Pkcm|f{sV%>d5uSH}CII~~k)K0xV zm@X|VTwJCmH{)0RmTZ|U+Sv9oavbHFn9XXS*p12NHuY9f}1FQSoHmD5f$8)yd;IT}1Sr<7gxa@sM;6|Jx(J5T5Xt&6N$(kC@ zSfl!M8{GJNXq;3=t??{rpr7ZkQo5kT=}@JN#PggxWD!!s-B4i7h%&q6BI=vv2h>d# z`ce0%8{8UBR~&Ju(l@qF(sY|R9#T-g8{I52u=nBVHi=6W>lL()TMr;?{k?CSxPSw3kGY+hnNT zLj0f;H8Q%6kKYpFn&ocl#-B3GQ839qj0B*_`>x#N+572q0U5T5 zq9=+%t8SK5lLS6)5rrYMy_aAoZGJDU!feLH5>}%(yefk$b^7Y`^QN>WxXN?jh25yF?WM|J#$L=qd zG%#AwXxy)4#{@H>4GH!cQv8kvE-n~fl=m&=>*%1~8?5s#HChcyB7#{X?~0Z$R0AfH zY}VkP4Cu)aS^B!Nmvp(w(+@R`nFec5O#_5ls}hGay_qQNCn1X?)Cv|*R8jjtLQnro zj*am`>ovOB0LTJnYcfRfz5vGMy@^rAbs9>nHIPn9?wL}a8V8F8SCQz)1+}?BQpwLW z<-k8|2J=1(CL;GoP6CN5xj#5|dD21^-TO<`j9|6Cgu8-pCMfkFOF70F1~+o(_n%J{ zu+Zh|?z%=BYm}{lW#(2#RaF|Z>w&UOlw{v|BT-CRtkc(Tq#rrrDZdyEO61cSg{dYd znsa9v8_FrrfEl|!bvrEJq)f}(I0G#h%SY^s1*OE(>&-n!WDY{_$z>)IEzKC(n8LmS zMec~Uv5IEiFM7z_eVy2-{cwN^Kylp|qz5q8bGX8ZihW3jdI12~TxGxau2ODyyv$m` zd&GN~g;zTOM`4l4ri@w=*-GIB(AG zmtz|iASW2$Xu9uN(Q!?p@i%pMtlTKsKYI;r=pSo1$Z&Lr!(6y**^N}Vj&3YYW5x?c zyY#b~%}3IC3-6k}t#>y@bBf(b&rPwjMI9<3Z6fqWfg86>V*@W-4jI8c%1D=f!4A4o zf5JqMYayOKYpAuPe$dI}rg%C#6lk?-_;EDo%ayC9EFs1I=mn0(>CJsaEnz4Ob(9!m zS;{_ECZ7S73TYqZHj#RIcMl!yF8gO^6mJTOpR89}3%E}?i)D>1wM&_wK z1Mm&SkIs|>&rX9TiW1+Q$>Y`Jyv2LGG9?m( z^}BAPswtip)ay%yM@GQ97M)ApN>5y!TC3Qdx`=%ph^Z}INROPv9Frcso5YDz9uT7B z5r8b_$`BiLjSaAY$4fG8JM{JYH{Q44X~=*reKZ-^8-s1lC{44|z4G=bVmHSa`+sN* z%PQvo!X7Ws4u)lLK3>2#>8lp&=V@mvvgk$!R4-1Sv-AHnf{i?_cL@){dpqHoD;hrz z1;t7QC+-1vRj#c+K(eOMZ=jQL0T zT@!>$F;RZk(Rsw44Erk8to%(R8I?L%54cP(iPmK9!bwD34(jzCxME!?GH^wxF3W6* zqt&*Iyc*xFvk63b>EXQhe~ocC}iA$j~QQVhZFz7nR&ne zo`0EEfL&m1(3XK86w>DSI-(fPrv`TQda z=%y)&x#3(tz5>%uF?KQhH9=eUw?`wyAl92<$Tfu+J8wmXv&_t$Jm9`z)-T$sJkeo?&35;P^6WyOvE!J>-lp^Wsk%Hv7n)pNqSL#5GpS^W5m{19KjFV`Q1&$b+TUkpP+@z?*5@JSLUe<1mQ53vH z`C&gUtjO0CJp?#M<~;b_ymf zK7JNxG6+2QP#W-p$^mRabssJolMvE&0iY51`=@p{|^{_J(nu zVOE-QGU1gIi$CQim>jZY@y^#kA`gd11y|`sF=@aGh}CxB#%&fo*AI9^A|!oyfzt^FpHdLuQr74v-Z_rqXM#kdXgcdXR*CHdP8J9pDn za>Q{d% zkpQ}9<9Yz++0Mwaw6k+z(5QQMo-&=0#l7E7ypp0Zfs1Y z>s*$ye|=(LLZ7#Ax}u78?^>bGaEYz?sbm?Y&XS@3ghKh@c#QBnPa}oZ;UMnT>S%j$ zbbRE7(yyD&JP?-y5vPpGKGik)VVRAm2Qmb zCBb?bBCA!HqTQ==DcC2C!s^zcL6)COn$eHg7X2BKapGx1wH}W%N|14heBxmgASy}X z`lQO}Bfc9oJhuhNQKLIWcAzgSkRpl=K&;<@T}2TjiJj3pdd|t_)Q@=e0f6%RsajM~ z)NH(>uh;+}ns@8($O+B5KYOj#L&tT#G9+VDTQ!Cml#2MG+%Zw`S2o20 zE#}oIM2g+CLVRbQ7*j-Y4Ygi)4b5RdEH*NKmA;;RQppU?TJrsU9CG0h#X{D zhL|xOsX$&vkwae4sxp>0<0anQF^^^_K(hs!v^TB}oCDcnpO6B|`5iFsGMbeQ_pvO_ zOar_xZj-CJ(i8x_+bO94?R5hGi?`&;=l|ZW0T_h=63J%C00v5TXlS3|&xpPbi4rgM zl{5tvKe)x|sUq`F>rtFqr9`b4K44WtZ_RF0Dt2E6*c#@$j(`1`RI+Jph7{uJp~^gT))P3I#u+~j z&tl!Q?EEBrKenzZYFvD|Ejl5NfDlIOtXp4QlT&&7db3AN7!>n~fh8Ye)xRp{7h=d?A{mB*X?V|Ae~3 z2e71AZlO{tPuIrjS`g-7`d|B(l`{vXmrSqM428F~i$*+kn@$$$g1Wg&MBYmA#1CU@bi$%P= ztDlI#E2|;ed+$Y&kHG-ZM-(rFC|DmcM$s-ih(iHwT37s%01es{59t8>|MzRty&xZ} z0|0in0)lfONm5y3hO;A9JLcYueAv0djzN}`yqoEnz$+)Q^w811*6K(_*5fDL zLqmM>{8_MsiP;7D*pcMF3~<>{e@2;I7h5`N$E;*JJ}$gao9xR(4_g=UL3UP*ay;T1 z)3l*8mMQLM2K)z>@+Fcn@dKV+(161G5x;Y)beNqSe~~iy1FK;!Rwr3I-Ihu(*MS<4 zTpFe8W)mqn@R{`0Ns>jOutx0rq^$3|k+0nE&?>6ns-%Ea z`p=hP_Un7pxV-RN{mc)}Wz)MJ$lD1mN_Gtrf9kxq4f|r!ZB{h>OnywN;)1&`%oC}? z+Wh?p{tu92Zu6DD_OD?!YG!1CELOUV&3cYoRE^Xmu1?qQ8Fwh&IFZvd6{9o62gffD zxkt_NQJ67FUlm}A(n%F&N;lxw*S0qQAUSTKGp%5rf#eVs?dAvYzo7VEcsP9mEi$xx zex7J7+GGXww_|s6J$+eytIO_!{$n;$Z-S&W2Q$NjVkEgmy~r-x^u8Jr;^p(-Jx!PH zcN=ef?EY?2-hcHU;OA?PGtz@6ksu{9s%}`-zO?Yy!w4Csq}D(G-!odfav#3_b)5eL zyfuGq^>e;MBJozXlItwr?AEpFyh2#l-}77Za+CY7qo$daF6WvrdSMS55uHH`tA_>~ zCop>i`mbP^U*u}4dcl+28(!T(jk^}#rzF>cs0WF@23%Ev{f#Gqg>RNuf-PHeRC3tW zEVEK2$}&Dz=q%TNXTo_+eztxu6#$vOyv7&f-Uy2Q@R%thbl|yFw z2Sz3Vx^%tV>yB9U_{vgG|Ky!gGi|#$fkP-8vZ0OwA<$}SmQ6nYrE|D8ag4jgki~v= zIVM$8vMpVdd@s9FL_NS@q4Os78t1)+dv9VNiT_`0R+P`vD6JyEcFsx)RpaBcF>T^M za=3Jg%vYBD*9@yHfJg)EX|JRFgvVLNhxKKLWC{m|`&DOr7OpyNYMO-yp1i&HWZ7Nid)oN*Q9VZSmXA1kufP zS2wQ0vMR_=H293enBfQ1XJ$Exk><^pMv`~s&p$%}u-7UZ8BY~?kn2Y-NsXk=6&{+h zrAaeKJ5~P)n{)f79}%vZq+hUB431mTI7TVNxV^RHuR#4z>&-@Q`st>93!L}Pc>bS1 zUTNnwtl?e{>dA@`6VuKrn5~V70M+jrsk7T3)g-<>i7@qDfW0ay_*E{P8@6cw>BQ^T z_mG_50sB6B%iKca1bWqMb#qw9dZ+w?=(+LO{p~e_k4F~dE(KxT-op7?>~oDfdqJBS zI;J90pM&KOmqO5eerTMdTclCY#)!yog4pR@vdc6#r|=7taT0?`@%?eWCa z6G5rD(ZjgI#0_1NR%ts!&*7xmkf_U8urd={WcKfp@~m9-M-MY2Gr9Eq^H-9$QNXGf zE`ix%OLec>T{y4k)%M}(*KKlo7`=5t~mZaxIplhOh*FV71nwhNQQRumk zn_@>E+#|Sdjb65DYOmQCv%=npKUMEwm*UEo`|91(1+a-Ab~T$G8AC}&ptO&dRU2nY z#g>H9&t=|Qnt>DE(39=c{bP+n3D??z^UvPTkoF5Q9Rao2zaLtEVxN2RZD#YNef)02 zU1jec)@$J9^p$6|3G7t;wLr?p5=txx{QkW*>BAj+*_wl-=kKY0UkN%D{X55U)GN+y zBy(zG`gh_%$>l#l*HZK|K-+(BxL7+Kew$z+I-}JJ*|ZuKJ^#7BH}ssFICs#gTyXQ5 z3H0x)jk+HqcdZXPK$a@kO6zW})`*_FuxXgHIoTB_1^mwMB6CTj?WAYxV>jM9gV|Hw zo0+;iVaNrehZkM?44G~VQO<#=^)UIg4iu)I6#7@9*geyTrl@*>Wz-eR+syS@b+Hh? zF-;mlIHi2Hi{}4C3IG6a*sM?Y5-U5n?_^l-$S(WHFf~hO!1Kj-nphC6gTtG?&)qIB z7>SQupr3@v%iXn(Zu>DKzLU&nX}J04rx(92F!Q{_KzM=ZYQ7Rlsp!OZ zJ&#j(Xy4*ETwr-)bJ$)ZG4ht(0VGC*_*J{8V$CPe%t&|Del~`pn#cKeL~goGC0CeayAI6|e+K#S5Sh52+u-{R8YO{3U#P z5?ST00F9Awih5r>K2_T4E@hwgyT5uWBs@mdVA6J}edkwM2F+%wDdEO)Xq z3p0$s)3+mo5=&LOWOBTCSL^Sx(fuZRXl#@5k&S43c6zuXn3Z_qHLzc9JVLxaEEkTldiJ{ZAvP5Eh3% z!4x|iIZ0Uy0|3Hr(AY*!7S8b5>f>4}7u~EDRs77l@Xlpo&6~<(iz}@LQic%N@DwUmk>LCuT2k?{QBy*7Ck*;M3mYFWH5XGiumeCxU68u-7aOdD(5awpd>Pt+8teRVPn^A;qW~M97hI2K-m%rI;R%Gb}hC2xlq zh;M8MFHLa<7r)Pi%gvP8$A`|$sJftCd;Su_3eN6InQ9Ogm;=;rJUA5k2LPYmw2>=- z4o#B9NhJuBFZ}vXaJNjUe2cj4{Y0VwJEOKOhd%ama-1kt9W`rTFN>`~bu@zFEgxqp z{6p+*bELJ)L#tkXOF@fx|K!JjFdk|0MNUyZwX{206( z^O$P^Kyjc91`qjZzc29d^5*!X+=i1H%<)p5FL6~vFsg=bZoc}mCGG2YQr|y-tZUPO zYXZ&Fmh}$LUz9bUIBvMi ztE+PAGh%zJW11Am3C^z1ufLjM$2V>m?32#~*muL?UmeF#ZJjo>@(>#Zm~jEmz9yLS zcI{}u3Bd`UR7R{_PAnSj^(_v%rIHBbq4=(<3rp3kt*7FHfBmp!(>39O%@}wc$^D}p zO`}-`u{I>~Y4o}G-H7jI%H^&!9qKE`UAIuv zOw1=XjF#R7K=C|S%f+FYm0h(O?jzmygWWJscs-_b(CGPD&hg)xZRv~fPbcH&!aLtt z?!K#bP92)R9eKC!!3E!d+sw?OauxJ_O8_pwN6naNL4ygEvaR}X4Q?zk;dvlzHHw7= zsSc9xuZNnIEeXGG{sXw%D02XJ_AHJ*d1&bWu=iU2E4LX?YD=oV4)=7P%u~qPb{`)N zmakY4%1aPa%;4^)D@jxIfH#gjvtcP9+`JoSc}>1$+q?*eQp4F8jtbc5W%fo@vD@gs za~5M&BpUC4fvZqwCc-$|g=A#{KUPbr`(t~;5xeUFuGfcZN__5a2ljYk8I4!)iJp-H;64NGF& z~?jFFIW%~KkMAcW}zIuwr2mAggf8{1U~KNi?5!`Z+VI&L0j<1LhIM#X3sNVk-` z+tqPe4BjAw+e`EKCsjIfXKi+2& zDA~TqxaqCZ@jTApoZ%0T5C+95nX(h|AgVef`*^hU$uIYo5_>aY?q1e_wGK@BG;hy%^gjFYHRB$H zpyB?#B}l=bw=*s*sXBNnNa;zNSJAT=*hy|jMBT?fh~eM|WzhGl#2ItGkwg8PzQi5D z3Hu!W{KoK`JY?)#bRZ7zN3m_u3f2!I8?5gb96Pn!R}N{Aet=?(SMx;cOPe=i+Dw1m zVx0fdYWF?f6(`cumUj$&xa(?eb7_PasU$1n}1zOq^E`Dc#VBCl%`R?klS=WQR zHiVL+jJs~91caz)n|wwT%H~~m5(66CU>7)E-gi$X0vdZj0BmiyXB#YK1c)9j;YCb4XA{_BO&K+TH$;X zo9Su=3!pQe%w>X%?~eTA-$8+0irn zMxgwjsgEk7xNn&WrG_Clta+q57HbeHb+uoWqvmN;wV>_|R&y+Kw?#subd-$Jda;$9 zUhyNg)wqX*O4?v|5XMA~Q4lh5z{m(@kQo_S8Z{`@$WoU|X(p07t_2@Z0E z8Avj$4&|wQ*_>cOc)+;Mx<<`zCuJM!B^=&b{pF>yxx2}N^8n@KdD@EL?y^o~XdzH| z<6t%6w`51Q7If!N6}0LDhmLFMu~2xU`%W5JxH7FRvk?N1Ij{2X@CjQnf9eMz2%D{c z3Rpd9Hz~3{N@AQheQdj4kke-0=;e!R^im3cv!f$XS={!wP3;2N4qcen-y2gJDxY0) zyNrQ*Y04!I%Z!$uOhY`LBS2yy&vT(3hZ#HSckT`qBnGi&Bmz&M@k;U*?vqDn89TCj zlKr2pyh#IIcm64Lh>)jPj*aKzPg&KwsvH+dvrKQp zAgP$@ri4q&)rq%AMG&3kGH_9OLC@@og=uZchSYdo!;N1 zyneT5Wmv7~|JLbm!HNbzYD@9ou@Qf$F2!apsXKL(S0r!Me6ox zhzLThkXS`g)Qr9Nh*7(0^_$Q4_xqjS{rBdadrr>1uh;YSm?ylm3;Cn{)@WGs#z}vu zE%HZCOS-uh8egk&S&~}}o`?e&&K@Q0?1l>W;8~aca+!SelXt$G(wA-kD4obTZ$Sh8 z(D*Ogl7Zpp#aGN1Sue8EnNNDlCjEMPpXtH{1}2wu2L4O>=vN_=(!K|xpA@F+elOac zHP6>dn#uWB=@KNfOGF+22EI7H;e@s?^7S)oGH^;GAf;m+Lrb^0_Gqg|5rCkk$~v?1 zIUF5B%}P0D+n*X+AwwZxS2eAQxoML4$@Lrd@`D<}b=gz<2rH{Yg7mgCX+G-lT->kI z$)`f|K;EW}1_+wk{9Z32HeZ|20$|HDuM+ z9meA)dXmSEZ-J0512%kZl)snjjb}DD@XkSyF({!wE!?n6jW4Vri?=sOKAe;uLIt5< z&z)U{;w>8D#pm1SRlzf3$-}#ISH#@R2DdlAwuG^3QVuk!8*0;+wp*r|Z2&xRb4`Ud zi+8uE$N5KXVi&Tp+-w4AVR7kMr?JCkTjU8k2# zZ{4_S9P@k8acbVjyN290*mZU_H4x)mE6Hx#9T*J5m1iATHrP+^#o9Q}oIc))WE><9 zKyVnxZQG|T0M6DjW< zc)uej-v8XW*cyM=1idgyU`+We*|8V{6ok;1)F-8%f5gZNT^42J1#!u~DrRWvv*t_{ zfBUFHTgNP_a*k00R4t=es`DJ2Mv?8V!Jp9&#tC^j^#+sw{~&use6?Zm!pYYET~Hs4 znqTjqyUsdS80KL_3{tr_Sww4by6v85fy_HptU;Dym${(T(H>^v(q{p@K?X5<6zd8x z)7<6ZM1(`ne2LoFKKorrQc7h- zpZ6Nr%b-7fr4?pfGA`sH1)rFxrtIU5b@6Ixjqix3ydU93ONMU6vBVzTKc-+@-JohJ z3=8m~LUVU#`pAZ#Bw^rKrLETZE`{tm&i$}m-XKpCm>&LPhRM?+^nRCSFl@*!cOtoj0FaUykV=O%1Bfmy2;V&bj}+@iYE?oRDu+g(GAq zu2rZ?VXWgZ;GE-|m$eSymW1A@t`9$-={!$(1E!9=KbHsUyI569|NbqXCv`ZCxcUTq zC0~Akc_Z_-twUK+#_<;FlJXUibt{qd?5O<21lKIo+c=Q5J0L;ry9r8U(=O%a!rTAZ zM}Xddj0GKsZ= z^XeE_chjlVjMCw?FKs;I`B5)v-D*;f(%$M)+DTjHJoorD!)PDwNkyrl%I6{qrN6ew8S0*$ zhutDV0euI>?UfWr{Egw>O)ekF@=o@HfyJ|H4XD479PXz;o;lTMVfKltDI?5>|BiyO z8vIsI=&3znkg5ShCJtbW3KnJ`k{*jEZC{VK9}{Not0_$n>CNdu8t=!{zUJ4+ADjvC z9FA226vq?ha4ljsT`pC%v;DHR4Zkfl^jg$p1DYs5HVQ>m40er*ld19HJ*kgICu!-T zC4LoT;%@}LQ%TSDgla3A38(JcT&N&2kJ*^Sz;P+P2rnvT^7-GuGvgKaYQ74%4PZz` z`X(S9R{h7FXfk7F(JGh`zbm5@S#~9;BZ=HwoaMH>>c{3eyDd+#6J796D>ty$Ca91q zCij!QxKPQ?Y=?BDw{pqiPQU-p#o=~4AQ2WY?Z(m_6M@gRL04Ci!=X8B|An5f_ z@dnJOs=R{q`{CRY87G)2x&1dXVHYi&BqzM~=vxMh;;f0ingczyG)GNr_Nuv#q#V#d zX=sE}{25#}8ijb(Cf14gMo>z5F8gF>Mw0c$_QrCuwHr0{6Z{t6| zzwahL)1~`qUq2{Kc}(ZdN&&JSg(^=z_+dMqVRHa3KHbHiO8jGZHMOB=Tw6Yjc!2bQ zplr$zS_q-PDRZ`!1);YnM`q480TWyMSIUS1VMVLI|1s2Pj_`qqLBFw@tHQ^ZlmD!l zp78tZ6$S18KRDPajipnd>(Qz?whZnS14@;VC6;X1#9ty~$+NjGaV6 zmrg~hY;(=yzsFw>d){0 z`=~NWeaPTF7vX%HV8MS3gN}APXLXsdUiXsRr~9#-#JW-qzwi}of#YD`IBlipENS`G zeE+%oa&+XLeCgdIdzajVw2MkfY{f$?dfcp^by@8p!z;EjLPq=?jKwM9zQ+2V?HFUp zR}N*+1SwpG5eL&3dL7c^DK2uTeG1mrY1m&oAMW+|7h{{hc0p`#!WV_01xqt|ncCLi zD23zRH7-J#C*yFSRjs^<@B?o3)qAVOqnsC13wCVfuf0sfy?;Zwm4bfR7ojbd|6cL7 zuuxfkZF52G_mL(3^x@wxe9XUct4)ijT{5C@hq zW_`T(#$>{W;i=@8k(-P<1`M3SB1{(-Z++q5zqnBRB$4T7`$aS-|2$KoxmE+GGIKaR zJV5)kNurFlgAiMAQsRHvGauAmd{#HS09{`2JBw`1rLJ z4xP9vSRt+|Oc$!@8mJk4*)U2e{GHDkS8a)~miZ)gQ=_HR(zGq7Ud5Sn`f}^j%=}j| zcklNXbj*+$o{CxAKbK(IbZ_<<@P!0T=AI7t%Oyvl*NL7^zVF{L<`NX_eSfXAX4q*z z#APzr$BJ9NY7w{O4WBs6zDEijAnXUUA^Cao+x>at%*e+kcQ(|YN=vKF4Zn-`Du;B{ zf9j_@)(>x`LpQY%{@nMdwii_-4=-?yPQS6|G?fq!|VAt#1Q8I^CW}_ZsIaz)v*k7pxTIwiQ$qfYn9>rRark~MO zVq5yqgod`EL(I$B459iQAG^;ID;-#k4ITD7Q+~*vArHGt?s;L@OIQnO+ED)>a!Wiyb8Z}&hdb8o{%%J+tN(N;9l>WSNeVkXva8Vje{bXIw|gEv zxqn}D};^|Z;?$oo>GJT1zfe%d&KAJ19UO*AGX@;f)|qkUpH`6aHN?()}# zI^AnsY;j%=b=Yl?Wz>EA$muu7@}mWZs}pBs%5_d^aj&A6JttZvVj>*cuj?rMY}Wxg z=su2>@x1gm^6|?r3&u%by*S8K!UCMikur}L(%-qpWRox5PLyFf?+FCNyuI)6{+!6$ zx8K?st~j9nh^alP*8wazWLrIRc+Vu@5EDcHJ^JU*t1(|>F1}~5WB%FB@X+)2eTOSW z3XU-*I+rAW^?qqgz4@Yx!=a5aRY9~uCmXD3?09Lx<`v~dH}17JCLzu{MCZ4tPDbEe zek>?He}L$kw&Lr|XB=f}-o&W3VWrz3p+}<9fbd@b{hU5fW%yoR@)gwr?`esLq>(hP zbg<;QNMDrOm9!Dp&cP}I$1DV_f^qU8cMChb4`TcII$wcF=zg;&=Nk@FhnTl-6Wz6F z77PqRZ@;ift$oOTCO7raspN{u{k!+;%BIzbcWjAWoIdK%5pG946b&x6#_$p*QypLF z$iw5O#DWz$duV>2K{x76&ab1LcFC$OmsAbShA-{qI^DFT`H6#reYpAby7$bYBxOAY zyaFZ>#pG9kXbUyKZF>Cuex8fHBo|m12<8X6-8uvrj|N#{SBE<~CyTr1CmMbq6Fhy| znp#!XgRb+<1r=VuG$7XjxujnJR{gO#Yf!D7BC)IHW2I5AHR$i4$E?t=FS++(RX@@v z-|9FUVz84FvrA!ZRXaM@74kwNM3*G43J0XxkvCS2mrQ#6F7fQ`2-X|#3;+!ZZDh`l zSh3jHt{-o2gLe%Rp^Q{(+FbhG&XsGjrZ z?z4PzBwdl0gRtCS|oKlyT^s zw{iKCo6m9dWv^^7RW;R9zdk&sz?qYl+{qneG3ejh)j}dOj2g4 zy(iKeVF<)?VJJR>wSxU%mk!Yr#JTKqsbl?12UT8hq*x$e8EheZ{8OpG36iP7TE8_LL0ti+N?br!qO{dI>OLRi* z1HwS2>l^S1ptzJAlw47Jpl*H+?iZ|FWb-Fb5TRAH>Ip=NR)I43l6mj?hTSaKUVCF` zm<{#u&x!rV&@D&Xt}F=<_F{RIXlk0~kK~P0cj~#f6;mPUOH`L>+Fl)4)p0BTfWLF% zCGjdXp6e)_X3g%5uqs1@)>#Fb5LpII=?TT{A#s^H!AEi7Mb=}-1s^d1ppP;IS|8FO zyWNa&9#>QFoN`nHSE_g-f$XDp$5p~X+zG4w25Wj^aPj0yQpsA&w;nOoikvX5OA0YxjEdBDHo}8X6QL5)vnhB7Io?ta&>D`QxtNp#8Kk zvqp`p->PZeT+L@uA#>DQj3T3F8NuuOSrFBCY2A}iN%Ec5DLv=3egroJxSqmKxC>V6+JKd69J ze5>yKDSR%^E|{)XB0ntL!_O`%(xNccF3nm*NsmdZlv9VGub<_m`EgnFsOAVH{=LSK z!`PLV77{vLy}mYKUx+hkm;Mr+CSJ%Dg`KQ~-427BU6(w`l7HtT(1URF^T%&mK?eUS zVtfobG2?L`tq{V-wRo}QA$Iw!d+CIJ6lUou(z^)UMf1f3Cj!=c72-i2NSom&s8_wQU9d_gCS@ ze+QZ#pv*fH<1MFg#G-Ueu}mD_a+qjV_Etl+f3k`nE0o=&D*rDVB=|6TE7^XKmyX=c zS^>|Khvd`JzScNiHS!EWJRAAa~6bm@iKPuX(4LLa){Kr5# zTkx&EVf@DqTJak$PbUlur@QrLIja9LL{{3(5;p*5@@poPRIDg9JTVzGje&fizX^6-D!4u>pD1Wzj4VWy>8`0$-(Hxo|(**$WLJ;;y(uT z%W%7Lb)nWy-2tWIvvgQcf+5Ag8I!Dx2t2t((5>8nPrD2e0g=_|r(!JJ`NzTCZO$EB z!_I--;Q*+O#x7d3HLhnA6+9PzomN@-Vzr}*Qth?i;XO6g@H*IP!N-5|IC9^>7JC-a z#d{<<@s#RreFh(&U)M-!JCO`%Q5lMdyOBkjWYK|L2&TnQznOUSwjB$2R=+R^_6OxA zHW;23D>wYG`>xk=!_N@ExWkUM2&p}s4oX<3Xrd55WMpAsYvYw^EPZz4UMr6Yw0R7< zW%%)|jSHT{@u_AxDqlK+hR(4uE{2{vpfe4 z#;x@(So<~>*O`IyO{!v3GjpCc7lj~yt@vW{ENFp@*p`DkU}5jLa77K}}&eh<<#Fl`=?%T6jf?;sw2o(s!S0c~P#cG#JWqDHdTT%@yl z8f1Fh2(J$K$B;x#ToV-*%mnFYbX>y9?I7w}f4q4oJEt^KC%~=8-w+&Zh063f{%KC@s!2OB^mHwFYpi z0?!hmVW4=rZiD_;ib3s0=m=ofhUSqT?iBDp!g2J3fD3!AIiwYO!=&v*Pl|)Ow^m~n z2$p9_@Ln~|FC(-ulQ3x`)ES^yNt*&CIf2-lW1gHC+!uEzdrHw3IT#IpyprnY!9Q>=e2_%n zK>F%)jac28k_4XCHo6Ti*S)po2OBBo{(xPx1gD4$#+h2zv$trk^w-oMqo4l&MTo9ejn*jMJ%pM59FJ+2`n?;zF=ScPJ% zJIE3l0xBa!^>emV)CnHGg^oowE2c0LGkM}1p8aZPztv^{@e*#Vi*bs*-h{5!w#4!d zOGxu^bgxGO3qn~HZ*>4H;iHtJLh%CVX?0JLI!%-m`SagB9o zW7b1!)B>3MYK8id=i!t>XinC5V#o`nXujY7TaYx&U-$fusKNyC^?!7W4;g2~AYcC& zkjgiSQ6JXL$c}1t$lyM`++7x5;5$-Yu=>9jBOcZ5{=w_v?uz9mSn`icUrB+<`yaN; z3d=@l-EyZSo7I6B+g<(nM}u{E`Uv2RE;RE*_J@gnG|5c+s|SPkfd^=H*`$M1HY5yS zi&<5MRm_v->w7>h|vLY)Iy=;=8HimOk>WMEy)T$x<4dwD`O1@~}4@sDYsY zonb0|cl;uhatD&E)K8rs&OaZNkiJ)^uli}|!?$#3!>?X=OTBp359@n`ttByQkwH>Y zQ;B|FaAuOa?s@1zpxuor5A{VsGkVqEbInTqVs*s2_iEGTa9PdBTDSEMUJxLk;ZVMH zdw*eYR!I_B9(4Nf1BL?KEw+O%+0C$y+hd?(p#_yMOeqoUPK&G57{8bh!(VgTh@t2p zV(V``&?Za@*1NEl7L%|8dX)m7#FcYaSO45`WE0AqLNKTG|_E)T}{`w9K7jx3+lDz0-_wXtf# z0YF#{oxk?KQVsD@k38aU(t>4ubb)=LGd*fSM(+}cLJ&r{dk(QuCHB|ZfUKbZO2X;3w(#sKv1UAKxALu6e-8nhw>h9n* zt31VO9`$5QH0%~k4`Wuv14#9s$9!-sq$4*XAT?&KjWtyAwR|S(Z{uElpJr+xUzuip ze9EPH>RL$3nt5sjF-UADJO>KAm5XxkpC;^X*nirW;z!p?yLFCEt@zXGdTZ}3x)wC9cfDXOP$#8mq-7|FL&N7%GU^-kq>Cq` zYcGhBuFd_oFI{p)%Q8K?A5rxBR(eXwZB#ReESQ=aM#G~@WYQb{lY(CyYF`I8`0jCxHdKz;9dM`nPa*5(Xid^ zZZKUi(fzkFw^~4g%@MaF(tY)Fub_=R62`+x$)wEbnx-5*iVU{=jrIf z14Ur2Q|Z@=A;YliBh`tIjLnYRSlhN`Ps_i*ilhmqYP{1J@sD#y-K)ob7RnsKA3H}< z_qpqYj?f#i0mjw2yPR!w<#Ue3EAr(&`*Ggte9w-KR&ak?P^WZXQVX1GD60f^yKcbk z9;|=VU!+8!_EyfjQi1U4t@@PKK+PLw>Op)p!$_wYqi+G&v$j(<{tx#jd?Y7 z7O6b+{sY>DEa9yBI_JaZ3zCBYlQ!ULLWD}WSE7x~)JuBgPu{e)x{9hB`@K`{czNt) z?ZVvALT99LXFq{)k=L=F3%!0ar8-e}W#Eh+IZcu+=Ic=fR9j18nR2;wa)Rx!yb{)vS0%ou@(B#_0#WS4_* zr0bzsc}<&=xC7n(XOD*nVP^GNs)zcC6*S63um56Fz<8(E@RV;Bk*0DjMCt&IwJ^(F z?Jf@oHE)m33%~6vlCp{s1A?MDPh)qi?8vrPu zCbX1Jr#+}`FG?=7YY4=0eIpnqrLux7S5e(1TU@casTd#bg9j#WiFXvLGeSP4y(|j0 z98w@5gZo9>b1xw%xN>SB3^X$iz?SFZ#*UN=MNjYe~oC96j=&KuTM^vGbu zgz`kz0>03M-uyPL<7^aOGCpD*_qL(;Yn@8rJi+?X_bC!%bP|&e94bEZkwiUC6#KA{ ze)H!A0oHSyvXP|k=T?=>qxX4v23D=dtO4nB+v$e^nsOlxz>OrM8d9_`2@E^!?>HIN zlusM;#oHN{a5foY)MdCZN5^grErIx3fJgQDIY8;hI0Mf{O-;L27*wV5ATofvkZTkB z?AwVcCdpQ0m#&!BHGUuStzcf*BuzTmAWt{IF+RwoQvHo-z-zcO3(>yT7`f}PJ*+rv zUR7ROU7~`yjgift`g=BSyfI&uB3d>3Hc@YNQ!>b4NCeUv8+dnEHmZpLlGfx^NtO3M zhLpg=kT$)9DeNjUBMimV^mwEy#+jqp z)^)x+WKqvxKM67O7To4#F;{r%Wms88iD2p{wejQcrj2timVacBy?2cdQrBC8o{W9Y z_4NlT*jMBxe6f>5} zI&9kpxhYjHsjYaZxP=ZHCt74kHcTmzI1JYP!tv_p$KiWsrbK$%)0d1upZ#|Nw;Ob; zz7>zQTC_AjkVp{K5%-0I>vQywGT?1aI^OkDab?Ny^22&EQ`p_IQ)j7pixSJ7R_nrn zpItO{f#Q5>w-agCS);fP$VpG3o$2s`%NC4>mV^80^de`SiXT^3;OOFLU|cW_oZ%>z zc%WeHrRyNrC4IB2Ks0yyap(bW&YgU+f5N6^z_;eH`$q|1y5~4GF3LQ)HK%8HQ~1G` z7Z)wrp1=L_RM1H3zjKMP8b@_1mThV%uf^mLv5+q+9?^v*%G#<6Wwl!%)h4% z2c@SXN6xOqT^Bm#w@3TO(Cai_Ehil$FaRCvsL#wFx2-PPdG1-YPK(bN#DOB9{e_oV zzPQQ6By+hO)S)Nrv}0EKs!)@a0IxsKO!fjyZMo@oNIub$wq#q{#$8%}E4`_0@Btgg zVHYm5Td*el=gl7c&`kHO+33JWa|lpH39K!Rl7p=mNNXdePw~&dnOy!S5t&>sk>Ia; zp&#%(V9!R)M0?}%yUW?Lytk|8>Of|D%ad090C2&)8eva=sK-uHhiq`0NJM^Xbu?#A*$beZfGEqUb$hm+si9Yrl9)eTY z%fdR>07*%cjYUPDb=k^pgz#SP-%wRNyGgrUZH_i`X_5sQlaStAqP6wLf15t|%QXl+t&?8Z{;p%x&N9Lm28DNggs zp<%c}CIa9_nG&^`Nw#@{eMKw_UUw|mT)iIAu>;PLn0F6uCCXg-+HTtZlR;bH9Gwuj z5%Qm}y}H+vtU`Tr90FJn8nfz*3HE7k*nfck$8g*7q~{;Q*Hu5TxG&Rc|A%FTtWS*! z)1&irC?se+|8&vke^tg8WL?&6x9YBG#^k$zD*?cm89G*(4Po5G4rLLBNmS*>ouXc*g(lK2v)=l=j8~?5 z4#O;GX-9bGX>g&+V+1vSw<`j}BbREwak-O8)mpN-O3j!^r4ko^rg{;KiCLEh&%Enp zC#Sa>oCCpab$*nVU&x_5G@-E%b^dYejqCq3$oYPYST3e8GvtH>4O$a#1J`|uSF;`Eo}X94sEq?o-GQdtjv+DaZ}T>-F>}>_Tc$0Mg6|DVM5;Uhni8L0TfE$ zV96FY<7{p#Eh!Xp-SF#CaaLoxaC6n5U@;6#=p{(+!u{)EapFa|2&z#0O?So=^T@># z_m=fy#DD2{prQ1YVg&>Fh1TMFpOwmFcsGXu|CDb~lbM>am2t#gp|n@i^-LeZdsBgn zngVXH3B|@#UbGL~r=Xiu#f50SiD;GGitFSP=YnH+`KarvDv`IeAu%N~X_b2(wWXcQ z=z+ztX;5u;ZZ5gjc!1DIfvsm`vMO5#Q9Pk-SWkqR(Q3TllDEI?+amdl%gKeCQ58tl zQQcH9E1v#dkxFOE=j4)=?%A5Zvos8T_2&qf@IA20FVA9)tk%)6e@#o2Vr$E1g5Mt~(2i;mf?~-X2on^gdf7Dz zWEoOxi)*?A7agq1Fr0jj1;pCA-^0WbG3^ay&RdhAIAenWlk~ezwFPsp&{DV;pk_3*Vb=!3AsYD z2ijilMJPpE5uJm?3Q&@ZU_a014wN~Dh#hXW=Fgb~3_}LRg7QHAID=Y~=+$5SK{M5bx04K7=EZ#m<&<>89}pqnfqm{s1il~P_*&V%uyf^$ z2339$kzbQWk-I~-(QD=0>1-UGE9S_>B>&rJorrloz!z-1EQohK|^oVdevb6&0+Z zA3cJ(73(^e9c?f#>Sn(I|LfFzeEH~yA!)ehv*9JrVT-Eu2Tq1L&kn*5q8;yg%W&n8YU3-^$doI#yCRTzHtjY*qq7%4EDmv>ztNO1W&d z3Juj3B9{R4wy`Q1!26eC!6l+G2G1UV@Zj(_H;rsdS-x5`$(*9UWPBZ!1qjOf=kCWGeSGpo z=f%?b)#S%{4sna7Z|U!1m*YPMWYyV_X6|tbx5xGPETS@uqSfH@TG3!mI*Et8wv684 zW3EI&r;O7x__-1ge0GxfzGX@m=LxPq}7;PuYUyJ$X?<4nD#ovN5#)5`L!8pYEx85SN*$DjJD)5S-63-yyUsT^J`9_o`TC@) zr?2gA9FUju%P6y;I8A*Gz;60sM)TY1dY;E2kl2NL1{$k^V8IMCiasCr%RQ6Xvu=FQ z@5EsqM0!mdw5KXl8t59>pd4a6laZBAGbh~~D25N=SxSw-R#2fKkIXk34Q&I5ATR2w z$EB`8HV*yjST^Ciq|Q-I*o3tDg<}$>f+v`hq`TKk4c)90o&W{7< zRCdbhNqSnd-bjv)p#ANab}Q}8V-3y|^7(*+X5+fwf|m^lRC+6vnYylU_$C6W`pVA? zsjv?-Pv?`8Nf(^)M$CQ>et__>v1x-)2$wmiDAVEcJobv6liNj>7Tc5e00*W-$@-3I zi4YDi9X$ce$JLv<98+LwjebMzf7@me12EmOL}%j0Z9x1j!^p}Yrd?el_pHn{B+psc zm#tvOAVmIlC@ugB23Hk=l?v$!2La6%wwz(2 zNFtYd5lwCbx*DwLde#EhGtI|jJZ9T*JaO5>cprwUV_du|3-(t=01@n|%!^&k(n^Lc z0cXst;OP)t;CZhP*iR6Wku zlf_$D2<@qIE8&YUU51kQot{4mcp?LEkOQ0_5r~QTpm*W^4bsX{SKEyPd3}@02<4${ zj97j-dl&fm@|-g|qzwL#A#miRJ?wKT{uWfal+c*cSZ29w&+?1EA$v4KBQn-$(%cLPwDH1r4>NBY0PoHT zhcHn{`?A1Fx$UmIyXZ9=LumfcdXEJqnFujAUF)F|kou38F>&UZrP)V0PIEp5z6{4p zL!b0b_)@;!JVuv898^Ip5dK>KWrUI!7fpDMO_g6_Tf6+Q3#>-@MYe zMgKk#I@n)vq>x-O-;pkwuM)qR!Bo0;eE?SNUjL5Qxl=-+_Vi*vXgA7^7m5fN_{Y$h zKpxY)4drUMu|hiXS(g$wvZL#jtn1&~ip(9@S$0<3lak!`(cH@s%=QgOb z&C#f>ajTJ5!<$~P8aT;9_MM7`?sXby{z|B8Nj?$(!SfW-V^))a4S|0u=z}L0adjAq z7bsI2Sl$0IFuUUrH$E1sMn`{YH!aTagI_n;s8_I9(cW736Pt(ZgYZWV!Bo&vMwXYT z9$BRf(EwM+JD%v`R?t4W1-4qFX8216?TWvs$$`=kHTlWspq+|YDVL7i)X*Yyn4JNg z8Qwe9KHB-m(DP+>6>u*c7IzJQ;D}yJ)Kwuh;ObimE*(2Jj6q4>k9JSIaf@-WG8EmL zs|u4}U|j0(5p5&Fl&2ANaY>(-!=VX=l z!pBYGx>Alo4JDt@hx6bBA~!%Gz-c(-AdR@K&Rr)(W0$i>a45IPM`B28L+tx|Zjzab zPAUS~{UCz=KL#o1Zrj(_C>e#%=IZav6<;Xp-QNHNBDylAb2DV-QVkSRSH_yv1Z~Xv zGYDQ#o%zYT1GEmg!jK7*(UW%p#1rAWW1SChotS}CFHpRk?Zcy+yZz6+CtsE5uw`|E zy|mjiHRfytM<-P(W}`qFU*^*E_T+r@Rm>0Mp#bKF8^#_g%dPb7_76QFP64DX)^j5pB&H)O5nf!zfrSZ3SRfi==RpiXgepjGCtZBM~pLxD5{ z`9Z$W()kRg4ek#JIiNzJIQOvy?n-9(s$iT;=QRl&1%8pE+PsSWhYC6`vL#g#*L8)G zki)e%yX7bx@l~z3q@eZs$MPKLiR4&ZQeHns61@QfL#fFpDXBn>W^>)XpocR-hj7n1 zJs9Q=pE?WBgU~71m)|5VJ+>9x6MuL%A6?xASLnl5io02iJ#PSrNsBgE1x28bq+@fM z(DG4m8%hn{Js-zGjY$viJi%lbs9&&}iQ_3W!^NJC`@BJ+R=Y}i1JZ3+M1?#vkIqb`BV=dDXgUC zTK95ytgb~I>vmKrD%wx51%1Fox!UJuE*xF2{(H>VKT!pxHivOZhluvAzlkL8kWp+p zwdsG9AtZ91`Fcm&OI!f6Ey#Tt7m1EpZf3lGYo2)bW0F;*(#PQB@{R~|ir&6qXJ|}J zs9JY~%E11lhId$u`JKNWrw&0vi*}Qe1DtHl{V(+gnd0_E+Qg@=dI+(xL*DV+l-~@STNVf) z06>;Wo#LE3>M2(yz1=GHqf!95^(Ifv(#Mw&4VFCJo-#V&$ty)x7HQ3sn+_3X3CVY5 zk`G6ExLxpZMqj_y*hjW>MCpG{!Gg$J|S-G`NIA9y;YzNbEmxq%9x+GIPEySl)Gtn){Ce7V*c$t5nLWv> z0rS-$s2`B%%gP|a@Q97!73$lkOG)DI+wWN2{}BD^)A>i|@$_x?ZTSC0e1fbWuUuks zSojEja&BEm>)h3I3~%#arQc+``nF@?p`JLl{UA9bEydnIP%68|~_tI6pt6j#MeBaQKr0S7y+=*5faj=)@#ws~C*kw5Hw zCik?K%&E2H3e>dR#ykM(+?ETmyRG3YAy^up_N&V}==dI_Wp9|L;rw+-F(_<3{GCxyRTk1xzWf-0JN`rTDq;J=KhfL;0 zv~juN@=ejIfa~}Gk(Tx%D$1;Ls4vH?ooufxS1{5o-FLOlj&u83a!Jb{%)xD}KCD>+S zT&57%)}*^{LV@gllzMNEI4!k4j+3`^R(fS$c(tWmC)e|vH*TRTutH&}fYJ+kxMw=mb+DKmc8LhA z{R#^#=vmHM>Czq|6zj6nRdF)9B5Dd|mlH@0Eu(bf;>BCWtgY3D4ealQJ)ScpPFZQ~ z^m~g5uktS*#pV`mE*lV&{IA>mB5J+3`1=0MTlX0l&cCHEm~RgWjzVXTff??uO~Vo~8*qtA?5_br$IGeMbpAV;X0FCKj<%V1 zh1@_#a>8oGlnR!qIpwwFuP}8pn|G7IpTvQ$$(xiW~5QXmd*K-1o^uP zBCJi!HcWHJV`8sR3Peq#CWze2V(Jr9?y%wN4v$vjTfI5?Dg%FEnpe4GiQ+Kw2a@t; zMUF(9&w^qcM(W&9rDs zmt3Gp_wUjkytYR$ZvPriiJwe{yU{f7Kb{a4lJWEfH@-|l8NUf;Nt!vwswMH3^_|G4 zhmEXY(~lM(FFjQfeE2YThQ!2@=*~=!e)-;bU+nAEQcFfLx@-SuKEt`Ig%aB5W8OQ` z#5&%#UtD0+ds*m$`dP?oqKf&+`s61)D=Ix9@f>R|$~1lUf*DiHy0$+{GV9VvL4Xs? zd$%FsQkG$YBN_{q#JrP-A!1UK@^h#JaSyZs>Df|WbnUo3&!W)J>e{sy^**AB(IO_B z!k)NS^|&?NVPQ6w<+nAJf6@^xjE!eg);9zG=uR< zn+Xdv(U#4W_uxhLxobf$CX9%ryZVK2-`&29hl=QjJ7vysg~mRHi;Q)FB&3)FGHwK=a?1{lmFc`kI{PwzyuLd9ct)oR2Of)>Y(<1{Dx_Q_Eu6x`C6LRR9@U z6DhHBG%%kWSgmB191SkWK=DpJcSh*Um8h#EUe~^JXQ}mcqy`qaJCm;mff@_N6W;moi z_TfNrj%~&pPgqY~Wh$*-ey_70fSs7S?LWcQV-7-d?cxQ$l76ZG84Z}1OySBg$>>Bf zdae#FWJ+W-$`94RDh1}Z65dA~#nRiQ7u9>S^xEB0I!i18md|uf0h=;Qd5-un=BKUM zlj;6IH!H_9)Oz7C%=kmSR(7RWN33;QR+Xe~9cdBnEd~*(BOpd;e@+?7VUhi#NWZ{jPG+-c&`P)V0aC?ZwpN% zaYdzCXL}!8!v5;Ug&e?9R8mxw;V){ZU21u3E_EysourJ6zfah*ncjGC)R#BTl;-|2Zx&@=g(b@iTS8!cIQ6o3B96#MGl<8CDJ6;QMSS6 z!jkxyEP77l%X!@G#GB`z3dmi&l{g~)mQ&E}NjHncw}S_jedump{d_My83_X=|8fDE zNE>s4vPc^vI$+k#X$V7*OWKR|0|{L=t}g-@FZk2!4eaXNtYoGAQztjQ22x!=Tid(F z8X#3lLoD@7jiZ}sP%p=Q8Ob5W)UglcJjvEc{z-BZd8E&&v5Jxlf9^*|LlCY>%3#F9 zY3;IEjTDg$xRP^mU68$(AD~*x zjpB+Q5A{qePYrr_4`)$wQ}u4(2bWIhy-s+6A7~}b`I9NEEm)SEMd`1O3J`0{F%z#h zfseSF7INJTNPblNt9GI^c(!IuH5X;7my16O!PGOcUSQ26@Nkg329>7o4pHrD^|0wC1z;joASD!?R6 zG@oJ9JY=7#QyI!3VnZ?ZNE+$Kc_~R*ubUB{OGW59P0i}3NjrJ1nR(Neq<;+KL3ti` zyFNkp3j+;g#43@3a%DU4`oP3d*+PB2_m=rxpK8P{eqRz^W9qFeFEQ^+#E2_GSNcG| z#u}sQO9fESK=A=s52zXi@!_4df%zVITlGkJ&>jO%L20IA#``>aX8A|$s3m0nJ?LZ; z$kX3-q-s!j>-NYT6))-*v$sm|?7To!C9Boj+nRV9l-q)ut&+jAJQwW=64_B!J~H|o zB8eeSnq#_BsK_@&fg^5H(Y!K7mB+!YZTzx2af&)%!&lX(ocnkGPkY}T7gh4*+khxR zL=hAaK?Nj(B1wS;k(^_bX%LVkk|hU;N~TFljy6qd1j$hl5RjZfLX(4Jn$SS|F3vbQ zpPilAw{Q1-_Px*V{?k=`>V*29s+;Q8IY1mAf)$Ymbj9F|F*?+Bsl`WoO4+z4Ifuvr z%}2-dImbmOFmOiIAEXz1nG5wQ)}))^nLFu63@4I2B8?A%x`Mu@%HXX@bz(EAnNZgs z%?Evr$Z2_XAfAl1LQ}>DxSkj$Zo~grxB6)Obc_v`q zBArUX<;}qK?WR4c0W0z2n>ijuC(%pOo;ioDf7GMU*S@o}{~_*=x~JrOrAF$Y4$@I@ z__?u&q@VSlg8!uG6bDa9o*zt+08=7>%kOnMm9XEfQOd#rz?=G`E;V3$im=BLfI}pJ z!}tnUIu^hM=wd`pSm_z!0QP3cq=eg~hauVD;qfhO;%|KY)eKe;LO zkCyZ+ET@vaPQlXxz_UP8{NZ<{0p0I@KD8q4&sKO!?4COJ6baaAr+(JyS2+Fb zZmC`HBc=fy5)b6crKXJ&IO2H4yBM5yEOMZvb_l#=GQp(b%|n$9Xj`{a;5!Ix8xWK+ z`Wxs%d8((AQnJz>X#of>J4Z`|R-K!5{vN&2YPlA~~HRvPwm3 zxb__bPISP~1gGGF_0hzrjYjGSU?M~w5up}`m48D!5^vt7=oyX8;Ug93&Z9kPjGyg3 zibHNu?Ie07jWoWgsPLL^Q%!w*nes_A2kl1}d;dzr1eEE-{1m)%U98XfGu1;P>fC~r z+M4zh7)L}%cXou8fM~z0-o>8EI6L>BGo`oFgs2Xvq6NI#3e<|8(d87O71VxL5Tp8) zG|0kn0L{M^D>8aduBa1NWq!Xy)u8RPyFOq|^tqn95uV?%k%=&Ra2_)D_B*ENJLlSm zji`xS_lMQLgYGHDL)uscKlRNZh>k77i2A(g=TiMsMKH4wh@Z+^w1N`b7T^wmwF7G8 zMjWi9KCpLe>0NAy965JEGn@&rl1hF`k382>SB9lL=E?&+TO>6!(L@)3_CEDo2?%@- zU2fZo@`M6%U;HfkeQh8OJ+c0B_W-JSYL21jFXf{?9q%SJ>!y zrl?d{!Nc)%;J(J2i}h~%1`^FZ;Q*G)+W;N|=-gtH!)pG@2G-KM$TJjY3t7+<=uHfK zT=O9H>t%GsX7_Js_(r z15AnG3;d~`rO;Dcksz?>H&EMb;MCFY%mG-%W4`*av2vjCxe*ZEP0XZ=&1PX9FrPk% z=uVMf$p^gvEWuTvL((C1lXrmAsi5;w-#|=Qng|88-v$My2XEf0$cs*n_He};up=Tz z^2N_t`r|_TuiyWV5x@ytU!QClbH1vPE*W~o^nMM)Swj!xOF^{?r)-k5zK$#+iZl85 zI=>nakGZE@8su~;q%0ZW{G#uctM?_3*n+ozh9mBFwIS|leB{45NV!^QOl=y6HvKJf z_e&ubeO+V*_Gqu@wnrLkw=fAc=}!@TUNMF_&DLMt)nmh$$3gdUO{4a6RwhxdP+hz)41Jh!q6U=!0U2ff zV+Y>nEgPbaU?yW(XU?!vs!EOdRW8*{;X8PXUmP+<%so>EN{hWZVgA;;RI zUpEdz-X1Ywwt3x^v8E90Sn4ugwIKHKa$Os?Cd}&|1`WdF_LRyiV|7X0L@VXKSU z5selC+t}xuo~kUk?Imkqm8LSyBT}yT7D!l09OTNO&>}IU-=-p6-%etpwa(J28g7uv0k$F8 zIV_4o-0R@Of;%3ie%Y<=4*FDCTk+)+PMpu*nf50dEq^KLf`-i+0vl~rQoq2N_%(I) z)6kmmeOnEaXq!5C|Csf2mxO8S`#k+0F+k=aiDRW<_&*H>>iyxeF{fnR>Z*6yVll4S zEOabZDrl4J(#w?T3hI6NlErE zYmF|kl3V0^@W&nNjw34XCOV-*u3huwYmd#&=2Z-1-fm$Y0c)dy$oS{$fHV4w-7wCr z6>5d#ujv!j!54E;`$D}+bV;4Drq(_LX@BbSpDQ?>?}vBuj+RGtrd0DB&hMy&OcF1NwnjVz-eYBrZr1M{qRC8ig^LI@$!Co<*y?PjOOLL$*|hs=&TU9iq;?L8icJn*eGR%|Ha(>0!U)oy+^Wdj>7lyvc9U1Wx> z{=5~Iw4amnTCApAZ291JIXPC`In14y^?_4BZETIJdCyx!vm1=>eCeN!{_n3*!mY)! z4j09evKOWkxfufjiodUb{r4;Wmxlk52%KYjiEbAX&d{vS?T^vq5D+O(T#6w6K;uwg zRU=1yZ7jxA%r0q*+JZNrSiT|wO+Qpxi4%l3QzW>>PQ*xy$1$dLa>{X=RR>GG`i0Os~Q`TFg4g(-tVy++DekVxY1-osqf}p=Og2)7LgFQ0`mWX%>uFDZ9$|J{?~{Ee6ggAh3~Se~9@^_7z4k z%NnmU=vK}>sd1k>@n90#Zq;&c5h~jSfhnt6El*gLdy;XOW;X^SWR3Hht z=)XGVHr6t0z!{kpSyf<5{Y!06*z^A3bi7?hAGC>le`HN1s{(-550X|<}>!a!X+#%S3d1B6bXk8rgpd~ShIL5j_P zSuQmVeU`~3(B>kd6@6fXMq6K2L}V=ul~HhBZ%V%)p_0#6QvRu^jy}zDd3cvsfo~Es zrk!a(WVfTe=~db@#@+L`{`g76jm>pdXH{=;y)_>pL_b}or%7Pvsqd{(8ats^E}M`- zPA4(w!WlFryKj5+@;D%#tka`^rOD=i7TM3WDdd&h{Qj%U*zC*eS#Y9a1n0aGiG$mw z=SFqV7pXb0N}8HCgzdPgcZ2QVsijt&Wu$`^s3^J8b zhWMOllAmV%Rq1|*e&1y7ZmGN6MB8jdcXq!>rbC9uZ1@3GRi_rr*fV=yUv1v$rot2L z;6|8%AUltx@|tBW>-C9+2qp)LR|4I!W+Ou?4hM-Rj_!Kv-hM+#2OFNfORl@F!XgB@ zA^tomJ3^E5K~Q$@2^aSfNK?#SX2WZ*s1uF zg+8ug2=S1Y*?@qk%>T;dAOC?xjLj5V%iLlLRb`!dS^K-?JMT;FrWy({(QSqe6|g?2 zi%s?5fb9aIXtK5wye#4v-Ah{cUN04%uh6jjyz(d-Gb%Izw{#xj@$AmCpkQ=Tuy2>+ z8TWcW^m!2yfAM)dqBo>Gw(yOlb{8Fk$0W2d%H(6Y!EA{JZ^NF)VXLsB-l2oYM%${w zZx?oAHka+*bbJD&D&P4*A7B;zzwCINTuKzZm`rUSpBVhK9mMGWkCO4O%aU91tf=~r zEq9W4WM#l)fc<|r{*mop4gP;c;9RE@heO1&WxV4WPphCgB+0y^qRTMr(7<8dw+&&n zEP7~Gf0BtM^u`v}f9x4>SqyUw-MiqWtY2Z% zNGBZ7YGIg393QiOqx|>4(VB%Ew2TK77*^L|w{txQ*-`G$oUPqbuU_;6%k{BQRbYYp zuKMF>gF@?369rE#y89?>&xTQMtMrVnhK+%$N|*+%Jb(Wix8vSjqbFobpj$qFr;t`R zRG@D>U`aCR*C%qEm51BG)Whauu_DiPb?sH$TUbL?tp<}v`%#lU>t?weOfL&G3OZn+ zmN^yqhce(4AijgulFvUq{{LbKE+ZplrA!vA!=~Yog7ca1+D+iQ2Do-@d=LZlL>`@- zxpl7QSZK|>y5iG3Y}p){~*>lB(FvzFSZJ5Mfb|JRW!K!2Qv!_-1&Sd|PADb+ABTtpuUu~U& z03k;gny5?bEjxU0V$lm3a$0B30fMRMR`S)>-7YZ(=XsZ6p0DWWOXuX3ca^Q6%ApbP z7EjKmS{Dt zqyP3{6>pB(iPDbADn9(sIc6<)zz)vQuRg^N5vsbky75oGWQC_p zDG}8QcAcP}Prz(zX-RbpYV|Ft_nKQ;vhwq=GCLF`WgLUmddKYQFHDR{qAcTfqqS`d zc&S*z3l#@p-Ymb+& zCw}SQb<6QA!ES_#)g;%Lw$^60mu>gwPkQP_xpN(+E`V!*b97O>xGT8Zk5?L|qIwnt`nIAzKK&$u!uvyt9B z{{DNd<#MI^d_(0IT9s{sD>ET?L;EJ+B~lJAkXF#mXUPULiW=lJG^xR%2}*O)hva1bekNIlg#>J_q&~`CnFZMj~7KE3f@m%o33|%k0D=jf1Cd}#;uKG+$N7_`FS}c zxt_5rg2_IPj(xM_tJUr6Trxv0JJ9UBRdv%x3TgdtS($9cq!|{pQgeLwip#Nk%K85J zx3+T_S-9d0`NYMs^jYv=su{ync&maeMTpRTC76La~A@)?GVqBycm zai4#Zc9uoA2iP_*nFQZgWGVSCycPK;#s8xJPeFi9HH$^fAt~l@oUWl3jZVU#PAm-v zvxD1Q;_)YB-F}RY^OcVHk)G=fhNacn&T=(xPY`HH+do-PqkELQi?(z`K~((gKC6xA zTu=KG{g;ZX*PU5GuPf!D^a`4Fxh0CxE;612wa~0>9<)~h^6RPMCF$)cQ9 z)s+>axp)_N7yK4@7hGF|X#4&yI6nWdCE3V(OcJ>fhoI`|HE+x1dA!xVqSQKs75fxd z>o>c8RRQU_Y&{ReX@5c2guQairL?q&#h-1c;mL@v<>A|D6KQxxeSG=R94#rk_a6<; z>B&qI%b3<&=w)zuqJmR1S8v zqWVN#%DZwm?k13R!Nyp)5Gl4`nW&gFCBYfmDHc$h%&1_0J8o^3ea`AmCiTEduU*G# z`?>V{1Eq<;KK`~356!qfPNXwEAfLljymjs58@sC6#mgV+!0!5@p2G_kM?qD(7@cn6 zF1wu=%U`v6b?|CzDV5s#1hf5a%LUrlz3V!T(Yv0E+c-;%j0BZ3+2qCJoA))G#_mL` zFSlEDr|Unj$y7`xs1K^maWG;55?ngl*f`iQgV*F}L&l$+?R*fGhc6%_%VEl6>%=u*Wia9u4ffNn7|Z~^ zl8^FJ#p-6S1uf(C{5vDkxbTbh3h$sq={C-`{)L2@_5O8aAq-(-eP8jCd%nc>2XF89 zn62&bwp%HPJcVOUY2>jyrn0a$%cHzh;jXs6mepQJHL|-+RYmJ_+*W+~le$MsV+y-Y z9JjhKY(z7mmd0(RaS<$IS!$^Bb-6WnoCGc?dR)q`bXp%fh)KBG=T%GjcQ=SQ2!ti1 zN+CdZy!~CaWI~5cYa17zbt?CohQ_`@uaBrTPsl}A77Oj+_&&N%tjrt~{`#Db59Vg(o)~oAY z^W$el;5B`*a($$QNZ%4S7TZZB&$HidF_7!e83@&ha+*E@Ij@P)XZf@o(!oMPL zJx5ByO`g#?)dQom4<$MB2GWt3Z+pb5d>#Bhp1)lwzYMWi2`oyq9g>KTf zwqc(38`ArV)s$kT+74>IL2RLP;=|afH}e(c7Zy-eCST$(xs2As*YXR|p<247UmsfAhXTM;RsO1qQG?yg=fDGz1tb4l8_-xgnf z;8CEKr|~!|j%-_kH;*-TmS`Y4CatJ%)rakoxc@ZV4q~4;k%gglD+s&BxmvZbTascH z&C6kLo0Sgidg*IXYf;cWoX}&|gZPEg_C!R|h7V&qHmitLTEDPgRm0_@US0ykLxU{(o z$=sVQ(~{t7bF4iAw^FyhQCcX=$ig&w^v)E~MA>f@H(jWCKSiPuUcRjZ<( zDY0?^o2p=5Cw=2BbXgY;{&FVbkg(iNm6XPtOHNUm41X}No7)}dun4C)sOSLRX|0-d z3G4(ok$SRh-43FvuJS0(Ba-9(>?Xr?z0ABnb8OHJGBGg}J~05f7J3Nr3^S!J@n|t^ z*|&=CfoE!uAUL;64W8FuVLR3l_CBvIr-TaQ8?uVCEf0FI9j)!1oGRGMqYn+MfKjiP zN~-50-lGU_$G|2eSq@xFR>d&QsXZW5(Z4kN^iMoZmHq-JUFtaJm`q53M9@`?W;CA< z9a|aFd-QGTx-MKWjA+HcAB#G~q$X^E6BQS(K4)F%a$IT2x{r_%k<@+qc#x+MAuWM%dGY|$m3?QC`tP2Ph*?2I?`ecwQ&F3`L+x8qDAx6j|S{7yPcoF{0tLYD3%mTalIO4!QW1=@-5IWR3dS;?qb(+=%bNeB>RI7r6}%<0TgCW@;gxf8F*F z*f({9v{NwP)*LTJchv{QRZ|*~20v;9SJ09jb$k~EOmvtDFGlGXsu%K@X+Q4WF3&fR zidl zY3)%vK^;~LUWB!AlLGwMAN+Jbiz57nF(GJPjMU0eW9n}f`2oe>I})@=;nRa@f@ans zzkKiRsqx@n%3d}mr1_`ZfAsxV?u8ktA?lNxXwM%#`+)ZPQEb|AX#gZ={VMI(vX@Q6 zU(jn<{s8@%z6_m~)o#$>zCRZ5Vqoe9p?;lh<~NY)_X=s}D0>i~oeu4RQUY*IhaY_a z3^^?V-fi0PereL|6@jVSO#Kb0X-xf(BI>ZVIP)?z>xUaoJI#nyreUJo5#%tY8#zU_ z9FL|Wwl!?8Uuv1-5{}9V)5EM?$_y()ec-5iebE31!zkBh309O zbbUXte3!i5#mnFfU5-~p*M*}dT?`SlhEC7yoF}T_1fOe?F5c(AfW)*KI=xZjgiOmm zYT91HLsJ83w^K;HR~`%l2BS=|%Evc=NSaQm-{~_hTvRVGL8}2M3T$Tn2{3Uk0_k+= z{I6odOTSzDL{-6weWubGZx=aC0o-A@SV14k?Y{sLQbW%n(buiM_q=^tRi%Lr4z8#p zJ!;kYH@(_?goh>_rus1DV&x4m`+YZ%xBj~UoBufy!O5e4NLJo-hbRg+(da;0B(vAkwf00hT z@P8kTgB$-_&~JSoDF0c9ecb(R1fNcgAEWylsOIihaaa5oe=38 z|509(<~r2~{7S#1|7^$Y&|sg_?Q4qCAOr5EdyU2J_taxH&yHK{vd%`+FfBlnhy;qm z**lX0i+vi1d3|wN2|=R33N0=n=ms|dQBr6mC@JzU?=f&y8E<__Q}*2+$<@Zid3q7Z zy$J-%l?K{Uvg1GGxOk?}|MIjb2y|Uk2_h#Yseun;iow-A53BJLeH0~iOIvDyy2iw$ ztA#-yv~@F%1mC!8F2hyY=*kCEvUi-X$%ZcJUF~Y&YlNRE2%fur$s4zhA&r8>pNxsp z&?I=|okmZYDoCX^WbrY~oQO}knjWNaYlM&t=N4rfSzLn*{$=);uNZIL(Wa2UBL5;X zP_~l0GnU9-FIVC2BbcXCfPY{w;Qw17X%eA{TD}6#SV@-8Y6GwIzyfy2-b_ATU~o z5}bEo9h#pcD!SovJ}UD2+rD=s0%!$yNzt-q5U#Shul*TZNzoO8guR%d zDGN&wJx%%3b9`ED20p%RZ!U#hQNpLJ(u`e87ff(^lCFW2WxeC4bucb;UI!f8sQL{w z52-yVg&tRss?+hw`1|T*sNF5{@U~um1I#)7o%e7`KlZ)W;;OY!8`x z8!xQ$`ry*eUec$Jm>^KIMG|qrN{?3IJTt;2n=;?a_3niliNeAIdcP-M5f+mN25MuO zcA=Xm&vdyS^GsRjJODyi763a*MuhM_&&@Nvk(n=_X|FOJvbnTT2P_>*bwC3w_HB?{ z45^=HLMCkM&u_K7(b)*xGRslZb~LF}^HPln^yu9gmZ1&uS!cC4HZ@|F$sQGzLhj~lEetJ&CFf`8 zJ79*$d!EKC+HJDb2eS#30U-r&UWCFFKTv$YFV+YEf$rP^iQ|f@<4QODGAK!nKG2Xt zU#)xgJ9J9PXJOmaGE-+-kEVPs5KIRjD>$turdU4EXG(}Q__DEXe6rCnxpw*GZuO^e za~)nH*}mot2r*&DTly9BL5V}Sz)XN3bb8~$c5iW3bycZ__2>Ap*1?5ir34>9B@T0q z8)Zjx8uy*xxgfPqgmLGs1Ghy1!r5ysTOfCA+io?9)XQf~t^^v%M0&f3PE#{syOle- z&ow?e^S#f@w#HXwmE}fMDRmpWwU%&l_H&|~Or31RYQX1F+HeeLZz6jMW9>y+U7aTx zD;VNLrIM2o-Oa66_kO46fC{Z|<|l9j^=DZ*jp1zT8hU?#K2=DPh0hL~D-289AnGwy6+Nx5gt3-?!&&h{BCVVo=&41I0vDPP2gWF!^0z(Vf zq@aTV-&Xh9MauK*vQd(4^1=1Wk}@Au7!c$p4)~^RBr%I4w=c0H%ql5ye4B~Iff$`{ z8bx{~zt5#Av(Mexn-RMzNN;ORAR5dY*19J}o+7}6ShE>dL#u4>0u>RUf*BOiAOc%c zyxZ*}!-k+YzOH(u?=bdY%m{$^4!~#1drtMrDm&cwD#7^IzGR%puzZ${ykc^3l%_#f z0RJAWmjFh^a3{AmN_<<#+Asr%)W-ZK3WxD-rM-~Y&0DSyO&Y`8ZYMA9Un}@(G4Ty# zm+&r|T>n;18^yb>s+}v+9puLP@}D}LqFAV4BN>w7lJU|Q8)76@&5CYJ<3x+@o>YGY z7008JH7f;ptqbsqU0)~WiinW5v9Oy*A9L};+bPsdy4-E}QY<4V^KYQ7C((x*B7Nbi zQfbq9I`K(Ha7n^aS-AV{8gl1vApEVkd!GE&^5HIZ-Xl%Bw0Ha3R*xPbuch3noU_Qa z4W%pP=;qAy&8nkzD3|{r$iDmF8B0{#3Sm?e!c?H#-!PV{wP9D0xS2Bhp$I7cM0DPY+F3O`yLbk~a1rqH&ttL|1@G1@ z3rDDC3o`NKwkLE*V>Zm4Y<97vW!X&wC=y!b`8?Ip`4&>RQmGf$u~IPY;){y;CD=Yv zU9m1&x7Sj4Uwf-H)T4)%l6F7bg~}piD)}14Zti5F@>Es#as;wrQ}k3Fq0$);V@)V` zuiVG7%XqYRh~D6w?E1iy-bbeL;;;LD*ExLq_H74U6JskyJ zR$j()scH?^bcU*P?C|%i(9{$28njv{BMDaqhba6i90(pr76Q37bWK!*ZqWp16&YLEe>Nntfh_|$ z`z}S{)-*>m8{6BS6*a^#5ktq6zt-!gLl$D#9+X%n!c<-T$;OBJ4@r~xVV5X8o_bym zuqj~PGb`xLbC9KQg)hm<$Skm3bL&nvW0)pXGG0nz@wSjFv33iPOHj^5sW8i0@XeoR z=h6i`wp=_PYZ51&;m7b^{busZHugM2t*TMVHdVaavhQG`E&KHNn`F0gLqkk7uf=tJ zxEwhOC9`|?kh|k?PSP}ChdXt-Cz#$i@%(UA{N02BONpl@ucY7H3fGv5g?;G+X3Y60 zSMFu1TP6~>Lf;X^I3K9J%-tNyFI3lCQrC+`ASn-#Is(i!;&Qxbwv;QVIxZyJ+BLO+ zTDQ7bS+?sQP%aG&i4B5x7^MT1>`pQ=`JAT#gtZq*>a?QrMrKGAyR|J8<|#aMvP=Y` z@LE7^H*mBea5y9ki%>CYlMxcp)n!~+@n{=J8e+W9J2xWzR(B0n>sGEw!O7OyUZ8!y z-N5>Fk(ME)|10Sj83~;>N-m#=uUhSCfP~40j`1)S)=O5?$jGq|dS`}03vNv*eSRDp zecZ+XtI|>yOx2T#qfX)#}kx6=m3gwy0;#=btU~{ zd{5N?tE8I${hO3hmx5P&F36C;CYwcZrE!%(7v2K7>tmxIaOW}0nc6=z3E|9sywBN? zN@lA`FNpJ`gt9=l2D>j^3EBuS0AWG2%g?nmG^HC4GY|3E$8rMebW|*x<*L(OjF5- zwWUTrFFjcJd|rA>tq{y5Od0fz_iqy3cUlL5$Rf#J z-6(sGTk)xd@CJd&Sx}@9=sKT9{+m0J7eb5LD9pP%V1>-VEg|f2DjcCVf^ls%e5h{3 z;On%x{XQ1 z<1aZ$h8c*N@PbG$0 zalo>CeHna3eWZzU89*;hwV!B2YQ&h1%HThKgU~h^kMhlEJI9&(G4zS$D%qWc2;n^t zkq-#ez<`4T{1C(u5a3D^0Z@W2`x4*4mw6hVc3Qb)f64F$nHWf;Si0dNp~(#fGSIit F{{@Cl7k>Z% literal 0 HcmV?d00001 diff --git a/docs/user/wallets/android/img/android-main.jpg b/docs/user/wallets/android/img/android-main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94db29aefaa053610ff2790f96d6a534692d6328 GIT binary patch literal 69414 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 literal 0 HcmV?d00001 diff --git a/docs/user/wallets/android/img/menu-tools.jpg b/docs/user/wallets/android/img/menu-tools.jpg index 1529757f2fe164b38c824e3a45a2d83c6e3e9de6..469b0a7ce591a201691f2e761128a382143b2d7b 100644 GIT binary patch literal 62703 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 Q;o-kO!+)Fa#81Qj6A)Jk^Z)<= literal 158317 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 JLV)rAO#rFEgueg) diff --git a/docs/user/wallets/android/img/menu.jpg b/docs/user/wallets/android/img/menu.jpg index 92edfbc437e23d092d3a1b5ff957d8c30b8141eb..77dbcef0d83b446d495e2b6ccf12098b06b6fca9 100644 GIT binary patch literal 83469 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 qa~I5!92@IL@q8cG=e literal 280765 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

    Rpf-=x& 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

    ^HntRKedBD&* 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 KNrV8jU79ARN ziFHa&Ph($`m?(AW z2Ckr#*Cc|2v)TNfwprnO8m`+|iZzY3tKGw!%U4;!CH!-`LF>IfnMFbj0f*AFvfW22 zNjt%W<;IrvS^b*j;JIp zxB`6e%nGZJsHG7wUH&p>yjIn>vX5l`D+z7fDaZD<)Dnr^jTS#Q zlQ@ijFci_hazMNrZ;gsi$tfXXJVxGRFO}(csV~;T>M6JfWiYXbVTL;0Zr-%;v#m&z zqQXN~TM;$+Pf<=|dS>kX595o3I91%CiYz%st0{ zfq58|gL5doorXvuQ0l9DBu?kV>J1Mn!7xVENkngQ<4S0@cNw7Rtyaw!~C0d?6{G>o6YXks}Q%=8o zvHc`z@7%oj^NP|@VbJSt(ZNoWD?Y;0=841uR2(Z$N%|rOPo+0;eFptZFNvf$tvNq@ zr+f2h;RMekO+uvySl;AcCwTvVpCIqx;PJ}*6}CqmY$dO%-yev?^xxB57iiX`JMEH* zGDj_uU~?tj{d$LoX>ytoFpG9L=#7%R*XMnJWXj=KT9^!qRs9PP{FUX)A3m_bzrc*4FCl;D;}6B( zS&#%S25icg9+-O(cBtxGHR3QI7U{bC;N+Al-c6+0;u{1`!Yo#?oGUB(CN1|~1ERN{ zkb+~#kX5ab^i8-;Zln1EB1bWqkFbY0pWbQ7dW--{%a^g@B9WIHb8@=g6Uz_fJkyk5lh zc7{O9PHo6Q((&h=byDyk;$ob1kMIzax!$@b@L@jXyVX)FNFLvRJ2zfR5yZpDMx*B&SgyS}2 z#+;iQ4-W~f%D;)AmQVDNEt80lu^)x6{FM3DqAW-LeGuti)kiLO206h6iT4C<7SbrI z$9<>zee#j#@R|!t1^Cg#!`??r^^y>gE-zXbD;ibcedKS&xrEa#=n1$-hv;h-Xm#I? ztDVt(o=D=N@HnNe{I!(Q&xil+$z(@A6v3nIxtKcynhADc*8&PZ6ueX>E-z?lXZi$Y z`lVvbegu{Kj!j9qUJ>s*1**_37s48*_+0Ux99%rGRNTQN(et(8fR1*7jv+@OB=bt| zA}{dQvfXyYDo@x+l0C{d^kW{s(t!6*BWT9l*t7u{y9yhH4X&dc%7MX2`rhDt<6p>I zA0`Yc2A%c~dIM$G4)aR|ukN(oWsiLuL`|}4P>xHH)+v{2`y}|K2l2RDO%wcp-6P+f zX>j*k3s_?b^cl4E(f4w#O)Ew@6;GB#rF$FMFn&y!xRZCkvmPg)E|8yc!sR9DuvMp1 zSd0_O?imiEeGLR@jjFZbO3R?4WjF%;Ygd#(7W*Q5DhWCAt>g;X#q-UYz#;4rO4Zr# zYMn;^H|Heqq+fJ@QR;LzGxMg8*AT>;N zG*CdvMXLzJ>(Hy^MM<)*1CG`BlWAbzlmLPIrQ*%hK}_54G3ni?nkwJA_a_KY`|#Wm z5f)H2^hN_Z>cE&*TDW#__KA3y3bBn-sV4#%V?R#$^objsj2(_N`R}PMV(4j|Ex#+c zWAOtSW$1!93mJoTjQ1vvpzA|!E|@h2@{08`G$4>7t}Fc>ngD4en66WqM_E{17_O%a z*K1P~?BST;m=OH_s}h;Vqps(UOhe{zPUms%EpzTo!D^@cT(AIu$h&{F*=e2Eq~s6< zMp`HaBmY;gZv9oXhBSGxU#|mM3`f#E-Ems!jis&#Q9nMvgg;h9Rerwhk=Ehvp{*%` zrt5Y4SN)~W`*^#ACQTE2kKuv|Y63baY0N=R3foM`H-dQu=k=c6k^YqG+izg7q*)*x z&^Rwi`^-18do8vowq3P0ioakxA7zl>=6Ab9@o^1Oo-?4|nQDh=F{$onW>#~?!hy?D0pXbZaY6C*M^+RW z1nv)`DfhJm znm%#>t%j}=4^3g(>6lS*&=KCtqik|3G~57U&e?c85P~Rw=&=wJ70^Y*Y?zf(Xc&=^ z6Kdb+ghb}x8#syw*A7w>=4UJ;^YdrqK3Agct2#Og9zyQ!@0<-w>tAkMyuSvdl*XLa z@|x`4O&Caj*4M%yIY#4Nq^BY1#jzV5$aK2aW$1f!8>>t_yaqU-KMtuTpZ;)PB(VJP zj`>(9$%x9cIpeo+s&8lJb)YU?y>7dOqG$*CO&+D1sUp7&m$=LRt;c#G^X>%|rm{Td zG$%O9y%L$erwg;?Tx3tv>RhBS22o8bVRj|sDoc*6bRiWIumW11?|0U};JoZRSW`M% zjb@}@0aF_i)x<1%)TQj5>eL)WlsSFqV%odq3x1TC|f?0l%(L z%(!|VUiFl}O~wQDD<;rFP+copQUgLZrCQPlQD(E|cPG51;9i$b=s24NYotEKYLRoD z%aJmR=2UUCxgGJe{6iBY9;;`SHPQ+$y8aQ+5EoMDUYs-J$F>F-7=NZ=qk z^L|hnR0=vipc~V+DOiRzM4Jd0Jg4in49-5U>7OKid^@UB-0<80toMr?65d$z9^v=o zc~|<958P1ZVXCOHIfTykHKcF?#&`b-8`YtFV^Hx%M!n+6>G!OP{b6@8S@30CgPPG^V^xtzDcMNr}N<^_eWV)?+TXJ} zRdetLNkk-0x8hZFYDebt=bhO`$8(hD%rp2Vd>mJX(68=`GuMH@I|sTUVk5XFDzW{c zE0@4BdG&_Ab6~xPQDT~Bjcg6hzxl;HjM>>VrvH2H##}Av<OsVLYNefI1*r*+6Brq%X-UafbU zXCG72qZhxYpCr|J?~)mwBh}@Kgxv2`e;Ta^&*4bMiD(rmlfdaPvAqn6UY<6u{bDaH%%JeQ-#DbBuPR!K&jQ+gtj7nS*-=zdi@mhb+PMeR6IcY%gMnip}Nix!PHV@Y%1i}&y#8M9$)rQh_Fi4Y_y zN5Abf$G#mLmLW9l-pNPP3|81L3qdbIyT(;O8-v7X=VD8lu?dk#POLt_0|4ZYJ$C-btNB0p$4!8A^kC;#=})5_ec{sToOrE##x9s?n&DEi(f7Qt zNr~D{7VZ}q<>wz*Q}jRURu3B%S>-BT=-o9acAvln#{}!R0o8b-sa20lp+D9N69>Ms zu0e0yVefZWp|RiNh%EN|o}t&CU^l_>$VlC`Byc(tf=k0ZzYtb;PmT~I(XBazwcvl# ztw%|`#{Z&QOOaqif3w?EvM~C42`dzQSp}1efl_H7i`?M8A%3;^eHs02vNZRoi~=X) z%?BK07Bd#MQkz%o(*wf$h^4$ z9idxaB0g-BsTU{trzDyEs@zKBg93h;)bNc&nLQ=Py1Ei~>&u~E#HsZJ_!m;IV9FDT zL|*#xb_>1;JdGRoBi`IjpE{(C-cvYfKhztQ8`wGwaX54!InMiRvtZ6!UTmfd$@;x2 zL3b9U1XADgJOl$f%tWnFZAx5kp!*M7zoT`hI+Z zkZyxe_IbDrEv6}Al;35{+fVJaS#8hHCfsq@Bj97-Nr8Puo?W502K6R)za=DhJMeu# zp^p$6?BmbXN#Yzlu6jvyJnH7)+dOWuB~gcV_5^~$r< z(rT2|bTDZ>7%Bo6bPPH*m~F-&{53-2DSQ{~+|!zU^nD?lC|oF_^6rlxU6 zD8+^QYWI403>byhyG%C8iImlR1RcO8X{C$Qh{vSM+I+hk0b(+}838lvGs;0WZF(`- zHfD_0iaYy-HC9?^O+k@rkFXD%tS|FE*(~<2IP?PH{T9I{zp?8^I%4#OWZ%us^Yvmrz9|n$$%7DbZ915dX^9xlf&V1%)_=}+Os)e}9QeOd*DO~}f? zNytT;oa-8K4P>!Ff*(%qPx!Tn$_X(W`yMaWVF%VX4>P~soj%Xm*}m^}=tbB%^g0Zj zJNIw-L5Tv#7I71Lg>ER3Vij>O`7`V9&YXwt%jD{;NCbyWb`NBd(9@?~<~h`fLl#Hp zx6*vo>UI?VVEGmGL}$|jj|!TGtn@38OlJGKe<+Oe@bGu$XBJ;x1HQIvy%ZZhmM29O zzW*l=Njm1{DQc0$Q;oNJDrQUPF%lY+K@dgmm9auUi`3G;%nN;&qW_4M;iV7qT$#r` zgkz$$3hs4CpnIJDxl~$PoyP~(Xccf(9+^O|(Ia`tDs@v3d~&1TPb{{|`I-AGR?Y&1 zu#M-;5r=tNrM}k}dSeL<-b~$!INnq{jhaa=ms))=H3=Dp&0v|0{!VfFt@;|U$>Y$sXpxFgKOOjX|PVgvMY7}I;G604zR z8%**6DN#ne90F{BF!xoqsps(dyXw!8BU*Yz$dTtUzoaBY&ok#~@rC)zsik4~L@)s&ukqjt#o?M;yDrxM1HS$@?mrs;5=CW~yIu4)oZ@VwkeFEV(rlp-nniPjS525E|)oE|cV} zywHy(@4q8r@j6}j4l-~md39v!n^@&W3B>wv4Myp{+33L}W77IXhi5!kJ7i;FvSq2< z=NjPXFBPzj16~7KnpsH+0!ELkaeVvx{;A-p;_{BnH^pl0MF-Vul`zlKUT z?Y1Z9Pk21L(M2!kA<|L%XK9uRsGj-(J>|>kMV5nKKH`T-yAd1ezIWF|U+-N5Oz>;z zhrmOj+lR2TysMlRLj|L205F(&VGhV*pfCYC?>!YhB;ugEY=?uj@DwB7dxB=8`r zCw(2SO*?Eqr-FNNi84iBBoJ9PU3_C6#x(zqEU30$mX=n-GvTyqcc~K1w$9nH$Socf zBWRQwq=#Q{^G^Va{osG!7XN3--RT=w6vqnfnb&{;lK6$SPQJi-;%gI!fLSuUr}}|u zkiWiA9nI2@Tm@zx59uiOfSctkLN%oV4`zCcH=H6xQU??4kx42Nen*_Wqtm?U{!a{8 zRn4vx2MUyUA}RRJp^IC`Y7a-r~nVwZAogp zG)~lQEyfijMO^ZzY$6fnKDs65kFV&(_sepzPdXeFObTm3$h8Oql|^Nl!EvjNnU8FI zZX<4aARi`!pq?*^jd@eHbI-C-fA%v%*m+!)UZnL86&+T$x)#M(${?Fr>M)&q!{cW)RoAl5Z8H%q6}tn|B%K@{557X=mxQ#P%dXz@#MUMcn7Ej2*s_HAQ*2dMRTDcnSvI7FP8!WXSl+^k*3W?BEO%^1w8 zE6vc2ae??p$zdcpg?gq>g8LE+Fff1gA};kp8+(&0VC(hX*u3Vc!`Rl3ZXm2K*AiO77-I5# z1k6XZw2As0oo&mAb;?)!I3Z6u1xpq1ZVZh{C6U+n-74QQr9=Ii3s;TBVzgCw2wJ<& zjpd!IqPxLzsekJ}x9yUFWfh!vS0?O|mqYJe7fyh693mx1E##P~OJdo&3>+}P^wrdH zcs&bsH|M7s@=)l%A-zdP09JPrWJN0$B1-uchJ zL^H}WpWX2o-Cu%HXf4)A=u&Otmj>Ik3Cww6sEkNOStQc==*MA0 zB!jwYk92Hdx3s#t8kY{}bz7f|n7^1y<971`)R7W7E30q&MEf#Wi-~>9ZPHk+XBGJd zqo%y=G+aE4hRh zp%#s7S8S|Etr3|a;+zoftCe+WKZ-25Kg1<`{%mO7Bh11q+~G5GM~8$jW%_)dN{TCL zOiM_ORS=e&T~jle40T>Bd+<2SpDhd#uQlHzIC0Fe^bNbn54gFR`o}-N?f_LJzR0sYKVJ|!si;%fj0t@C@E?n1u0l@0Iu~gq5iC=8x{$`b zGdzh4NNzJt;<`XCNKAl|AaW8NX>9KD&ydUhMZ%~5_nDj4E#eGRbqyfR#`_PBTm*E^ zDbBv^cfhU=<95=nDuy9F#eXk8Kq1i#aaZHxY$+0R+s4;``z`Ct5`n4Z=jY4#lZwJ? zz-G(``Ao`?Mx&4l()vLjVd;Dgu#CeCUETlv_8wdTLPI(Yhri0X*(}@Z#UK{$_9HiF z`JPd3NKMm%n4rXo$0cF#8qia|rX-trw%lTQMACQMV)#$$^6z<3_=@GqPUW2C7byqA zLeg$ou`zNvlMdFoVz-lbT(=wxB5%;61=Xnx@FATm3%OxH_V=+-5vnV%M#3D8RFgYM z(oU#a6T|fa)Dg`qAm!V9%@x65-;OIh3yJ$*&bI0>lzutjOrl}j-XcA!@0a~vuA};E zfWoC8ljsM9kweSVA1$W_nT~-ZEh3!@#5G_Mat653H}L7sy#M_?GL|8M@>DDSqDUOg zaJ2AFnSR@CWz><&gXHAr7tJE}?paHfHsAF5f#-fWDJ?BIvc?12O3(FN4awE-77^Fs16dA-!IPK8fIo29mbN@wwV8Cq~|YcAR{^(>rr^WdkH1l0lw zVH7PdS15#D+W%CA!JI4eTLTFfE`JeZDOGa~u+WN`y7ZpAjJpE91KeeoC#C!Ulh1#x z_9t1Ch3?G(lJR&3S9mHYnn5QI*9HxGiE}YyGEb2bk4!>!(VFyf}q}cGiCc>3Q02a;RQA{ zOwZZsp3qItS>E>Hqwwj`0raPZkgG0@E!Z-cd2ha zyh&9G)^vz!D-uh_Xo_j{(xdeSW>NV)l7i8EevP<4m0t&hawqW zlG2=g+?;u)NeK;-9*C8xt&JlRx4_3+0y9K26r-(W7-S!EyVU9$Rq6nJgakJastD!g z-aP`h1J zqi+caxdM0Zx4^V-#$v1rjO~gI$4y8c>2;h(G{L_)AU;jl``P0kh=(wTY#2ucRrm6E6XPa4O6cFeyST!j~xHstMx(;1nu zN%x;sXVSUwgNNRZ^UTWX*b$4^>fX?w_7@qeH2K6Y657ZN6{a~=ngjD_H%2GSb)vP} z>^?&@C-%rw!P0w$BJmjob=JR5*4Emb6C=N9@h?jEYxX%o=+?R|0jVL*;@%;vQ+o$H z0wx!i&CT7=*Zlrp4%|Gq}7{SQEr~b4=m1&Szb_D z;>UO9kXGkXHAbg=Lkg3#y9~69v!{yNsj>v+dgqBYjZ*q922uK32>D0e&I46G{3(p( z@DTf=WK|KL4-f*5{ENc0{GCtAbL1h7X9}m{mptN^w`G(5*Cz!9(nhH|q~fAqW)~Ga z4#ykVG_BX+iI<#4cA1!*)fVp&or4(m#mlEC#m*4$sV?7!?5XBGQitI9_ zCv|-8TbDXND*bhlzRwd+4^QlFxjI2O1P!_>J&WxLw+$jQAF}+e)^=w=f{pbQ(!=N? zaC*0*ZnTr~o1aILQ0Oc6iX@nEv67@ZZ>hOc7M8*=I@9Y3llmm_wDI+Iru z{B`M^GuD)>P9r~azKuS$UoSmA0ikx5C*8xf79U*DJ2qWDGG*g2w7fx>A?@PYdHL!J zJ_BwXYQ6o>24GUi6HHoEq7|wYzP=c8B(qgeCQmqf?r#zES{xFELRZ<0=-cMfWKUI< z?Sb_kIen>yG3>K1UHauSN^6xmet|A5^K$aV zkA7NUZsSS0cVw1<{TN%0l6p0j;T3HLP9nJ+`>o)@Rw zDYn76=Q$1K_h%)7lp}PH!1me_t(Y~jU9GP1Baiqn*R-Vc1fllsNDG0unxg}M+;;hj z{|_lOYb*=O5~+{a>)x{^o{0Qlsp|XjL#)%?+7N3U_2t92SE@~)Qa>iyEXWvg8cMgt zu(R3Z%;ZPs>rBWf8TL;~|1A@iGGy>k`jNR=gteTs`OQ%ykhsT6-rK>0((=*?qXaDf zj2L74CUo)iyJ?k(rnlyorM#ozSn`cm?x-8wZ!`E>#&$aGqKIvZ)i;Ky7kJkc}tkeT^FBYt9GZ(-1+W( z*V*Zz%6GrbyK}4h)RX6ldES5Lr^L#db?=AO>>U8JI$p^nU7gK!m-@o|qe7)m84GW5%ECVh*-3{!;{FVH9e8=D7 zJ(K>r|J(ll>glw)MRVsX|C;qT>`bk9x!lM5Hp+*0pHDxq`~A1_hO$4x`+@r+%lW?l z`tXrKa=X9pJHA_w&Doa9Et&5#eaf_&S*H(2Wb5{hAjam0x1H#7Wh4_sQk+}`4gZ{&8fdA&Q$ZbSk5Q|Z^fyRDTuKB;cC#v|QV8_(Cw zuj#FP;`=22*e)a8D}^$D)pe#tZce@8tZnY_^5+ZANZ+!9*He@=OxwjKcSjtPs-2a+ z*?+T}vZYgO;pCvt=c<4I`L{pbD7|GiimH z>+HM_Umta?NttDobF*9R=}GBLNq2Xfbu7BcGD#(XA#K;g5E1RJo}@{hWu7XN-agqd z$x}yVlBY_KSJ3RD$+`Q@{yH#l&LEg1zzUfEJlO%9?_qO0ZX)h2Z@uHCsC?AQyz*_Y zN|G`ZjxF7?I5Ph6ER)|b#UCn;=eJMX*LGiH{u~Z- zSJBe#;`dfeN>RMKbMadti=w2*5~og!&U=w@VU_0mZFbUI9c9uj->5i!6_?-t_hP=e zU3bOCe@ou3zua)4fq(Y5-M}vNFH!rMz#-`Czt{b?Pbr=M;WKcq=*_?V)#kZnKOJO# zZ#4>BBUI%cwXURVX3EN_SB}50_{FTBvu;+k)b0AdQ_DZCd~h_(HpH;)M46zP&vQLf z&z;}zy?o-k+C28*X5HC(CxUdk-KS-`#+r3zJhZfs1gV)csD`JE>UOZa) z?MY5dzY62_rMI^Im40>kW#+ny<1yJ?^K8T8tY+0cSKG%L_G+uRPGruL>5C^HzuxoM zUI2Jns?-DGVh5tC9=JbV{%iWT_AhKwzKLs=zc~0V?4Mte7I3^_^{%A%ySCY`4h`iw zZ6M-#I%G|2ZDX?F;fj`mlZTrhp3ZPPdbmPuJ>SzU()HJrg3_iH`TWSg!ytOqH)N&O z>fWrNqAbBcKi{X@CdC4ewVhp;J88;uvpG+mTsoBdbjhCSSN4i8U|`G?AjP$#YUvmP I{QqwP0R97~UjP6A diff --git a/docs/user/wallets/android/img/voting-key-request.jpg b/docs/user/wallets/android/img/voting-key-request.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52d0689381817477c0b893bc8f2846e8c439d37c GIT binary patch literal 45095 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

    %8&6CBXBC;r6|WwBaD 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�Jb22EwZq8Te^b9V>iB`fEtoM^ZX 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�Sp*FZ8dG%XWiZc5lcJa6M9Wn?*?lr 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%0AarPm$&X?g_s0N3y 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 literal 0 HcmV?d00001 diff --git a/docs/user/wallets/android/index.rst b/docs/user/wallets/android/index.rst index 4996b4f8e..3afdd7b74 100644 --- a/docs/user/wallets/android/index.rst +++ b/docs/user/wallets/android/index.rst @@ -18,9 +18,9 @@ paper wallets and more. getting-started.rst advanced-functions.rst -.. image:: img/android1.png +.. image:: img/android-login.jpg :width: 160 px -.. image:: img/android2.png +.. image:: img/android-main.jpg :width: 160 px *Dash Android Wallet* From a739e747c6e4e0e8b31816e6d5fba41e811bf713 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 11 Dec 2024 14:29:18 -0500 Subject: [PATCH 12/14] build: exclude core docs from transifex for now (#441) * docs: small changes to bypass warnings Several links had to be modified because they caused warnings when running gettext * build: temporarily overwrite dip readme during transifex processing Otherwise warnings are thrown that block the process * build: exclude core docs from transifex for now They weren't there prior to the integration of Core / User docs. Leaving as-is for now to avoid a massive increase in pages for translation. * build: add missing part of transifex script back in * refactor: rewrap readme with wider columns * docs: add note about core docs --- ...remote-procedure-calls-raw-transactions.md | 4 +-- ...ransactions-transaction-fees-and-change.md | 2 +- transifex/README.md | 35 ++++++++++--------- transifex/pushtx.sh | 9 +++++ 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/docs/core/api/remote-procedure-calls-raw-transactions.md b/docs/core/api/remote-procedure-calls-raw-transactions.md index 4b22574b9..bb47bda01 100644 --- a/docs/core/api/remote-procedure-calls-raw-transactions.md +++ b/docs/core/api/remote-procedure-calls-raw-transactions.md @@ -1205,14 +1205,14 @@ _Result (if verbose=`false`)---the serialized transactions_ | Name | Type | Presence | Description | | -------- | ------------ | ----------------------- | ----------- | | `result` | object | Required
    (exactly 1) | If the transaction was found, this will be an object containing the serialized transaction encoded as hex. | -|→
    TXID / Raw tx | string:string | Required
    (1 or more) | A key/value pair with the transaction ID (key) and raw transaction data (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#rpc-raw-txs-getrawtx-hex) for an example of the hex transaction data. | +|→
    TXID / Raw tx | string:string | Required
    (1 or more) | A key/value pair with the transaction ID (key) and raw transaction data (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) for an example of the hex transaction data. | _Result (if verbose=`true`)---the decoded transactions_ | Name | Type | Presence | Description | | --------------------------- | -------------- | ----------------------- | ----------- | | `result` | object | Required
    (exactly 1) | If the transaction was found, this will be an object describing it | -|→
    TXID / Decoded tx | string:string | Required
    (1 or more) | A key/value pair with the transaction ID (key) and decoded transaction data represented in JSON (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#rpc-raw-txs-getrawtx-decoded) for an example of the decoded transaction data. | +|→
    TXID / Decoded tx | string:string | Required
    (1 or more) | A key/value pair with the transaction ID (key) and decoded transaction data represented in JSON (value). See the [`getrawtransaction` RPC](../api/remote-procedure-calls-raw-transactions.md#getrawtransaction) for an example of the decoded transaction data. | _Examples from Dash Core 20.1.0_ diff --git a/docs/core/guide/transactions-transaction-fees-and-change.md b/docs/core/guide/transactions-transaction-fees-and-change.md index f226e243b..9eeaba55f 100644 --- a/docs/core/guide/transactions-transaction-fees-and-change.md +++ b/docs/core/guide/transactions-transaction-fees-and-change.md @@ -6,7 +6,7 @@ # Transaction Fees and Change -Transactions pay fees based on the total byte size of the signed transaction. Fees per byte are calculated based on current demand for space in mined blocks with fees rising as demand increases. The [transaction fee](../resources/glossary.md#transaction-fee) is split between the miner (25%) and masternode (75%), as explained in the [block reward allocation section](../../user/introduction/features.rst#block-reward-allocation). It is ultimately up to each [miner](../resources/glossary.md#miner) to choose the minimum transaction fee they will accept. +Transactions pay fees based on the total byte size of the signed transaction. Fees per byte are calculated based on current demand for space in mined blocks with fees rising as demand increases. The [transaction fee](../resources/glossary.md#transaction-fee) is split between the miner (25%) and masternode (75%), as explained in the [block reward allocation section](../../user/introduction/features.rst). It is ultimately up to each [miner](../resources/glossary.md#miner) to choose the minimum transaction fee they will accept. All transactions are prioritized based on their fee per byte, with higher-paying transactions being added in sequence until all of the available space is filled. diff --git a/transifex/README.md b/transifex/README.md index 99faf7ded..aef3bb88b 100644 --- a/transifex/README.md +++ b/transifex/README.md @@ -1,8 +1,11 @@ # Transifex -Transifex is used to support multiple languages. The scripts in this folder -assist with pushing data for translators to Transifex and retrieving translated -information. +Transifex is used to support multiple languages. The scripts in this folder assist with pushing data +for translators to Transifex and retrieving translated information. + +**Note**: Currently only user docs (docs/user directory) are translated. Core developer docs were +integrated with this repository when Dash Core v22.0 was released, but they are excluded from +translation. ## Install required packages @@ -21,17 +24,17 @@ curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bas ## Set webhook variables -The `build.sh` script requires Transifex webhook token and URL values. These -should be defined in a `.env` file. See [.env.example](.env.example) for an -example of the format. +The `build.sh` script requires Transifex webhook token and URL values. These should be defined in a +`.env` file. See [.env.example](.env.example) for an example of the format. ## Usage -Using the scripts requires adding a Transifex API token to an account that has -access to the project as mention in the [Transifex client documentation](https://docs.transifex.com/client/introduction#authenticating). +Using the scripts requires adding a Transifex API token to an account that has access to the project +as mention in the [Transifex client +documentation](https://docs.transifex.com/client/introduction#authenticating). -It is also necessary to add authorization information in a `.transifexrc` file -as shown in this example: +It is also necessary to add authorization information in a `.transifexrc` file as shown in this +example: ```text [https://www.transifex.com] @@ -49,8 +52,8 @@ Run the following from the root of the project to upload to Transifex: ./transifex/pushtx.sh ``` -**Note**: do not commit the *.po file changes created by the pushtx script. Those files should only be -committed after [pulling the latest changes](#to-retrieve-from-transifex). +**Note**: do not commit the *.po file changes created by the pushtx script. Those files should only +be committed after [pulling the latest changes](#to-retrieve-from-transifex). ### To retrieve from Transifex @@ -62,8 +65,8 @@ Next run the following to retrieve the translation updates: ### To build localized sites -Make sure the webhook variables are accessible. Run the following in the folder -containing your `.env` file: +Make sure the webhook variables are accessible. Run the following in the folder containing your +`.env` file: ``` bash source .env @@ -77,8 +80,8 @@ Next run the following to trigger builds for each language on ReadTheDocs: ### To check build status for localized sites -Make sure the [token](https://docs.readthedocs.io/en/stable/api/v3.html#token) variable is accessible. Run the following in the folder containing your `.env` -file: +Make sure the [token](https://docs.readthedocs.io/en/stable/api/v3.html#token) variable is +accessible. Run the following in the folder containing your `.env` file: ``` bash source .env diff --git a/transifex/pushtx.sh b/transifex/pushtx.sh index dce61df68..94a5af504 100755 --- a/transifex/pushtx.sh +++ b/transifex/pushtx.sh @@ -8,6 +8,9 @@ git fetch git checkout $DOC_VERSION git pull upstream $DOC_VERSION +# Temporarily replace docs/core/dips/README.md to avoid warnings +echo "# Dash Improvement Proposals (DIPs)" > docs/core/dips/README.md + # Make files needed by sphinx-intl rm -r _build make gettext 2>&1 | tee /tmp/makelog_$$.log @@ -15,6 +18,12 @@ if [ $PIPESTATUS -ne 0 ]; then echo "make failed, bailing out...";exit 1 ;fi grep ": WARNING: " /tmp/makelog_$$.log if [ $? -eq 0 ]; then echo "make issued a WARNING, bailing out...";exit 2;fi +# Remove gettext files and directories for docs/core +rm -r _build/gettext/docs/core + +# Restore the original docs/core/dips/README.md from git +git checkout -- docs/core/dips/README.md + # Update files for all languages sphinx-intl update -p _build/gettext -l de -l pt -l ko -l el -l ar -l ru -l zh_CN -l fr -l es -l ja -l vi -l zh_TW -l it -l tl sphinx-intl update -l en From 7259cfb160aa20726600b09999c12c163d806f39 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 11 Dec 2024 15:14:36 -0500 Subject: [PATCH 13/14] feat: selectively hide language selector (#442) * chore: remove commented out code * feat: selectively hide language selector * fix: check for excluded path properly --- _static/js/lang.js | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/_static/js/lang.js b/_static/js/lang.js index b290523c8..279fb10be 100644 --- a/_static/js/lang.js +++ b/_static/js/lang.js @@ -1,26 +1,23 @@ $(document).ready(function() { /* Select current language */ $('#langselect').val(DOCUMENTATION_OPTIONS['LANGUAGE']); - - /* Set alternate links - var langs = [ "de", "en", "es", "fr", "pt", "vi", "el", "ru", "ko", "ja", "zh-Hans", "zh-Hant", "ar", "x-default" ]; - var pageURL = $(location).attr("href"); - pageURL = pageURL.replace("https://docs.dash.org/" + DOCUMENTATION_OPTIONS['LANGUAGE'] , ""); - $.each(langs, function(index, value) { - var link = document.createElement('link'); - link.rel = "alternate"; - link.hreflang = value; - if (value == "x-default") { - link.href = "https://docs.dash.org/en" + pageURL; - } else if (value == "zh-Hans") { - link.href = "https://docs.dash.org/zh_CN" + pageURL; - } else if (value == "zh-Hant") { - link.href = "https://docs.dash.org/zh_TW" + pageURL; - } else { - link.href = "https://docs.dash.org/" + value + pageURL; - } - jQuery('head').append(link); - });*/ + + // Define paths where the language selector should be hidden + var excludePattern = [ + "/docs/core/" + ]; + + // Get the current path of the page + var pagePath = $(location).attr("pathname"); + console.log(pagePath) + // Check if the current page path contains the exclude pattern + var shouldHideLangSelector = pagePath.includes(excludePattern); + + if (shouldHideLangSelector) { + $('#langselect').hide(); + } else { + $('#langselect').show(); // Ensure it's shown if not excluded + } }); $(function(){ @@ -41,7 +38,7 @@ $(function(){ // Convert language codes var siteLang = DOCUMENTATION_OPTIONS['LANGUAGE']; var currentLang = convertLangCode(siteLang); - var newLang = convertLangCode($('#langselect').val());; + var newLang = convertLangCode($('#langselect').val()); pageURL = pageURL.replace(siteURL + currentLang, ""); var newFullURL = siteURL + newLang + pageURL; From f0037a3fccefd4a18a63b84db6c31fe31e0a7558 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 12 Dec 2024 10:04:55 -0500 Subject: [PATCH 14/14] docs: update previous version links (#443) --- _templates/sidebar-main.html | 2 +- docs/core/api/remote-procedure-calls-removed.md | 2 +- docs/core/api/remote-procedure-calls-wallet-deprecated.md | 2 +- docs/core/index.md | 2 +- docs/core/reference/p2p-network-control-messages.md | 2 +- docs/core/reference/p2p-network-deprecated-messages.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_templates/sidebar-main.html b/_templates/sidebar-main.html index 4c5ee09aa..e4becb27b 100644 --- a/_templates/sidebar-main.html +++ b/_templates/sidebar-main.html @@ -167,7 +167,7 @@ Proposals
  • Bitcoin Whitepaper
  • Previous Version of Docs + href="https://docs.dash.org/projects/core/en/21.0.0/docs/index.html">Previous Version of Docs
  • diff --git a/docs/core/api/remote-procedure-calls-removed.md b/docs/core/api/remote-procedure-calls-removed.md index b9f61aa9e..4ff760586 100644 --- a/docs/core/api/remote-procedure-calls-removed.md +++ b/docs/core/api/remote-procedure-calls-removed.md @@ -6,7 +6,7 @@ # Removed RPCs -The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/api/remote-procedure-calls-removed.html) for RPCs removed longer ago. +The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.1.0/docs/api/remote-procedure-calls-removed.html) for RPCs removed longer ago. ## GObject Vote-conf diff --git a/docs/core/api/remote-procedure-calls-wallet-deprecated.md b/docs/core/api/remote-procedure-calls-wallet-deprecated.md index 91a9a747b..cc5b32f52 100644 --- a/docs/core/api/remote-procedure-calls-wallet-deprecated.md +++ b/docs/core/api/remote-procedure-calls-wallet-deprecated.md @@ -10,4 +10,4 @@ RPCs that require wallet support are **not available on masternodes** for security reasons. Such RPCs are designated with a "_Requires wallet support_" message. ::: -The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/api/remote-procedure-calls-wallet-deprecated.html) for RPCs removed longer ago. +The following RPCs were recently removed. See the [previous version of documentation](https://docs.dash.org/projects/core/en/20.1.0/docs/api/remote-procedure-calls-wallet-deprecated.html) for RPCs removed longer ago. diff --git a/docs/core/index.md b/docs/core/index.md index 154d24791..169c3d83e 100644 --- a/docs/core/index.md +++ b/docs/core/index.md @@ -155,7 +155,7 @@ SDK Resources Dash Whitepaper Bitcoin Whitepaper -Previous Version of Docs +Previous Version of Docs ``` Questions about Dash development are best asked in one of the [Dash development diff --git a/docs/core/reference/p2p-network-control-messages.md b/docs/core/reference/p2p-network-control-messages.md index 9da674f1b..ef656a48d 100644 --- a/docs/core/reference/p2p-network-control-messages.md +++ b/docs/core/reference/p2p-network-control-messages.md @@ -441,7 +441,7 @@ See [PR 5398](https://github.com/dashpay/dash/pull/5398) for implementation deta ### Removed sporks -The following sporks were used in the past but are no longer necessary and have been removed recently. To see sporks removed longer ago, please see the [previous version of documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/reference/p2p-network-control-messages.html#removed-sporks). +The following sporks were used in the past but are no longer necessary and have been removed recently. To see sporks removed longer ago, please see the [previous version of documentation](https://docs.dash.org/projects/core/en/21.0.0/docs/reference/p2p-network-control-messages.html#removed-sporks). | Spork ID | Num. | Name | Description | | :----------: | :----------: | ----------- | ----------- | diff --git a/docs/core/reference/p2p-network-deprecated-messages.md b/docs/core/reference/p2p-network-deprecated-messages.md index 4178e4a9c..0bea55ff5 100644 --- a/docs/core/reference/p2p-network-deprecated-messages.md +++ b/docs/core/reference/p2p-network-deprecated-messages.md @@ -2,7 +2,7 @@ The following network messages have been recently deprecated and should no longer be used. To see network messages removed longer ago, please see the [previous version of -documentation](https://docs.dash.org/projects/core/en/20.0.0/docs/reference/p2p-network-deprecated-messages.html). +documentation](https://docs.dash.org/projects/core/en/21.0.0/docs/reference/p2p-network-deprecated-messages.html). ## islock