From cfbe787ed4436a1b82de9b393d0c11262030067a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 12 May 2023 13:56:40 +0200 Subject: [PATCH 001/110] Adapt TIP-47 from TIP-19 --- .../assets/microtransactions_pt3_layer1.png | Bin 0 -> 151403 bytes .../assets/microtransactions_pt3_layer2.png | Bin 0 -> 135355 bytes tips/TIP-0047/tip-0047.md | 145 ++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer1.png create mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer2.png create mode 100644 tips/TIP-0047/tip-0047.md diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer1.png b/tips/TIP-0047/assets/microtransactions_pt3_layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..561db0bb10b06d55b8b34ad89ce27f95c5f45c22 GIT binary patch literal 151403 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
    0bU6`jY&V0Bfv!nW;`K!e*PYS%T;eKcRFCFJo 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 X;=Oo!w%qtV@SmEJCN@vO#P9zAY}gb> literal 0 HcmV?d00001 diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer2.png b/tips/TIP-0047/assets/microtransactions_pt3_layer2.png new file mode 100644 index 0000000000000000000000000000000000000000..67a46901dc89a453ddbd72cf8006a417f9097760 GIT binary patch literal 135355 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
    @GVI=78mTm?pJw;^-E|@&`a*Z@W2#uA( zmuk(>i&+d3>s0}x#JE@GmCpL1H7(!>dnA{qx~<1BqK3INQ!T+B=iCr$TY(?ZZz~h0 zJGngw=4Ro=+q%M7%ko+$fQ&StUHY8uV(3$@s(7n;j$ux% znIndGlZy27%9Xc=iFFfNEk1C1v-Jq!-p8Xh9lfY_S=#o$S^yxJ6R-sssc#E!KX9a1 zU7=Ea|8nciy;Ddv)cp{P30*)C;GYNJT|V=KNzTWp`kRQ?0n5v|bG^3cBjmKc$FWjbXZFHJ?HLpc+m=dX}8;gqeFp5C8J2VOHVW z!KLmDt^RpXecd|s=H;tFU9CvNaPrq*{(`pHn|OaJ!TLFqh0)Y&75)pbYD+&p1u@5# z1`!4w1lCJNlP^*zCk>sWWyTai3+t)bd-lyJW^0xxR45O57(S|M^gi^9ifWce3E$hE zd;Iy)U+-v$v$qdDmx{ED{zn(23sR%Yvi+f3Gr{c975%*Ii`E%h>K|Q?7#*(avPk3& zb{MTQNje${P>#`5XmJ)TMqYev`10Ahl=gbM_*AhmW9zS1u+}5LF7S3@JvO7w*Ur2R zdiP8G64FwRD*52^+x|@-r7BgQ`zC&s7Y>#n4#;ETevRZ3|5zFhNai!h-$KiRuu5sp zd#<-%3Oha`_gi~R;x)#=(BF33Id_(NB}dUF_{gnq#>J)NVH)RAk&fF%d)AJZ28fxh z@c1)2BquU`Sk4{}lqs8~YQAxqX&f7V_X`513d<(mfrsW3i5^67;qgP(ZqL8J19ZLD z>ahufy!A;HLpz-B_?7SKt#)!oX!`&BUO5x8hu5Gsm$>PpZq$RTH@}Y}%GXTOr`QQz z6Du@*>-(dM-%L$vYV`6$I$Lf$?Q^!JWY0ltG<_!HKO9FI5sL)sW^Xom*@O<8LE~i( z0nQn!!fTjuB0>xn*<}LXA`!OItp^1?c-sc7rjIkvpw7FFeqU=*Iv}exKpQ1IZI3NO zw|ew(9G`A;_AF(cdTfflcwx6CRPF+Z{z&QDl_^o#=KT-KyZBS_U6O#Fc(AJGUs z(k0VCh>In-7My|g>aWMkrv~O-G!{`@$cgB&w9iV29pc_2Fb(( zUT1-He?!tkwN7Y=Ikvr$@cOQ#*#)Z;l7@wYJxx7$AQ{)S4H^zZFAdt$U5}K2%1Wmd zu~g{M3z-p6d4pb?W$AOK2!1$c=_PF2 zq@^2T=I4(FkCa{n!%VLE2j2ora+XgMcAsj3Bs}ydM2QLPH>L@9@${3__ zJLqudbzo{+bwr?@QR_<{`C!Ws-Uhp0XcNcsY{f=25&!+}uSP(dm7-Yi%ApF9bfFI0 z(yrl}rsj}MIb?74Osy4QReHotG2bo+pL zT$_oU#na~jXRWIjMf-CT`1PlXHYT3EX+fL`@r(s$j#ELKg5oXPYJDce7A+ptReoz zK#qBTfc2+kR1S$8o@qj>sZ?vZ`|)H9=C82L3EFwY+tdSlBoeE??TTq3{`k5{f{W;( zqT1cLgav4LY(3$jSypP7C>3S6il&{d9cg-FkV$O%O=ngu~hg2YmaFaup$Kn_7%3fcwcZ++6BnNz`WJHU@`T}b^t%Geo?u!PN%hv`X- zw1_MN(R0qZ+9E$d{=IfKv6demz-Yx-llZ&&nVoCfghLCMhIb;27yW8Jf5jT)$Yb+- z_~*E{BU>t+W%8|nD7d1pb%a!xt?Oy!{N!K`RysMV#~#=iZ<_Ym$9>klwFCMpdVEHf>>C}*&obq1MEN7 zRSxlgbw%Jv1X*AWX9L93x0q|@Q~tHc)sJ*0BxwE)F5)=Jw!Kk z(=7+<`rsrdXHin{4wOBBTJCE0n9p!$xCW(NaDSze+#naUWPk7>nI zb}rdzjYBsiCWhgyxvzc_oph{tn8HSVjCQIvb#1Q;1P&*HFpehL8(U@pBj7S=NU!!kR|uJ0K-O??}7$*Oz?E3Rrovo0)0-otN2{a z-)K0rtU}2bHjBi1|G>~lJe0xxlS8}u%G{a8xEAhUHmkh0@`}^*&5&Gdf#ttzVM4I5 z^Ep?IlHN||M6jK#q*Eb2P`aK^RAG_c;xWMb0iVKqU*5I69t-6Rd)nT#PN*VgonrHj zKiHu725mwcyY3-oW&h}cHbUv`Xa&3*>Ph6D>>DXE{`h@nLSK3&X|!n?h&x9*iCdQN zBiF@fkPcO{OCISSyi0&G&QqYv$LdI}Yo^Qfxk$pWL=S5G>d|-Rx7A*9AdQ5;Tyll8 zEH(rf{1UYtUGH=4gbjk)Fc*@3aE_F6l~d!f(PlbWmG%*<-j4}n>KQ=5@l4OaVb<(n z@a08>iEISbp8HNxjadNtP2$y1-?CtBBdY`2Sk$0|+q}vyh>DV9bQ-plE!lG;R{|IV zkA054YQrCqBMooApWTl{sj#KI`r zWDjJ%ym>@MS`Opod8}#-oysZ=X#(eQYV0d^DTK@Z4}0$!6;;}GivpHd1hoJODk>SI z$S6TTiAoX>p~y%MN)nW$AfZ5l2$HjcqJ#nplq9*xQHvGFO_^X1L>$iEg z+I~afQq+04T(G0U{gaXXp!25>OpO&GD|~SIyAF8xLLB_+d(WI1xzHLlH8BR%c+}c}}PfXtUIdLkRT{0hN2i z-^hNh9s)sG8sjtLR}PaqrWx=IY!nI%^Mfy6jCNCSwoz}E5~p8Nr>cmq-haX6VYxA6 zF>P)cc&Yq6l+})AQY-4Te_2OLWq&|zgG*`hGsdw}I7O*t^H_F@E# zlb?L!hDaV#h`r01t6z}l_=%9hPIadwYPy7ri&f6|RnN<*w)VoHt;R#{Vf(ANM4A_a ziTtuSQx;7B=T*xixB;saR1IGDXBi|S13aG(Yh<3NpXpzR`|V&4keq}#%6`Xw)(XA8 zYXbKm5HxX1o_-5@ClC2*Nw|zuN`+9Zn{g9t99VI;?7EXJ?n#D)knH z&@}DY$eYA2??gM2pU37S+PN#Osx;(n@a z7}?_LfLU)B*S^h2y~f|@@rcMo-_3NDtCKhGUD5tiQje?;XrHb}*t6`=K8l$c8(RH6(gT>6VL7=I$n4{?}V-1R&7*PC7(p=j4q7u*3PXs0#_MP`;F45g9JcJ-7~t}E(%%Jt;;sDGX*MtYrW6jGu<@!row#18!Zl^0v0HOZ$u!UC<@0a+-1wx7 z=qbKqePh!f0^h@_?-z2pF&V{imR%i;T@#vS84JEvg9oz|wPl7ZtEk|9FSWk?ufxU`v0Qt&>$Tbd&4 zQz{svx3mVHq8t!yvyzhn-4b~8zQGZ&=4VZ*gh!q5-~N+EeECo$f7_I{n^;fyO!wAd5!kJ7L+fKBDee57p;B3njdY4uGwIqp z0SPFyQM1h9r`NnPv6h0a?>a-0mXKI&u6+PhvMxMY>B(nkb3OsgK%EMd;0{D}F5&XP z?FsNH^bV`Hqh&$%EpecCwf+w<&M7}H9b*6MP{ObsU}0E+`|Kh9DjIiVlbT#^R8Euf zlodBpZurdUpd>qSr)%Qqn+Hx0)_9s3NnUE*uYrblM1`;O`BF|su;k%!Y0pOMNDX(| zhR$L-p)#o9B_pQb5&Xsi8yY&un4?rCVCt2qU0FA7td3o~H&aC$QTJnq?YpGoyXH(H z6jM@=&2y(i^nxy_^N*{Ax%u~by9pBiNpm{mL8|fhZ+g-C`FbS<=}z^nhp4^^`EConfI)mPueTf3H6A4iH=f$Rn+@$$pCF}9}1?(DIXwApxM?(c-?e{Be z!M=Ow8oNHn%ez0_vEJ)Zq%Hrhqm%azhvFHnm*gKRt2Gm>`^~&E;0%3io)JUeu>7D| z?bUI$_;eX#)yM*?y%LuKnz+0IrFQ2{SDVj06Xk+DtCZQO>LrW>{VO^RZC1IJ@xf_K zNpK1^(#;? zxc(M5A~zTimGkQdBOC`LE3QxKTPMd@JlX;3m`Lz}!{uI_36wI77nkptAT5a>h*oBn z$WXXcI8C;Hzk(2K*u581eb@rBqn?m@(aj%Te&drl`PX2pp+GSr0|e_g$w$TQ42A2Q zc*Y+x7X)k8(HX3{vvEn}3O=A?z+eVKqHW3xaD|<(kE(s>EV^|6glFFUnIOFlzghJ5<+ZWG3z&Ymo8JDkjdRXI&ED|^KNs-Gke<>bdcLCwG2%H8ben|r9 zsI7~S$R6w1=sHdqby!_|cbOC+Dp8)6d>-JM!0Rm$jB&r6@a4a0Nk$=@lyS`=T&z5g z3jc~vfE99lnlI~u4ddzKZy4KX>8t=mINOtYRvh$MPk$XM9l$j6A5oNcX<^{e6hV@( z+Re+?tK$q%fgwcmW)9EuRt@)cjwqY$$_9s7I>|&CP_KOSW-A%KDkQo{_^xX}S-Vtp zrQYA~g37xRBrd^71&Ug?CIhNCu=CFK^P{}JmWH&(&4X0^id!74DW2K2(?|1k*kqna zLyfOzpu~E)=@yvyCIkP!dows^U!;=7L_;7_-S!Mg+$AI2`YQx>M76gl44_>q@gF9B z#uT!v#uVU9f#$+hF$y@?Qaz2JYF|=ZeA4LtHN|cTSK8b5F>|E!eEkADhGF^zygmPI zsxFI+az!1Ixa}kmP_$ZcIBa)~;Rk&XB zfbId5w{MK{YEW=qd>{flX{kMua3ai^K%dukM$yfuATZ_n%a32AxZBF6HonEZPNK%D5V|dCFS@DN_3_b2lA}beM8nsg zGF+VDd2YT}Dp%tSxZecI2|KV?pj)gBnp3Z%oqPsZ)%TtD!@)c??Cp&~ER!{+TQ2ne zO{;WvrQh7LglKya3>O&2wdt~M?~dwR?7VM?*HQM#qamrYD`ln=6-OP8mv_z{pKXqJ zD(@01^jmMYG+nml(WoIRqQkr11Rg*Q|CqXnrMWXo{-!IiMjWruE_J0u#}cglU5 z?~8T1G43{9pf>};AXyd?_bvjkbxihapVE4fo96YlY_jFEfLEDt)(x7yz7?*vTv~83 zJA`p6ZRhJ3>oB?|H#uwUHKQ|V;z5(uv07(KnOpNZrDmRI)Qfc^kkHMaiYSg5JGn%! z?0rMX=iF{QZ81~Ld5qo~rQ^r^gh9}3lz#thLkz9l0E%!5=&r_)lg~dQuHD*kAMQ}J z%!(A&#j#BCQFI``AjKoD2`2T^yH6B?HUIqn#c34H#gw}1GQG)x{}!tuR8n=b^qXPS zzItUEERq_BYeSiYySlWM|1k|sgwp5M+Cxs&nmd3J2K(^P4;IC=W+W`|!iv8~LF+Vs zVD8OhSFZ}r5jYLA@>XW_&XP{p92bp@+8B!GEvfUFTHI2vnBn{9mz|w_h4wW# z)KIMRbMNz_m!N-h0bMT`V!4eX+kcOP^S0a_R(d9eP$!VEP1@7@x+VG-3 zWUmzwK!M~@Dfp&m3}dHAZxPd!SO*oX#L-lLU_nV}q9=3uT5Wz3Mm@?tJ|y z&>ppqe^T~lkfE%F92>_+ZS~`+;>!&WKRiQu{l!X-_!P4Mj6PTHR#q+&!IKmNN@RYW zySSpPc+B=KM}VZ`;-|u8$&@1pmnzfrGzdgR%~LL&w7n7_-q{3XXs9tJxXv#C=BY?aQ85o9=`(6JZ(l%J8FHViLz+UH)3zezWb?hu?)OyG-TErG(vzm36T!MS?i?=tR1`7wikLpxo1+@v8q|<;1u~X-wtRYBXPna+(KfMOCBI7mwio;~}e#si&t-w=1 z$1u7Jp9*h`PIV|eiFw>`l6zDYf+;eJyCwtVXwi`0Y5P|J_1N!bKbnm}fvu5yb$ise z)$wuKV`p+P6;!{@GGGY^(T>|F@}``}7&gmQl+jI&BG1xnY3Yo|tS0x@_a2aKvQeBw zvq?;ZE|c(Uzu8_x(7Ar-*c3=Yj6t)K6i)m)N~}7-`Q&4-b}e+^9?W; zkOau{Zk=z zg4w!TJPi`gw6mhIJdY#;7|;L3v<>j0Kr?XBafu30HA2bJeuvk`XiMfo7z1sXG!wLF z3(feJE+zkN2r}5bTyrLZzphZ{Wp9St4dVCjRr_AS9gD#I%>_u(dy}rXBA~2zyGC~l z2~*2!wl1!}{D?C#q6;zQ-&I3ns`*Y+RsWd7U4m^%Iht%d6>JioatR-(zDxOKhDFY5 zQb?5Is1}VAWmB(~QzPrwDRmY!x2_?(k#2vH*)l3Ud~e+UI7*ZDZLB7-5V7293TpdEeEMr3sfylci8}a<_vc zvLLcRo4rp4jIJ5*jJ)}5&)0(O)mc&)gF=e-YDSnRhwW~r)iIZ(V6^CO!=xoUY=B~% zwdn3>jXvcHkOp&4=d{j(GBp-x2&FFS1oM(r3DLpQd3rV@_LJC3g7vOZmHW&*PL-P( z7UDmjz+`&14sYOAIQb_aw8icWnSP%6M3p$Q<@WSc9V?~^SgQ(Y&F38xRV{4+N}Gio z@0GI|q%^??A_ZQf27XNfsw)nwJiZWR5>EeA2tf}1^+7X}&zj?Zi?H*a*e5N$<{Ph) zM5eY#*G_!qQkAZ18AAI3kc|>&@6r_pYOY8j@~NNO-BHiywYHz+nQF9b^#il%zox7_mS zyFhw%t@zHNWkyoJHLUwT#vx3Yy!i+(K}Vx?)o=T2$#73sw#Ed|O(l`g3ZF19Vd=@e z3b0iba9)=>(1>}ih9~noqbzn2&m}_-=*wm@vjaXQvUJk2 zh_G!OO!-QUkP>b!eCV)}g5$dfbR{>uO#Vajgq8W%2Omr(L-B2C@V$s<8)V%E*#bi- zXiY}#0j3Fq>gl)Mso8Bzcf2jqVam~dMtoOlt08XPN*fueTn^E92StV!6+<9|`pLlc z8{}Y5k2)zgqzBozriz}?f1c()&-4~5E*RYr(N%l{SCK*Y9F_kdZmSu4*E5zc@pW z<6qMzaGD;GNz;0iAc>cv1udff;bB(Qyng=nf}RJ&L1|}id}8rLTfLQWOq8;m0pv>J zz=>NiDHrb5Ar*pUEitD}?nsG1gd?{EGqju@=$RR#ig!Td`oJ?s&-Y*71_e2~KwwsO zu5@-5WexyB+5=yH^64?2m;A_bs&WVQs`b@kb2*uQgiOZ(#x$f(0Hv;j*w$hb-g_z} zkZ-!vrQhon-~_KkoowqYf;^Vm78J|XaJFXqfG1ctqRws0&)52AHX}b^)F=c(KNXn` zW9VOjkRTN?D2U8@k+(lz00UsTzj2r9Eh)4ll;w zi2G@nk^#zYed?Yc@}KGV*CcEXAd7sA?1pC*3@y7?NI$K0YLyKpbDusGLkih|B^Dk% zdp+I}cF}BaE-gbaqPV1fEM?fqQ`US|>U$HY!DZ?3XYhV=fJWAz5xwDBlD34B6-f}Rc!n{z^ zwMw!yC8-;lsL%ZSimLp9dX_UFERob~0FKkLW^8<9jPo4yam*#9*94d zTNz5{8Ki*N*8{1{4eSOOzYHxW#o2^!8X^VvD%d2r3C&BV|NNYL+ynj%RzPw(WFj7W zacPUriO1k0w-qeI4jX$1b>tvN7$yd%Renz_AObg<01(O(prj)hTzcf6(!r<%c6?DJ#) z>~F{q@|tKi0%GPei!6B%Kxb8fLsmkK1dnqXxZkdhjXpRjcaG=mCN2sR^}j(^N!@e& zA5a5~VLEIhG*Io!auH(OE9U;aO9!ITi5rkaq$mVa4pte4P&3l2a`@|?2Np*+xQ;qv zc`Uj8m#fXAbd>_#myyIy9Kug3teVfEZ9qBN>jTvc!?g=OYi$8FC^b>gL>>P5GN0$)7ZT-= z_eN*QA9o@KDi}&b<F2=Pvx5*DXZW^AUew9ve_k{eg#$#-gX7_;3uC*`ry!O{ z-+>dT?R$DLs&q`%@P$@}lMHVMeNs(1Xn5>?@BW0F-HMm7v<0|T!t2oA?C^h1&L>-_ zx~(Z1kJ%LaRLEjFtaG+{9{r$yMvX;KV@sDrt~g@$bXked*wv5(;5Q7?f^Z0y0k_1r zt1AD@W8??6d=w%vc@Gr+mlll_RM;!d&0?Jy`~<`bZx&AEhn9jG#j$usDr||*L+=M$KVP?bL>ZsJy;hZ|%>;^3hhTESrL9*rV^Vm40pBGfd35V+x`1D z-}1yjcgGssu;8U?x%V2vmfVe`PS{U0#F*O_OSJ5qxd>b@NA+*~`v%t-V0rQDERNYF7^DfL8aX z$Sjb4O{a3Y%$ooQkwLJqdCdTnW!jLi4z}Nqukxe*z5O;*JzJ&5x2fl-Cvcc!8OQ0o zp)j(1s1P1yLlZ9Gssz4iKb~Lzm=6PS7A`Q{o&TRSWbZQaC>WP;i>E*NHo#5F=BWa> zLTdXEwkDVcm5|=m$VB3dPH2~~%-at&#ImUOyHKy-A~YBK=yU%2RiGJQxF%aSb-p4D zXE2h~B}E*-l}J7F|Fs=T3#Q~&Z_^j`6iMp4LwaZbeKLg|2!z9Z1PR+bAKig<`l{mw zBlVH!@*F03i1-?&if14MP0P_pf*s?HjHxaIOg$&P|G6lc0EYpgnAGO>Vlm7umB=C! zDk>}$Jr3$byzieV>_Y$>`1{E&0ZZ=CsC<4T{r~&Z9Mk|nv^|oyDydAD&`0u^y`YEh z<|6DOhX-u=Fm69i4j+RZ%&{ro_}??=5pTc?bx>0-Uu2-iag3)g>dTWN@CjRTAE^o- z;S=x@HTghA{O?KOOMysRq`?i1n}Dy&DaBgk6HAe5AxsCEY8sWV1nNKVLLA=b4SWHy z<9y10mm{ppKsRJX_Ih@JfFvXVAjxEiqu8z`J#4x;bYw@j@ku+caoX=dmH5#Z%G zp36a1RV#am|9=NlhaW1`>;6()1U?_zsXUc-*SFFm?0G#-*b z?WIh>EGgQ;DF3A7y*RfGNLez`8Ju}rr zWSqAA9d0Q~A=`?5b*|pOe-HV!u{Qz8Cb{lUV$hR;sd(KO8XB5mC!LrR)ce0_71wvYssw;RhW;|1^)ghN5G3v zJ)5)&Vc#R-)K1o0s!1-mh4kfY-G9&Xu)X)S4`#LiK^9ysXAx7ny=R56-qjAQMZ^G) zc(J#=LGjuZ5uO9tg|M(T+0+9ju{QiTf&-NF@6)4K{y_SF9I*%DVbD^(ZdU7idlOK* z6oefL=Er9P6H&xq4a(kd}(j-<6{&&dMW1`SW_i~pm8vcSa?@jTNbJS&I92Uf>f%DsY3gpEGQp zgd99B(H+5KYczsS0Aj-E2yB$IfN4uW!t)wHgq)wS3ID^t|g-SeP3dI=_;J> zeP_gM>mWn!hA`O{nf6`Xe?$$3Knu2fsT?8K05$B5p&f)@j_Qocs7|iF+$)^o;1B$u z%?TWvJ#Pkk{RWii4Df};VU2ZR-?D`yFk*4ZR17@HFji?l#_x@5kwNBg1G5O3xvK}5 z$)!ORKLz-l(`65JAPurRrqdJ}02z+2Pn%a)VQ;Xw|9wWA z3ajE6R5NnKcBf(A;WOZg5o}cMlyag53gFd7R9FPs%$P=+%u7HHVP)QFFdvB&ybw4d zl-$o}kAj5s_?gF&!-Lxc2X2V| z`Jgc-Nqsv7tOQdKhDk>ETvreV2Sgy@ML9{Ri(xTIws)@~@ude?nx`C;91*$p@vGkn zo)-vv4{^0SI96?YG@F`+K5R4(Ct$f>8&oz+kf zV--PhS&}gj&EN*fj7K!IHaK_oCz3^hslMZ%dtc|@;$GR%|ABnkNI3egVO9tulf9PI zBuX5BQ5?N6jL0;UUz28Epp8LZ`F}f{S zdrJ)oL}toB&PxwpIfpg4!5zj^3m$@wbV_Lw&II`qM2Za_876d6aiU=t@l{|*v|Q}- z>1IzGCzq;{h~E9bIyj9(4!~2I$5cqcCMC7%8OBb8V97G*j!5&GWFx(Khukijs zPcR2J5@u&g5<5Dn5H<{4iLxmP8s=B0A#<8f)R_HcIDN6N$sdz#^%ab zFxnCG7UpT8=O*;!Hm8-68q^~MGEr_=Wv~xYV>&@Wa09#dDvA5(Da1y`k%2)h*R1Yt z)osQeo55MbpJ4sp1B2=WEy8bZ0x67Tr2fZ%^apy*+C* z*7_`noei&FkvlsIHd3FSgI#^@dx{@8fXL?UAZi{GgD2oahHnRsW`BVB;|kmVg|y;O zVlI*v>VI;r``PLQc54zP;=woZ=}r$=g$c4H918Sm0|~ZYt41PAk?5AYXgvKhp3!u0 zeJJZZl8GN2ZZ3-#Ik7>}Ao=lq%jn_IFjqpW?sF)23}Qq&Z^48}8>_vOrk=oGXi)Pm zwjbPZ%RSFViSXiz+a4UX<~5AZxO3BtN6%E!K>?dq{!W@BMwr4Jx-J=15EZt@LHST_ zPB(H#1I_hIjzMVqC*swy)&m?90`GN5mv%GmAabVi3zISm^?qQfmIk3`%DzKV4F+X& zC$9GwIk#9TTi2MIjg`L>YW50t{RCD{*M^z<{wx8`$bG-!Mt`sG8iul?0_vSc->a39 z^G!6R0G#L!Am3MNjLz=;`uJ<{*B^Hu&+l}KZHxA=z8|M=#ph6C?~c!Zc9iLi{=se@ zHZA{oN3}k+!{G<`AAh7?9+`v1S>mkjpM-!a>EIWz_$?)eySPRCeL~#%jJn4v`(<5C zeONgA4!_s#%2o;}Vb~O9t~-?xTky=Bs_&XeqPp&s@c)Z14QV;`LP<;TxtyW)3 zgXi+l$FXz;hJ7x|Nx)&W7toO)Q3qecec!6I=3CU97`=2dYag8z(CEzPGV`#(XntA; zs+%{V?fi%ci@n>*$7DUCSOhyyrT*APuRU8Wux|!-#J7}VZnoZLY2Z)=WNM#hY{RpV zXx8D_YL>e=I@K5xKngcpDtcEzro}E8%HrO_XyASB4?sOHvCLmgGl)St%EJhXTTYdI zY~Ssqkwfd~x7;7yJTB$>0O+=KPrPbUsn(`vl@A~&65@+}8zXwW$^rkexHjURC+ffO$p7l>W#e-5>v( zCF?%s#5Ugo&AuN!lWFT}OGLjSY-H9^SR5Ee*iqwdL~ zxuMiMZ!b0dg&Va%Y?hP!^|mVnsTyQSI+Pij=0~|?TO3=y`X@9@9*NW1JEo)LwW4MVCF!$(S@sg7Zv%Rcrlz)(KQlQkdKY73V?Lgmef zOGih=bjoCmU3%p_{K@y^+MVqSvNGwC$EMEs37T8?2EQ#)&%nR$7rV*ZA3p4Pl$9!Tw%=)y%b0Y$#COE+csAK^2j_&2Yn_UBzSJ8f z&&^5i3!i}Z6s#JQbeMEoD3PC_W6pGZ>wM{a;QGPVrwlOO_Zs;>PJ}i@d9l$@qPJPT zHE)6};lZ;-?-zF0-+x$6T;~b_(*2jVpAwbjcI=ee3GX`NXlOD(2F*q>2=GAc!Lu2h zz@svt5ONe`a44_1)!NBz&PKb&qFhC;ztHoG8cVw{&_YQbOkS^{I$xwFMfFo&1b6kQ z2Y5VS(Il8uf&CKvmr z>gC8g$gZgLoZQ{#N9*tb%fRr1*y^fO23%z?;w+RZ=~~yzebu1e=e)O8ddWfr%>`CN zs>_l!j%daPxlG1hJ;|T%@ChF_Vwz){(o<+QnRUX7o!hYVqLT5W?wlSSkvJ_oY zsmEU9-By&zik%gD(TaCPWMxLC$Vg>7&r9yaFpx%X(*@8q)5Uyw`P0+;>=s9RlU$tS z?s|!YtzeZ$2pm{z3Y17Xqxi=smvbh|93aAWVh`hXYu&6n&mHKFvkm01_ z5jDwr*ci{bR}$Za6nMX;;|caU5c~~n7>8bSh!gEwXgP1S7Ea_mj-1~>D*mH)F>*C5 zx7%naMCah>{o$_OA(|&TuW8{X-UfHPkbL@gdZF^oZ>`+JuDz$3vs)s#inifZh;?pg zTG^&j(Qr_WDdvT0$i+R-^w9%s>I#Qc2}SC{vTi0(QI77b*wL&5vehY_aoEGa!?Wa` zxLs|FKPbCkTAyNkir$sev{I*DQ(6JTiZ%ulv0hCw;B*P%me)H<7%x0UEJl&DFjjr%(_^9@B6(l}flE<4Y!^H#;#zIL-q1?VXbCE*eW) znes%O9foK5nT~l2%ZHa7YF0KVHpRy1%Q4K71q%ZG1#Yu-yBwiC zUjiwMHB0;R7t{>byBkMq&)n?PJ|Xpq3Trzf!2X6}<(K!9nEsZ6$#<*G z=VULBOowlFG2l9><2uV_&ASReE3-X7)lg%P`GylUd{)jt?*H(0H3^{+uQZkOtxLt02 zo=rQ#;OT{1KkapQ?iJ6yIF+<5cUsV%>Q|kH-ot(?-{HjDu60%T^X$GQ$rIg?L|x-# zJ)xP7#5lxl2NU=X5XrYMfwHBehwKy_2lf@;vVIpGDO%u{LK1@U@|LZ%@w4S_zAU`2 z`q0+kMTVPUAFDS!<0sB@8QUflzrs8%J;wVnCsW^O&i(PZcHzrs)Z{{Susq)iKH2=u z1yHQK8OJ3OSK_<0!4>nA()B2chDR9L9|kgl0=;-V+HBn4+jBJWi^rWIm4&su5c&eA z%xR70(*?3s8+|`HFgOa^8NaP|^p7o>9Bp zn{kdx7;A);ezr!&by~nr-{+zbw`Wl!pRiT^Db9KZnLidwp`T-m&ROONylp-ackEEa zmbQZij}l)S7SDR-YZuF}=fk6I+ErJhFEirAe4^c*7DTom1aHnfT_5l*uY)*%~upBKe{5k!g_&3U0~xKXOUNZ zIKk_lCzsXKLxW4(y<#~TUGf>IkeQ<{-9j~C7k;q>8#2!-nUgCf5%u0SFSo|{k7|;r zgOnYIHDA0AWmr%aiU$wrM&C!%*R`JUT{iu^okMjLf8PwqzBpC(pWF{3+-srA_NGcZTg_o5RbHExXzBHg^XS9MNi`$kJTMJ#ZUL9kS5?oU45LRwk5_dQoe{wQ4ix>$~UnuW=Hd`4TV;+7IfOJxV5N=|^!-%zHQ8 zA22wtu~?d@GmEdzn8vcl9u94kEeLk`R@z63NE5lzdaHz_QT0B$0~!aEUZgjwaZj#< zSM>TU_D2Wz5zr1v6y|wMX*NU?V;8Q70$Ir8tqQZz8FM*YyNrt1&2q7eI*qV2ClQhPalz7k^TH(X@|^B*t#{ zSavyjlB-`cY)8H#I1D1 z6%war>R6lPGs)#}#=4W5{fc;nZjQX1&7#Rlrx3=W=)%V-n#7ssn-|qqEmQZdYmT1!=)Z#5B*TQ6io8Jxt$O?KV7 zQs<>^#E<>7?bi^_O?qGhVJamS&c1D&@5gHR{N+8Rn=S{iHrD&3AP;RyLz9IsNLAPU!sSI`JGi zny=$uZ=mJzGZR<7EObkUFyXd5W8du8@-AHa<(3(llaNwJFU+Nasfs3RN8aZC)7EbcR2l0o?&mi)% z!mMkSA?d78jC`fWsOH;ACjL=1w#|aU+QbgULiq-=*|ZZ!N@*yteqX{JPxmACDPH?H z!r3|;YL8jQf6-w>%Cx>VnX{>bsh{bv6>Ae8YEUE7 zt~x%7MU<31X?AN0%iz{upOC05TXtB(&-E&#(Fff6ntG*JU}%j-n13N7ye>QH<1uQOxOOGTmV zuO@2SdS%0Cyknlx2-}wNj+3uQgFfJnAyo049tRGr&?gB473KSlrRIw+;O!sN&W2}P z(LPF**P@!<%p7Q@8pQJZFx0Z6Sg@cdtZepVI5MGPo${I41Cn#VQx| zvaWdyk5q4}a`pB~cqduZRMgaa?^dBE@z+ZCY2~+})oj<}o7Nu42TY#eVGaEq5ToAD z%o#89hOu~NMykjINJ>Mjrry&Dw%%Qj&?idd;`VbB++0yS?tyfz#)*y8lU*|%?rpOi zguXwY4{kxX1(U!B#8XV@Ev@$_UC8&9M6L=%lHa{X*J&7*3xWVa%6neJ=5x9yFD&m# zL6zCALDgnD@>vm#_Cz=tgSl0s(css(t@y~#-x?;;8igh$yg6++32uV8cWdV?Cwi4f zLU#7D;fL{wn<1?1w9is7Y`Mg9?VYC;56bLrebZCB-};2*4Kpdwu;cSdZ@f+>LTq9c zrTv7kzIA;LoF?d?hl0gkzU!7x5fhiTEMs0}=lDR>o~*M@b(<4oD&m)?LPwj*_fZ6@=!BJxLox| z!zjJ^#eVYYg^9g;lVGPnjg1d%q3G1~KCNa$cg{jJjZJmkuZffQsu0mMgm&9NR@X3o z!sN0LWAkxY%8rhZ$+J@6V1vzUj9ESH40M1bUi~>Jd*MUi#3#POcS1bRWT-N`^pF(|)6RKwJm!DH0g6aRy=l_23{~YkYhkA_q zE@D}-4+}gD0Gc1))^e}k^yEGPMoA!1fqpW^d8_`xln1l*7!&qNpjIjqP$v}IeHPtQ z4z-A;XyB5vokyKvj?^~sEewY>{*1$uRd^F%*H2i)CjqD*$^=m*-4R5n4Lts)#944< z5{EJYty+iP13d~f7BuRnht+>=e~ZF1%3+bWt0POX@Hn!~+>0sj36+Bo)0y?Dacz?N z`tTDr?!GQl3?Wkp@yB})eh{0$CLI1e2h_to+;7fT+Tq*6M+8?loa;lJx<;UeW3F{= zH5s@7h&vcz^ABPNGzh(fKK;Bvg*BQyxXX2LWZ$Kt<9mf!UifM`%XbPK7#fPy$d>G* ze)@`}2w~H=(uTqwYtG+bOGyJWg!h_I*2qXZz)qM@+-+gLmJA)d8oXN8Z45!)1V!O# zl1~uj%0DIH4;L1XVgjczeWn7^&db;NExDgN7eS+~&XaMC(quVF5y&PYd z{M#G<@GstUVM63RE!o4KgNeW=ET2~N&orO4IOYJH7Kx-Dgk=2t_m1nG_kh1AuYYbk z-b_V^Apy3p-wpgiYlb77O9%>V(6aL%?a|^Fq`zM>9MMCY;#Al=AwqEEMfrU{va|Z5 zK!l+DL=y(>TL9vL>mZbv4wZofBK>=b{w`L{rbDb!eK8mo&eaa^_i!GnaCMbC2c3A5 zf@rX3uYV8$q`k}tO2C8ADWW@q5xZ1d%VO0HMVIRcAL=EDe~v4rAYvv!FD62^SPqUT zjY#pQLWq)0m3vR?)@H#573Y&GL(;MIQSU!$=8(*|Cn>0*%4K0)ERG_9frY+hYdTt3sUiZZ>qE^jew>{rd zsT;C8E+b-T=$3TNWDv<)NuV<=Zt zTqzj$IA&t>I)4ZUl)#`s-lJstRT(}ZxuOhtlUqm;d0JYn0-mQc0Xxi!_3lK}AG7K| zL1m5fLD1m|xbSE9ylY49Z!aS`70z@Ipx?#LW(QuU3AOd7eraMuvdC%>!QoNn9Fp^wA- zBz@ut5sn61TXCVz6JN!c_uuKb988ZxmC0&!I^29awn4bcv^W0yZbJP#!I7 zs{y4ZSn{2-Lx_R*etk>ACrq6`Cp~Vq??*b_!rn%wgMkT26Qs|~7^p)JYc9S=w@(pV zVfeowcRbwK~~^t*SGw!AgOQ* z(XodfK9xyFLVSK+-(Ix4=LPM0Qea~O3yhnml4{1_u4|?~v>@x3%@y_G!rZ|eAuft6 zUU&`jX?&~ufjsH;Y_jr+`Rr7=k|;g_7U3~ZD&uO;!a*p)b%S9pfm!`E(mu-$@zvyh zozSL!^Kr`EQMmBkM;~tQUAP{(aMFt+9tukyxNx$`3lXqp(`6}Asn3TCODKrq8LyB0 zhiz}-^BXZQ{6r4bifhSWuF(Q>>cXOPkAP)P5qb*c;Jkexc_8VvMi*Hr_C zKoJHQ=y%vVqXb9FXQT5|p8Ie*NY7EV53(Fg*l$kNiIM@E(0G z< zkTN)sLfBzYqSX|T@m3%%Wbci)IBfCKoFDcpvxy<6uIAO5!YA~&jZiUD=67ADBj5R+ z6BVt7Kq%CNRPmoHhEUu6+?er9dV-j0tQ^rBdZ@5rczQ)Vt{7RF!m+RSO!lXf0=DON zH$Hq+X6uH_(s(Q$dG17yqi!mjH~0vbxe+`InZRkk29OP z1p>jl**AcTaO6iyNB`(qw>QjcW_zsxpxel_$6I8Q^WZc|^Cpu&bs8h1=q8143eC6>L_B9;>btZar*qi^#?bKiGE_?Uf|k`vBy&3B zG|=az0DK%X_ga|KsX+B%|9lok+!mSa2rr)gW(dCAyVyny2%jzyI+;%b@9?FmgzVAc zp8hsE9Ej$+52MrJc*Ec-kS?7)YP&;Rk-nZ|tUv=Z8h3y?`7AJ*zWUV}SccG4Ks^s> zdHnrko{6xA;d+#u7_Y;`$&}~13UI*FUxXni9W(uS`3&savHiP12_2e69))-Xg9Fis zC}LMj0~GQV5nx7P86U{vsQ+}MZXP%|68wa4XD=YX2Rp?t@%Kj&dt4NKg@!^)UnqD%g-n%!BkIP6Y^eFxB-uW^#bMw-F?Im-%fMYn{ZE zaAh_$#j(l*3PwNnID>y+m)o&_E{?FN;Sa8N*BA0OFRkp-bndp5V$bq&30;7aucTaTW<+vCrRIR&ZZBS$Dq!*9S$m8*-Ke| z!`}b>ji!B=ydDyleoXAD8v$V3o_Rt1o7nx=K6+Agd@ST}u!iE8_r!JS$R6@T2Aw}kk5hUvz~F{I$QMlV zs{$vgH$orm7i{3$qxT86vmj&hg~8H1FMWMko#yWTQN5U``EGHDQ(}FS^?9$r}s_s;D3~ zn1Go0+lP^|-kP@jub21i&MBd?)!`3v%T2#SBhOg5YMsY-<$=kKD9NAq;^* zbbSrA77n*9_bQFyu)(FTeX*efQfW^M$4672(*%4%jRozv%2%=b#g{?bg${zbp`i0g z4mmO#F2EZ8o$`g2E{q?ErH9-HlT1kJ-d!Anh%B24rWR zeBZ%=IgQNk{HhIILn^FKBTHT6yzQZDY2JcwAtJl#J`Z*$c8Nk}*P(+F_NDub`X-#N z$A7y5nQd>oei|hqhEV7bQP$oOk1%wB$5_%^D5aIi3h$oxMWOyxh}sF?6ZTAcZ^(Z--AE=QPh~+{GBpSaqq1?P~rq!GX{F@ZmUJ)H# z3W!)t=q^%3y2d|}RoM4KRU(ZVc+W9pu>2VM+Viu~yZ7Mg+^biBzq}XJM}?|rP98WM zk0d7DptMDdTFcka?7J?(2PF(IvD~Bx->I#poMY>jie~mB(|r8&Tu4J<{ng7B_O*IM;rvc3=PI#nnPWJ`7&X+xTj^CxDWH? z!YeQsR!)QY^46u^NgZH`hAMXg+)yz2eQ8QVjaaOA_J(=|Q=NS|eigm6- zx7yPgK$p1z9rh6POx!K0qMX1xQbP(k$c__u3&!Z1=Kmt^=?ztxMp$v(hzt_Eqg&_| z5Du(CqsNnHGy>2BD*~9cFQ}%*CY_?Z6V>K~-GA*tbx!M3xx_5kmGYq)?W!L}Ef?$-YLGL8&BU zEfpebq-2Ro*0N=(km5aW-{*avj`w)q_jrE)eUFZ>+wHoq>%7kMbAHax=OpzFZso)p< z=1BR5Sp9@XiD8tW!72;b!&SzxTA!(#z_qXFMb{cwt5XqPral6xm#}TJwBJL+P7l`? z-qI{+Kz6!<;|I_lMk>13he-AeFzm)PZGQoFy7|YielNC-Lo_(DNM=#(v3DgybmolVcWD+S7ln+T#Z8N%040*VrcJmbs)?^eL7wedm3R`hsq z6G@QT0)ZLdRPpMEEayXqMJ_~b;p@kzPaq~3<EJOFK4w4b>- zQXH`>f>Glhv(DzgnDS?jw$E?nGzdOp2w$5y>J%qus3CH#nY>~lJHYe-MR7F~c4@Yv zAJK%b*ab+fh*)9Y*o%(&WBzGK43Iz24k`KhssTr4Q266|1hHXgEzH80btU}nt+Wl)GF%{NFI}|tqRy0jh40WWx0Nk?hRv(E#pGAxgZD7Q-243Oc36sM z^@+a1w;frB9~Ymv_;LTA^_3%Q5wmo3csd=Ty2%k_PJIfC58J5`k!5qShcpQz%W_*j z7UIw!Dg5DxoWir<@Q1iX>%-)xM;DuS-a?X8x`I)-Qw2tzDr-w*Kee3`7e;;Yl+wN@ z>2T03a}Bj^ekwbWqlz_vkN09wN-PD#MuGhip1XJ6P1l^!Z{5j8>1n4$e#b8&8WHU2 zj?Y0a-~64jj1>3c_SmYo_fJXBgg0)UCOjjtd2LR9!$|O)XzhV9&vYYmz7{6Oom#R( zKocE$?jxnVov&{psV%F&9r%Av2vL0b+ttmXw1Y{9iMP__AV>1iDq`M>|LTw(qy4-9$0_&wD0a%)D?9-7{Er6SH`FEWT)E~t8pamv2lEV8 z4^x0u{O}|n=jd2tAY{WZ;{1qEM@xd??y1be4IlDU$dj|X!h6*OBc@(SU`Gb4yfUSOKw1{r95 z+nHkc_sNiLyMaX(BeHgE{;*SPe9T9YF1M{2J!lBT4T8b%1iaqqly}JMF=ZNTg>DKG zy0=t{!y@4I^3F!pGr{W}>}~i+hS#fGoKIKqqSXR4q7rz&7gT={ZQ82buqpgag&~mm zDsGiUH0AA}tyI<64kYo}=T9zvbtEMsQU#Zj3WQ5ZY)B2J2#T+r$mB%Q>+(m~6`o_k zb?j#jE;Wpl8C!0!PgQP_temQXmnzUhsK=R*0X@kEoo#v+7=iiG{SV&Bgw)d-hPze{ z!=TiYE9FwRY$uC*oG?7r_S-F70 z`u+lqfSq~rZhggN4r+zm{LP>Q``CbL0La8E3Ip@(CNk-Pez{$(lVz z+@OZM$!atPfK~N=fi7g^Fq~b&X2Emw{6J|QyAi0yn(=4VjIAw$1@b{;k{#wYQhumy zL94&lmi6Yn5N{|?z9x>wYYS$GN7Dnpoh@l*w!+2k6+K$MJNTB0TftUq+lps(oGu81 z#alzDNE-TiFJK7)cI)JUjlY!vy1(F0jc+NaJBSa9f{OGe-~fXQw~)$p(nV(%ug0pH ze+En-{rLdq^bT<^5DhB^w)y5Y?fn4-yV$)a>kKg~0U$}Cx3LLkS{1h9*4JkoFyg=C zuQi7YI@5lF?dKj>@u*^twDBOFF+7FBBu8G-d`U-B!1M2py+*^(C{zJTNc;8B1VJhz z+r^#u?Var*EbKCL0;lT_up6oqiEaF!6Z1D_9+Y+U!?BwGI{!BB-meFh^N&AYG@ZNb zd+P0va<{biyTgu(OIlV?IV1v?kB3OlXD5`Q7~|;}i5el@Q{;n>SaGi@bp4K&HGIYb zBE`fg<;PtL8TqGgWP<{TI0zmH`@|gytbu z-Dqf9%UJZ&x%PI5GOJY1FZ-?*WKTK)VEvU(#iAhpa z>icpRh8jj;cITC7@rb2h30|8C&FcO(bd}x^^h+s7g@wAa| zMc2P@Vno0OB(=>arId#2SBi7eT8H=)-#^ln2RLh+2$w1TO#!o}u6aXGH~Do3?Fjv| znwhx+mf9!+Y>^;U;r1|bp}L&wLXtRvA+&NvmTp$KZI1nkJNBCc~b3|)b*uT1AS zPwmApi6@N4mdF`QelgD%#_R*odYMp+XJWXsS|khUhYYAMaQD!3Z=cS5clTHq%RLX$ z>JW(QjdQj`1IxJ9%)}{rddD1oFM~!W@TmDnyjkay_m|PaQa~uz9C14Ap*Ua2W?X3g zASY{vr^n$#$(V&T9!3{m4U{Ez#PT@v5#l*?cnaA|yPsRw=VEcsTY#`7l}*-+-<%k{ zYg`!h1(*$N_VNBdk<5njGKO2usiGBF@5JtG73YhQID_Q+&~F33t`#8(ZpYgzx=NQY z{h*bm^L{z)`ESysO~a3lH0iXfnohb8ZJ!d=)xr1|GZYE6<$aR^-Cv^WMLr|-^j<*c zYO|Js{$;<9Tp;pS-&W0}J7yzBJYV zkvla4S&=msgT=4lRb>u?#4%i<11JYlq^z!C=mILQu(Z?=EEA0;jY9FXSeLFt8idEB zC!pIQCiESzv|Z5@=KfR{0mLUSl5UAz1Yf&C;;rw#rcLbtkEhGjdQ=n)T1laTyt+x$ zoFrtIA4PWgb>%?8PzBgj96NsauNRc!q&Ht*o^sl~%j0Flz9Z))et!FuV`LucPw&uV zQ9382V#kP1fhmaNOu|%Gqzf|9-Rfanecr|k6t&ytl)9WMy5w0{d|<#&&tU@k<0%I| zTe>fYl9vHZyR#8-0AD;JM?C@pf)c4#q{;_N<@VyQzx3qi|IhasE0w4dXC5jNN@a6j z)8RDpY>&kq^W=>^y0P+nQ&K<|Pl5Wx{QMB&{yuR@;nfZ!>4Dwj$H~#%h6flg@D<~K zO~ClO!Gta{G3j*W`w^&Wd(8xhZ*q4Nc`ynYOSMH+EEaDc+8y%(Q)X@E)TaSL^_+g) zt>&RK)k1#zH%Wc>e!__c&%Gq*8b_Zv z_UBNFaP#03oDjB_Qp85gEtoplaQK{?0VD-ZmoTDOjRj@Z&6Z;ud;(^r;jJ0tX7664 z<{^R%kAKYcr}cov?ILlSaG)~$3-q`-Vd#;@b|yZaLol<5(v5vU*+7bp(4*r2fTG>w8S;>{ix`<4(w7DVXAq!=hDkI9$vTahajHGc#pTnG)9#Z z8O1Ybn#rYaKm}LkT(1as0&VFwev=W+!REe)GD4vo6+1T+uN2Ik^Z6!B+mZUTo1&+` zL2{e+0}+z3I1#BVNV-4r3lhfm%fN5Mg7<9f|M;3rm9~@G0J;AT13BK>td6}@JR-Gr zbZti?6U{7QCpZ6d{5>@h_0R=c7(0WkcQoknPW48PgJI&`TfI1Ui9O<6zz&9F3O z2W5wWfH8~Is&a{@GS)fX^CzT*iH^J8dr$g$oz8h5{2jdN^|KXBo&~M_eNPjz>LK50 zcDT-)N-Omm)6$v}{GE+)TMbgZPD-6i3<*X)UAM4<712S^y-}vJyNyTEKdbTDc*y`R zS+rYM$}Ksh2gJO&O(}I^Vpo~?&G5NJb85Qwq5h~cbR$z@JO8&RoLRh&Ge`(7QOA>` zF1PY6wOAX88CboO&%M6?GWp{Cutl<@m3+V9YCtEX5Bnc&8@Mupj^~6?ecQW9JxUk9 z;6H*DRsF9#Kp%AFldsX`bk~u{(A2Ks(2IR|((QrWE$+ifM}pn7JK;ufTbUgc0QU|( zuld@k_Siq}J2Y_bfsJ6;r(M8UwQPU6F^w!AJ*U2Ekpl2g`vXmp8jefJuC%bdcc`Nz zLnG8K12m-w>9j@z*tov;R7JM^g&?mf6?@iDsNOo}qOGdjb#_HJM(OW2=rdmpGDv-{ z_}+;XzG1+|nWm^h)hVagzOwa|Z=6)i2Kig=EmBkE7{}Jm47mxTw$|%3+}mIvo1kh> zmVUScBe%v!8!B6GQDzKFfWZQ)qKAwO4e%rOEjSv+D<4NYj1V<5XO>HFBK?$E#!Nw}PB<|;=_7$gZcVR0Kl(emo@zZPB9=h`k<`N{GO%%N zSdyw08jo5evVRX~VBl=EV<|(NtwKdOdN;usZ2Szc_nh^>Q>1xz@Db^OWu;Rv`|~-{ z%nhfNmz*n3>z^Weq%AARlPShS`}pK@f|lBr)*^5frH(K5BK0M7odnV~$OTs5icSocox5nL!h>w`4qhIYmNY zG*!pTA0&{=KS89{v{q#<={pDtEjajf zwDHJ)9-R~D5vQ4XN-P3nNK$%%wG#E2IAPqd0(#FTRpFAV26@CtsdiizF6{YTN}U8C z=vBk2Ve+N=7|KoqUa`AHt|>sOYey#(U3X>A5^16xLo(EF0+#8w=$1@BoBLsE0X*h- zaeYr(f;UKh@Vc3S6QF*m7#QpX$O(YwQv6fd_Z<(rlAB5ktl z6BvzsU{yh^3=a=qayl?>)&@yrIfGTWNf$eC`ZuTV#Rv2@pJ{zZ*`zmPSTi>v9v9M` zCg82F7bH;4Le-i))OtRh48A-b{p7&8;(TU$j5rt_#rOl`iUe1fu}ipU@q!87rtZRX z-XPVXZ>MA9(QNc3&53@}hW}*KiwYbxG{<(J9O171nXzNA9bozTnUriO{A)yc>9(4a zx;oB+_~84uPj+>yqtUXz&^ZDii@npkbi|3@^tCjRlzT@kSCVg&ERKWS**)1X|zX9tTkr5FE0r=ACH=!~)Z zxf0NYW7B!{{7kUZ#>K!Bjo^V(xf+sflxqWhO-O<6{w zmA^6UV}vE>x!<;rHK!YLRP8Klcn!hs6*e=8ABw_0L9yX#q3D=_#%s;>0BQt9i-QV2 z`POf_fF-94vKc!@47pWh4S86n*^Vzfe@<1c1ze=ikTRA90^R}-y=?Cg*$+h&)R4LE z;`%N}Rz=1s1>P=g46JuSv6;F5Jn#Kd%Rx}_*(6yf#I0=n!?u6@-nv*)FOxxKy{I}A zN?3q0$&uXW!cWg+l=psB#O49bH;iPu<>+c-Sw~@lgJ3;3`t_vwqd(P{V_5Bcua_t6jOKGR?1&&SAh0y4%in=b)$ zY-UFVQ3<-yKN)* zUd@#o49M$cx)m(Qkz(fs+(w1c>l!fX%t>(I34h@9ySHCE8>e9i$qlAKGPbkX8f= zagAT&q~||-I^SQ!SbkWOCv+-gRyN5gMBzF=G`4?VclJMs^lGdmR=5FIV4 z@>0JjiLM;CclQck`5%{Ws+DvF40ZIzk&jrcIhg;XM-dxV@t(DjhuWr;&V(_e<%fkA z6mjoH&7B|K;mnxjwDOpWe)1q&|7VRzF=1%4Dki)8jMdRLuXwfd@Jqer%IBDv#H#|n zS1&qcb^tiWG-+E2Qo(*LUH`4+PEe1Q2hac{oyB?!4mHzS8`3l!`8gSKBc7oY*1lxghYb|^vSy-?5lFI zk~%tzfxTnn(Sf~9gLZ7NWr^w;SHfTmO_ee}x`KOsoi3dHN)StmAe$MDpV#Zyd0{z@ z6vUL?re}Xj8B0$X;IIRX9|uw+>^WC{TCf~9@DfaWov1@r zKRqyt2)=uPb7CZPDkFiS*oLm88jFG$==7?~ua@1A9aq1I;~^Qr()()>NDWus6!vLm8)J)+o?BRkv~j48TO zWiPAgi@El}rPC6T&3m03(x^-I9K7g+)Ui7cEAxjAFrv#iqOV{N)w9CK%J$6g@k&qP z*4}X@+B;NXq!Qs|aFaOQPnA6_np5AgXFnU{I%)jO{1yv;KwSj4Jo$x;&>(RIdE*#zXgo#w_iT(|UasS}Tg{w)fmbre z6O7Dt%2(#Nm2P{_L;PEZA6TSXp^e3Kx=JHZo9zzgsyhqJ@`6eKLJWf3m;6zd4*4p~Zk-Jm-D zh7FU;qj^9`e-dtZ`O{KqP`(8UT_>ly8%a?^9Qf#m5U9m>55#>ov&64{Lt3w<9(nAa z@F(My>67{#zn?w`+Y$Z3=!uzodMBVyUGN%N1Y13zFv~_s0Wo;_J=;TJdJlMvjaC2a zgPiE?JGl&JFCH?1cfPd>g3->*WdDy~2H^Oh(tXevp}~@*Nz$RzIMz9n!5XjpA`oq# z@`Xa%n+4z|PQG9R)K6@wgQQE`5gIpRc#5ln_Q&YCBt@$w>pEm+fR<;Nk3)^;+<4((cw^Kl$GVTw5WSFl7+wNp zM&b$lUAM9?Ix}wtwhm;GU{)u|%W)?Dq$lVBSxm10*)_n$4jP%oMpDl0$&17L#pBfs zk(`cAr%DsS)EaQ`N1A85-#}l4TsOVzBV&s^llW)P8&6FQTvnt&m0a_s2q)p)kCS_k zoX^79WF6ZCjAP|3&rE!XFjBdOMRRV|Wq+RpKy;ok^B;jdH{P26H9kr4YL~)xrJ*W* zo&$50pt&pVmaGTRSe<;!j1FD^R&Dtu0@4Du4WD5(L*CJj^uto5xG z1_U4eq63je<&VaFGJYo{B;o3&-{eJ$zsw!@)aNC;uElBD49cKqV!RPCswve3{El{<$PEFmGez1_=1d-g-_e-zBIp$Nj&veR?^_^mJJB~ z+@v&+aS7OO58~S8lim<87T`m}A0Rz{`B%7E0swCC^L0D^UH!cyix!(t`xvVYK32Y3V^XsWhlQ0^}cnW(;?}HR5*B z?ID=g2nBy(DGcPXAysRHyc0Y(B6Zi+d)h)^?qWV5o)lsPTR^VeCX@@9U)Y#mha209 zb52~Was|>PEF2Pl^4q6rW}UH9fWW zt`~y$9U9k%|JFrn!=-ubzdnU=i`LQNSD8o7uvy1-D4%d71U}dgl;1ZvcBx0x0R@>ZSRVV@~HukAY%d4+1&{X zvLhmK7qS7=a$!MsvkC7Lpnt#!eTB+E4Vl+KbQaW;$xxa7?~_ zN%8ccmExp64Ol`&ze`2AOJf8ycG|>h+<~|wcO8usYh8cvX?m3caLoILXpzzCW zUV@*Rs)D@Y+LLC5&!KeFn^!>FnF^F3OR(qLgR0Gq&kBUIg6hry$^c`Qs~MF0a9)6N zKZ@yro^21X6TMpbu9F|VTPbR(-$+D~6{q!_{1Y6=k(;=%c7E}G&ZdUJe&I2#&Nla~ z4xGmVNJqn+@hN!yfwUClOzk3%eOgvB8v-~(lKRol(F#`ct7KK- zHu}2TBW{zO8IC_^2Sp;f>8GcEX2xpVZHy&#C+ezT+S;@3CX zL(5k5jBYSRlU}J*g?( zQJ}Vor6TXWu_JRf1NIbPR>II1)(j;bnX)>!C#O4ADfI<^=uQL?`se{Lf^m+Itktyn zZgG-5a6I8~fTCBIoS;N!X*j0M`)xJnpLxIM%fq%MOk{K5N58gCW9&T5(=l5Jv5r~N z_Pzk9!7PD*92L6JW+NA6f9o^iv8D^klMnj8={kkFM*kY1_(7i{5_&7?ED}l|ccuf~tMI%+;x1W&8A!wfDC5h`PN%cTAc%)V94)&*K{(NV~7dv%KjMkQY5*vTN zd)%F~N0Msml{t_qJs3lD+ z(GwawQ#+iYUde8uB#~t!r4Ym9dy>^dp;@=an($dX=sZEI&(IU|E2C^jD(fRm^ z$^~T7!Ww#`9r6IGLQ=~P#v-O7MzVWzZ!-cQv#hAKI(rk%kA$qI`omvh8>6-xU|ygN zCJz>szarp}ya?{V)hGRwO_o!&*7#>fK~2s!Gv10)y4utxl)+>-tRmnXp3bQDI^^{# z^j`Fg1UsF|schHGAH$A!%#SFd42!P@gNRfVI9{cW>UOR~czjr1bI;UP+>dKD*s860 z|EaCFR=9#Mq}ifMB<*{?{fmQ2R>08=26UdG+EcR{`%obHJ5@XzB#2dE2rLfEyy7Et>SnSa>@cq?)+yf zIio{ijzBg4OF7)nYI7}{&rYjHeY*#Vm0^>+1Q9h5ybOanRB**>wJrUl&6`&oOM3a~ z-PdF7Y{#A-xcnt=6j*-ZvNw-yu5~*?X2(7B>G{>?G1lA=B4TVKy{(L?t%DZ&7m_8G&Yh#{BfJ1VZVHyZO!c9CnyIb zhDM_UKavO4&}h7+y|O`$>Xm{TmdT$7cJ4@!0oh7+aF;@*(mhN5=e{^KKhUCk~!1G z;{{BvNUa-tBN3y3;F73ED#R9`f@yw-5Y>&U`0~JImp*{+Z-4T(eASl4$|8*qHOIJrcx(!(hv7(I`~=K2CAG*L zaqEj|)Qz_vG#f$Vz3rKYU_wt?K&zBN#45DL3wkN7UlO5r(as|Z?$r0cAU#aT^%a22 zH^K4>{=Af{_rbm|MpuWEvu8KW?DdhTX--F79n!l7QFSauxBRfDq5Eqk$gYchM0XHT z7H~hN)@5F6+(MN@fqbE0Df6x*u&(#lk_4;eoC*D~$PZ zAm|;mA0*4fF??HH5PfD)MwUYLh$Bj?i1;(SQ0p~HH^>-@eGFRG58w@Zd9eq51#Ac{ z`n10@SK(_#TdR%Xa{Cy(?qO8sNIK8xz3oQ76T~aI3p;V--N_xHA(Yf^>iK1lUZ|%%^##~`l2ax{Ax&Nmb;8b)9O8YG~?OW1*&l% zu2_ey23Vs_Dwt>n^6mq8pVV=&bIg0HR(kKBIsrZp$ITSMp@1PQw(N9^Zo@>})!+GS zCcSM|SnD?eX0gXM{4>N!?1Z3*QduaBdp}u1>MFy}pnb6ao~d5v&BJ>5JdYAdV(rW3 z?j*?Kr<{J>$~O=~R&L7guUFH;!8D2lny;ir)V7)JOlFXmpJsZ0lR903Ae^csMdK`O zad9h?rl@7V-!bDASR$gKxd`b<$3s#yM_b3jG64963KWrKa6Z&c09bh82~O>`FX#j` zL1)!jl_SU(%$VBbSyb}d891%uaTl_F*85V$5$1)CXTWc79>4gtD@$wc&-TDzw5J{b zbJYd2wGf9F=`4?uJPNrdvq2R>}7dwhEwbmr!_jqc zoeYZ0*q%U5LY(ci{xeY1besc%^QkhBb1SIJUQM5dWBNqRoAwlZelmu!_l zA{-9%vop#zJ5bvboA?va6EFgbJE6K(z$NDrivYsbvY=ntHSM^I~L zqdNs5i>`gP>;|-l=i`SSwzL)3UURkO$2cijax3yI9Gj;a0LfB)ga?vv1!H+GEWP`n zdXuisC<8hc-ixS}n2TsE$}SOklXl7wNy%z#cYz|!=8!63kywtqs*N;R3QCb$L6@Zv z;*9J~1_mE&kMx&2U~}OJV~tCGDGTy%<5TFajpcZC%KcYwSCpUfg5zY?!L`wBs#Qm; z`lyM7dymnYX?Y~4!r&CxyreoZ(oXc2wPKHB%TRm_Rw0Ja=(7=xRTF9G%e%Ub(H=cPM&>A4Z6WM}RdV2rWf2xHCZEksPp1w(a%J1yb{&ch3`Ib9>5=>O=nf zY&x1Bst@z=*3;i$V0cyv(?Vx3=~+{53j32T^4wxL$qGQ04`vn}eAJwv#4C0VfT2jAE+LiqX3E_ctQmhU0JAMPbQXq$U63LDq7lO-e6hV= z4>+U!_g`iN;SjTki{Xf*2(|C&poPrx2ykInQECxI325^1k*M6x$D87Ev$=C{95YjC}db@K;s%~Ko&zIQ`I<#`50`hJ)S8^ z68^5h+QQ!>@yv5{PtzWEaS9!UM&!Q3bn@I4UDSPS)SDGV?n962I zhH-p{Tzb>wyY6idwIXJRLSUMba33dkMeHI(K)n>{b$Ev^ih{J}(0`Q=Wc&^UH{|F^ zp$m%!A`m;P8P)=|xUE(X8&D2grq`D*h9M^oAwPk4#c1+Lg9I9;2}`I5e@%IyhPA@e zL}a#)GV+_2{@HPdG0z$V3%r?)z#*t01ht5^15blQM`nIY>|mn433$%{QaJIG|9`kr zo{&51u?W09t2{m6bdiSM^Nvqd6U{{A#PF{Iaeb--UEO6Z2I4#^wI=wFxx2md?Dh6| zKf&K=hwV&)QEF!=rj1zn1wUfR$lhMPZ$pZ%f^{kAp%K!X3zR@)Yq zpeTWBRR{d9j&xD*Ao#1vfU~TqtwQzMcsVEKrDXLme>j#{%*Mgd{wbk`!$?SEm6z5A zX$&!%Lo(`6Kt(Fg?_uW%d!tn zL<@G$M>YaDRzuy<(tobt@9z`>f~54CjP8Twq%6-yMn@nJaK~A9$x8?#MoBhcO`{dX zAI&M9$|8!j#70uG#Npf(t@c0P5Uk!TnmgJ>P6yujNu;?P!=q@-B#J1>vsrjn$m;4? zg(R0!eji+(>gI&}U%r?5kg@@!@uLOZ&vfvX@HV6ltLq;{iocA6W8FubcGHVx66m)f z&@7#>U@wsn_w@T4y~2YD+4WTff-X;kFP*p_NUWFK zmw`Z3n7agO^=*$82DKwaYk}ht+EfV~4jfR}DvG-`P__VJ&!%ue3&ID=2$zy?zby?M znxz$A&3MVWLE~2&#RqNgK(hUy`$sh3M*^&EvD|V(DQ8F%%#we$u{r}>2+0YgF)HHq+4*HkMmp{ZPh(4IVMGzDC_Hh(3DO*XV~}9y0-kz_!Hapu^&H? z^wjo~w-X`$AJBpI@7?&HsDX|GNI4QPPm7DQ14df6{9jd4t`2!Nb_2Is@_D{KF$eD@ zY4Ar~!xAHUZ^SR?F2$*`X1@k=6DQ_SEfdWY%XsYp8S8<4FnV}Y@YI3dN4eo|Hi*bk z)Wy*uDS+RBf1&(aC>u1@>UQiDqDw#-iMK||dW{lKXiIAnxncNXc;lKYTab3Bnyg!& z#M-0fZ>zlhxv|S~?)w_$`KaOp`wOZ#oEz`Onm+^2m?m)hD6AhP?UWrbJ*0y4z%@eJ zg>=+T!e&1^osNA4*en0ALgu7XY?A7_Q0OYsJW~BRt9XQ-y^>-r4%!BZjL;Y9(??^b z`Tdw;^|KXyZX+j~%@q3ppF~ zkksolii=H86sFlGYV52+A^-4xl+CP{BiF5@R_izTL8m1^2O`;v-D1pTXPr<6vI}m1 zQk-_$0-=Kc0-;DKMWnq{O=U#mJ!d~WIVDv36ebCq!J1@B$2xQY;c(VYOu=Xl3(UV7 z++qrQpn>pObuX$nMV&lkWEF((vcGTm%Zwm+4}Yu!AhGeq_KA+PJ4KF-HwtTSK>oKC zVCa$Gtd<^eh~&_W)ebnEl=M%z=8J_R#~XaSQ3P)fm8&)q{p*Ag$0MGq%vSbFK}^5q zA)Pq+yP%rJW`oZvxEiZe^icP*&F`n+iDz6BT4W41EvMuK8_w{Y4u-$8EAD_>Qiu-H zUum;y7|?}Ts@V6H&|kTw=Zb{^3;a-YAY7zGgl$w73Y=Cel!72;G%CtE0E9;hzvMNs zQ}<7kC%%8fx+IH?)*1YQ(tBx6-CzP$FOy>Ky~%nJhoA;gx%+Ck4l-?T3nX z_EF@f>7M#OPWF${5{`tfjxx1k)BCBv@4+UUev*lyrwBt2RiQaWI48(>tDwvCxJ^zv z=x*2}oqhl@U_L5?(UuV~4yWmIH6;xRg{O@F$`&}We=Cvq`8$yxF*aXBi6spfL-#^j zf58&h8co;4K5pIM)e7TGcRQaffe%Eh{0p3U)=*@u;v|<0RMK1QbYf-eT@52a>9lh1 z?Qm%Qt>QsR31B83yZZ^o|1iM*i4$p!QSbNWaooo0{+t_{x@iZ+Ry3)4q{af^<7m37 z(UJYlMx9vm{oo7}`apeEksR7AS_F+N9faeJy0Z!1bEJ_K=x52?(KR2 zxf;n2ahNvz=hI3u5I=_#{~><5KX6k#h!aUr(~+Ks>2y{Ez=9EWpXqf-v29qJ8{gK3 zV-loR_c1e~Nou^!F<(*u=V~7o2YVY%xT6wv&YOBonzg;FzWmDT**spX5UFsWs9wr0 zfshB3$7c6o=OQ|Vf?K{hhm;54f_r7he>DQ z(Pa|=L2^Q_gcCO_#vc3gJ!#MzUk-E1`^Y{CY0@LtYoHvS)m(t6oIXM! zm1K?{O=!)KNMqFa@Otbpblv2!7(mvy9f%D@yTf-)*Z+9&2nUn+yaKl$yYM3~sr&{4 z786=zH=MBTMaClrBdLL^&sAzpcOg$sm?KgN_IyaUeF#JR6I6BMK#L|yhy{=w!UcxY z;^8Uw3g`Nngdh1z<*5^}jP$&=!wDBnA|=l$vs9g{k!cNv?DsrBX)w9K{b&cy5RG6eGN6RB2qzl7yV=D-kX0fJos|8Ep)q=hHPZ9F z-s1tvCyOo8KEetc{Ykej9Qp+rX5n?SxlAjiMGK>xvO7fK0%0@E^#^rpBZmIvz+l!kRB)UPbS0u zSG=p>KM1Vn9vJH4m;V4L1j>psDyDPU%P*T;P{kSm&%48-m~XWp2alWSa(+&*KNd<* z$(dUb(k7z>w|Linn7^)P4~+XjsXBNW3On!d4y*$^QyRq2viIrVIsFKG47vv!S%FF{ zIH<@NUw;9exDhmYLk*>a1eL_PKcC9}ieYae)ZhkfLcm28h+eEPCiJFJ{#gyD-?kHk zH=}(8EQEN3m@B-&fe%5$#*=LvE2FnP7jDOqle@Dj4SnI12VTLan)OFO~%YvXFBHcDHXS^Lsfal^_ z!Z>v&BRj0aaPoK7NRthYBbNep!LI%TcU#q`79KuE5#*lvX8TtsgOEdwP$OE>(WFlat5MsteN1u+GFue5F@f)u0 zFblG4sx=UJ-8_oQ6!Al?r5k3vfJ;MU;c5<3wjYPE_yn=%gr`=)lH7c zN(rq2=!!JfNEpa4kvM~dxaO4EUS!zGYLvYD8rmApMJEHHLn^P-F+=m6r@|HifSs8> z3)2eVGG9c_8ImBoQ)S>GB(x9yl1}J)hn%{XxiM&*NPAAXS0a z%O&4@yE~lSCupM0*udpPjlT?IGT9!;{-dy~lKT-RGN?ZoS~~gs`PQcj&hCQ``eTj=*Y5bppd@3H8a$LMw`Eu`JSCkMYqpZr>5$<3M27$^f<08w zH)+fBgW}+Lj;f8-&aG#@zdvq#97!8t>kse$T_$nn%wTmC@XR%YdL8cOEI0XUZ0d{J`eU z3r8Z=>$^NSMkhW9#Y^XR{gtkkVWBmi>kkqs&YutmFfMs_a|z#?ugTK$=S3E8;u#l+ zH2m3e$xK){_eXw;@;DJ)Rv>da?7--_A| ze=r<9?7%uueIduN*0L8a9ya+)RS%V6+g)10&IyE$AeSMJ-bqVZsbkcgqwm|=W?8tT zg+p-|{KIx|+>?0d4|IVh7!fU!l!k3LbF*n5vSJ>>lmW`~C;y7^`EtkufA01W0B
    B*EQRjTbEL+idRQV9=N%hbD#_oNTh1~ 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 +discussions-to: TODO +status: Draft +type: Standards +layer: Core +created: 2023-05-12 +requires: TIP-20, TIP-21, TIP-22 and TIP-38 +replaces: TIP-19 +--- + +## Summary + +This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This cocnept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. + +This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. + +## Motivation + +In a distributed ledger network, every participant, a so-called node, needs to keep track of the current ledger state. Since `chrysalis-pt2`, the IOTA ledger state is based on the UTXO model, where every node keeps track of all the currently unspent outputs. + +Misusage by honest users or intentionally bad behavior by malicious actors can lead to growing database and snapshot sizes and increasing computational costs (database lookups, balance calculations). Due to these increasing hardware requirements, the entry barrier to participate in the network becomes unaffordable and less nodes would operate the network. + +Especially in a fee-less system like IOTA, this is a serious issue, since an attacker can create a lot of damage with low effort. Other DLTs do not yet face this problem, as such an attack would be much more expensive due to the high transaction fees. +However, in order to solve scalability issues more and more transactions need to be handled. Therefore, other DLT projects will also eventually run into the same dust limitations. This document proposes to introduce `storage deposit` to address this. + +## Requirements + +- The maximum possible ledger database size must be limited to a reasonable and manageable size. +- The `dust protection` must not depend on a global shared state of the ledger, so that transaction validation can happen in parallel. +- The `dust protection` should work for outputs with arbitrary data and size. +- The ledger database size should be fairly allocated to users based on the scarce resource, IOTA coins. + +## Detailed Design + +A transaction validation rule is introduced which is exactly the same as the one defined in TIP-19, but stated here again for self-containment. + +Blocks including payloads, even transaction payloads, are considered to be pruned by the nodes, but unspent transaction outputs must be kept until they are spent. Therefore the `dust protection` is based on the unspent outputs only. + +**Every output created by a transaction needs to have at least a minimum amount of IOTA coins deposited in the output itself, otherwise the output is syntactically invalid.** + +min_deposit_of_output = ⌊v_byte_cost · v_byte⌋ +v_byte = ∑(weight𝑖 · byte_size𝑖) + offset + +where: +- v_byte_cost: costs in IOTA coins per virtual byte +- weight𝑖: factor of field 𝑖 that takes computational and storage costs into account +- byte_size𝑖: size of field 𝑖 in bytes +- offset: additional v_bytes that are caused by additional data that has to be stored in the database but is not part of the output itself + +| :warning: `min_deposit_of_output` is rounded down | +| ------------------------------------------------- | + +TIP-18 and its replacement TIPs introduce new output types that contain mandatory and optional fields with variable length. Each of these fields result in different computational and storage costs, which will be considered by the positive `weight_i`. The size of the field itself is expressed with `byte_size_i`. `offset` is used to take the overhead of the specific output itself into account. + +The `v_byte_cost` is a protocol value, which has to be defined based on reasonable calculations and estimates. + +**In simple words, the more data you write to the global ledger database, the more IOTA you need to deposit in the output.** +This is not a fee, because the deposited coins can be reclaimed by consuming the output in a new transaction. + +### How does it affect other parts of the protocol? + +The `dust protection` only affects "value-transactions". Since blocks containing other payloads are not stored in the ledger state and are subject to pruning, they cannot cause permanent "dust" and do not need to be considered for `dust protection`. +However, all output types like e.g. smart contract requests are affected and must comply with the `min_deposit_of_output` criteria. Therefore, these requests could get quite expensive for the user, but the same mechanism introduced for [Microtransactions on Layer 1](#Microtransactions-on-Layer-1) can be utilized for smart contract requests as well. + +### Byte cost calculations + +To limit the maximum database size, the total IOTA supply needs to be divided by the target database size in bytes to get the worst case scenario regarding the byte costs. + +However, in this scenario no outputs hold more IOTA coins than required for the `dust protection`. This does not represent the real distribution of funds over the UTXOs. We could assume that these output amounts follow Zipf's law. Unfortunately, fitting a Zipf distribution to the current ledger state will not match the future distribution of the funds for several reasons: + +- There is already another `dust protection` in place, which distorts the distribution. +- With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. +- Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. + +Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsitiy percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. + +### Weights for different outputs + +Output types contain several mandatory and optional fields. Every field itself creates individual computational and storage requirements for the node, which is considered by having different weights for every field. + +##### Field types + +The following table describes different field types in an output: + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionWeightReasoning
    keyCreates a key lookup in the database.10.0Keys need to be stored in the LSM tree of the key-value database engine and need to be merged and leveled, which is computational-, memory- and read/write IO-wise a heavy task.
    dataPlain binary data on disk.1.0Data is stored as the value in the key-value database, and therefore only consumes disc space.
    + +TIPs that define new output types may define additional weights based on the storage and computational requirements that the affected fields induce for the node. However, the weights defined here should take precedence whenever possible and inform the newly defined weights. + +| :warning: Protocol parameters are not set yet | +| ---------------------------------------------- | + +Protocol parameters presented in this document are design parameters that will change in the future based on simulation results, benchmarking and security assumptions. The reader should not take these values as definitive. + +An example of such parameter for example is the `weight` assigned to different output field types. + +### Microtransactions + +#### Microtransactions on Layer 1 + +To enable microtransactions on Layer 1 and still satisfy the `min_deposit_of_output` requirement, a new mechanism called `conditional sending` is introduced with [TIP-38](../TIP-0038/tip-0038.md). + +![Microtransactions on Layer 1](assets/microtransactions_pt3_layer1.png) + +The preceding picture shows the process of the `conditional sending` mechanism. Alice uses the `Basic Output` ([TIP-41](../TIP-0041/tip-0041.md)) to send a microtransaction of 1 IOTA to Bob's `Address`. To fulfill the `min_deposit_of_output` requirement, the `Amount` is increased by `min_deposit_of_output` IOTA, which is 1 MIOTA in the above example. To prevent Bob from accessing these additional funds called the `storage deposit`, Alice adds the optional `Storage Deposit Return Unlock Condition` to the `Basic Output`. Now Bob can only consume the newly created output, if the unlocking transaction deposits the specified `Return Amount` IOTA coins, in this case 1 MIOTA, to the `Return Address` value defined by Alice. By consuming another UTXO and adding its amount to the received 1 IOTA, Bob takes care to create a valid output according to the dust protection rules. + +To prevent Bob from blocking access to the `storage deposit` forever, Alice specifies the additional `Expiration Unlock Condition` in the `Basic Output`. If Bob does not consume the output before the time window defined by Alice expires, Alice regains total control over the output. + +This means that there is no risk for Alice to lose the `storage deposit`, because either Bob needs to return the specified `Return Amount`, or the ownership of the created output switches back to Alice after the specified time-window has expired. + +This mechanism can also be used to transfer native tokens or on-chain requests to ISCP chains without losing control over the required `storage deposit`. + +#### Microtransactions on Layer 2 + +Another solution is to outsource microtransactions to Layer 2 applications like smart contracts. In Layer 2 there are no restrictions regarding the minimum balance of an output. + +![Microtransactions on Layer 2](assets/microtransactions_pt3_layer2.png) + +In this example, Alice sends funds to a smart contract chain on Layer 1 with an output that covers at least `min_deposit_of_output`. From this point on, Alice can send any number of off-chain requests to the smart contract chain, causing the smart contract to send microtransactions from Alice' on-chain account to Bob's on-chain account. Bob can now request his on-chain account balances to be withdrawn to his Layer 1 address. The last step can also be combined with the formerly introduced `conditional sending` mechanism, in case Bob wants to withdraw less than `min_deposit_of_output` IOTA coins or native assets. + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 54d3faa1563cd1a0e12da1544ec86309f353a8ff Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 16 May 2023 09:32:29 +0200 Subject: [PATCH 002/110] Replace TIP-19, add TIP-47 in Readme --- README.md | 1 + tips/TIP-0019/tip-0019.md | 1 + tips/TIP-0047/tip-0047.md | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b1da09f1d..fd4f081c3 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ more improvements. Browse the [list of TIPs](#list-of-tips) below with the _Star | 34 | [Wotsicide (Stardust update)](tips/TIP-0034/tip-0034.md) | Define migration from legacy W-OTS addresses to post-Chrysalis networks. Replaces TIP-17. | Standards | Core | Proposed | **Stardust** | | 35 | [Local Snapshot File Format (Stardust Update)](tips/TIP-0035/tip-0035.md) | File format to export/import ledger state. Replaces TIP-9. | Standards | Interface | Proposed | **Stardust** | | 37 | [Dynamic Proof-of-Work](https://github.com/iotaledger/tips/pull/81) | Dynamically adapt the PoW difficulty | Standards | Core | Draft | **Stardust** | +| 47 | [Storage Deposit Dust Protection (IOTA 2.0)](tips/TIP-0047/tip-0047.md) | Prevent bloating the ledger size with dust outputs | Standards | Core | Draft | **IOTA 2.0** | ## Need help? diff --git a/tips/TIP-0019/tip-0019.md b/tips/TIP-0019/tip-0019.md index a63145875..91dfb1058 100644 --- a/tips/TIP-0019/tip-0019.md +++ b/tips/TIP-0019/tip-0019.md @@ -10,6 +10,7 @@ layer: Core created: 2021-11-04 requires: TIP-18, TIP-20, TIP-21 and TIP-22 replaces: TIP-15 +superseded-by: TIP-47 --- ## Summary diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index 70410a6f6..db76ef3f2 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -1,6 +1,6 @@ --- tip: 47 -title: Dust Protection Based on Byte Costs (Storage Deposit) +title: Storage Deposit Dust Protection (IOTA 2.0) description: Prevent bloating the ledger size with dust outputs author: Max Hase (@muXxer) discussions-to: TODO From 877c20dab3cda0563677cdcd8692dfdda4308582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Tue, 16 May 2023 10:58:19 +0200 Subject: [PATCH 003/110] Block and Validation block schema --- tips/TIP-0046/tip-0046.md | 463 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 463 insertions(+) create mode 100644 tips/TIP-0046/tip-0046.md diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md new file mode 100644 index 000000000..7a0d08be7 --- /dev/null +++ b/tips/TIP-0046/tip-0046.md @@ -0,0 +1,463 @@ +--- +tip: 46 +title: Tangle Block for Iota 2.0 +description: Updates to the Tangle Block for Iota 2.0 and introduction af an additional block type +author: TODO +discussions-to: TODO +status: TODO +type: TODO +layer: Core +replaces: 24 +created: +--- + +# Abstract + +The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction layer on top of legacy IOTA version transactions where the vertices are generalized *blocks*, which then contain the transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 version of the protocol. We change the calculation of the `Block ID`. Additionally, to the old `Block` we introduce `Validation Block` which is a special type of block that is used by validators. + +The `Block` can contain payload. These are core payloads that will be processed by all nodes as part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. + +`Validation Block` have additional functionality, and different fields, validation rules, and allowed payloads. + +# Motivation + +To better understand this layered design, consider the Internet Protocol (IP), for example: There is an Ethernet frame that contains an IP payload. This in turn contains a TCP packet that encapsulates an HTTP payload. Each layer has a certain responsibility and once this responsibility is completed, we move on to the next layer. + +The same is true with how blocks are parsed. The outer layer of the block enables the mapping of the block to a vertex in the Tangle and allows us to perform some basic validation. The next layer may be a transaction that mutates the ledger state, and one layer further may provide some extra functionality on the transactions to be used by applications. + +By making it possible to add and exchange payloads, an architecture is being created that can easily be extended to accommodate future needs. + +# Block ID +Block ID denotes an identifier of a block, with type `ArrayBytes[40]`. It is created from three separately spelled out fields due to committments proofs requirements to keep attestation proofs lightweight. It is calculated as the following steps, using [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: + +* `content` is the serialized block **without** signature and nonce. +* `slot_index` is the slot index of the `Issuing Time` of the block. + **Note**: It's **not** the same slot index as in the Slot Commitment. +* `signatureBytes` is the serialized signature. + +Calculation: +1. `content_hash` = hash(`content`) +2. `id` = hash(Concat(`content_hash`, signatureBytes)) +3. And finally, `BlockID` = Concat(`id`, `slot_index`) + +The string format of Block ID is hexadecimal encoding of Block ID with `0x` prefix. + +# Block Specification + +_Block_ uses the introduces [Block ID](#block-id) as its identifier. + +### Serialized Layout + +The following table describes the serialization of a _Block_ following the notation from [TIP-21](../TIP-0021/tip-0021.md): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    Typeuint8This field denotes the type of the block, used to decide which rules apply to the block. +
    Network IDuint64Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.
    Strong Parents Countuint8The number of blocks that are strongly directly approved.
    Strong Parents anyOf +
    + Parent +
    + References another directly approved block. +
    + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the strong parent.
    +
    +
    Weak Parents Countuint8The number of blocks that are weakly directly approved.
    Weak Parents anyOf +
    + Parent +
    + References another directly approved block. +
    + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the parent.
    +
    +
    Shallow Like Parents Countuint8The number of blocks that are directly referenced to adjust opinion.
    Shallow Like Parents anyOf +
    + Parent + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the parent.
    +
    +
    Account IDByteArray[32]The account identifier
    Issuing Timeuint64The time the block is issued. It's a Unix-like timestamp in nanosecond.
    Credits Burneduint64The amount of Block Issuance Credits burned by the Congestion Control for a block issuance from indicated`Account ID` block.
    Slot Commitment +
    + Slot Commitment +
    + Slot Commitment is an object that contains a summary of a slot. More descriptions are in Slot Commitment section. +
    +
    +
    Latest Finalized Slotuint64The slot index of latest finalized slot.
    Payload Lengthuint32The length of the following payload in bytes. A length of 0 means no payload will be attached.
    Payload optOneOf +
    + Tagged Data Payload +
    + With Payload Type 5, more details are described in Tagged Data Payload section. +
    +
    +
    + Transaction Payload +
    + With Payload Type 6, more details are described in Transaction section. +
    +
    +
    Signature oneOf +
    + Ed25519 Signature +
    + With Signature Type 0, more details are described in Signature section. +
    +
    +
    Nonceuint64The nonce which lets this block fulfill the PoW requirement.
    + +### Syntactic validation +TODO align + +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. +The following criteria defines whether the block passes the syntactic validation: + +- The total length of the serialized block must not exceed `Max Block Length`. +- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. + - It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. + - It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. + - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. +- `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: + - must be lexically ordered. + - must not have duplicates in each list. +- Each `Block ID` must be unique. +- Payload (if present): + - `Payload Type` must match one of the values described under [Payloads](#payloads). + - `Data Fields` must be correctly parsable in the context of the `Payload Type`. + - The payload itself must pass syntactic validation. +- `Nonce` must be valid with respect to the PoW condition described under [Payloads](#payloads). The PoW score itself is computed according to [TIP-12](../TIP-0012/tip-0012.md). +- There must be no trailing bytes after all block fields have been parsed. + + + +* Block size must not exceeds `MaxBlockSize` bytes, currently is `32768`. +* `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. +* It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. +* It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. +* It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. +* `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must be lexically ordered. +* `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must not have duplicates in each list. +* `Weak Parents` must be disjunct to the rest of the parents, no weak parent should be in either strong or shallow like parents. +* `Payload Type` must match one of the values described under Payloads. + Data Fields must be correctly parsable in the context of the `Payload Type`. + The payload itself must pass syntactic validation. +* `Signature` must be valid. +* There must be no trailing bytes after all block fields have been parsed. + +#### PoW validation + +The PoW that needs to be performed for each block protects the network against denial-of-service attacks where in a short time too many blocks are issued for the nodes to process. As the processing time of a block heavily depends on the contained payload, the PoW check can also depend on the `Payload Type` and is described under [Payloads](#payloads). +It is important to note, that the actual parsing and validating of a payload can be computationally expensive. Thus, it is recommended to first parse the block with all its fields including `Payload Type` (but not parsing or validating the actual payload `Data Fields`). Now, simple syntactic validation steps – including PoW validation – can be performed and invalid blocks already filtered out before the payload is validated. With this approach, payload-based PoW validation is not significantly more expensive than payload-agnostic validation. + +### Payloads + +While blocks without a payload, i.e. `Payload Length` set to zero, are valid, such blocks do not contain any information. As such, blocks usually contain a payload. The detailed specification of each payload type is out of scope of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: + +| Payload Name | Type Value | TIP | PoW Condition | +|--------------|------------|-----------------------------------|--------------------------------| +| No Payload | - | - | PoW score ≥ `Min PoW Score` | +| Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | PoW score ≥ `Min PoW Score` | +| Transaction | 6 | [TIP-20](../TIP-0020/tip-0020.md) | PoW score ≥ `Min PoW Score` | + +### Example +TODO update example + +Below is the full serialization of a valid block with a _Tagged Data Payload_. The tag is the "IOTA" ASCII string and the data is the "hello world" ASCII string. Bytes are expressed as hexadecimal numbers. + +- Protocol Version (1-byte): `02` (2) +- Parents Count (1-byte): `02` (2) +- Parents (64-byte): + - `210fc7bb818639ac48a4c6afa2f1581a8b9525e20fda68927f2b2ff836f73578` + - `db0fa54c29f7fd928d92ca43f193dee47f591549f597a811c8fa67ab031ebd9c` +- Payload Length (4-byte): `18000000` (24) +- Payload (24-byte): + - Payload Type (4-byte): `05000000` (5) + - Tag (5-byte): + - Length (1-byte): `04` (4) + - Tag (4-byte): `494f5441` ("IOTA") + - Data (15-byte): + - Length (4-byte): `0b000000` (11) + - Data (11-byte): `68656c6c6f20776f726c64` ("hello world") +- Nonce (8-byte): `ce6d000000000000` (28110) + +# Validation Block Specification + + +Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and allows to be issued free of mana requirements withing allowed validator throughput. It is allowed to reference more parent blocks than normal _Block_. +_Validation Block_ uses the introduces [Block ID](#block-id) as its identifier. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    Typeuint8This field denotes the type of the block, used to decide which rules apply to the block. +
    Network IDuint64Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.
    Strong Parents Countuint8The number of blocks that are strongly directly approved.
    Strong Parents anyOf +
    + Parent +
    + References another directly approved block. +
    + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the strong parent.
    +
    +
    Weak Parents Countuint8The number of blocks that are weakly directly approved.
    Weak Parents anyOf +
    + Parent +
    + References another directly approved block. +
    + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the parent.
    +
    +
    Shallow Like Parents Countuint8The number of blocks that are directly referenced to adjust opinion.
    Shallow Like Parents anyOf +
    + Parent + + + + + + + + + + + +
    NameTypeDescription
    Block IDByteArray[40]The Block ID of the parent.
    +
    +
    Issuer IDByteArray[32]The issuer identifier
    Issuing Timeuint64The time the block is issued. It's a Unix-like timestamp in nanosecond.
    Slot Commitment +
    + Slot Commitment +
    + Slot Commitment is an object that contains a summary of a slot. More descriptions are in Slot Commitment section. +
    +
    +
    Latest Finalized Slotuint64The slot index of latest finalized slot.
    Payload Lengthuint32The length of the following payload in bytes. A length of 0 means no payload will be attached.
    Payload optOneOf +
    + None +
    +
    Signature oneOf +
    + Ed25519 Signature +
    + With Signature Type 0, more details are described in Signature section. +
    +
    +
    + + + +# Rationale and alternatives + +The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, having separate block type for validator related responsibilites is much cleaner, and allows for additional changes as allowing to select more parents, or having specific payload types or fields in the future. + + +# Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 7282c7828195382a89281acfe4d569b5ea188c7a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Sat, 27 May 2023 12:40:02 +0200 Subject: [PATCH 004/110] Add slot commitment and signature specs --- tips/TIP-0046/tip-0046.md | 230 ++++++++++++++++++++++++++++---------- 1 file changed, 171 insertions(+), 59 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7a0d08be7..616c80fd0 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -1,23 +1,37 @@ --- tip: 46 -title: Tangle Block for Iota 2.0 -description: Updates to the Tangle Block for Iota 2.0 and introduction af an additional block type +title: Tangle Block for IOTA 2.0 +description: The Block for IOTA 2.0 and validation block type author: TODO discussions-to: TODO -status: TODO -type: TODO +status: Draft +type: Standards layer: Core replaces: 24 -created: +created: 2023-05-16 --- -# Abstract +# Table of Contents -The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction layer on top of legacy IOTA version transactions where the vertices are generalized *blocks*, which then contain the transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 version of the protocol. We change the calculation of the `Block ID`. Additionally, to the old `Block` we introduce `Validation Block` which is a special type of block that is used by validators. +1. [Summary](#summary) +2. [Motivation](#motivation) +3. [Building Blocks](#building-blocks) + - [Block ID](#block-id) + - [Slot Commitment](#slot-commitment) + - [Signature](#signature) +4. [Block Types](#block-types) + - [Block](#block) + - [Validation Block](#validation-block) +5. [Rationale and Alternatives](#rationale-and-alternatives) +5. [Copyright](#copyright) -The `Block` can contain payload. These are core payloads that will be processed by all nodes as part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. +# Summary -`Validation Block` have additional functionality, and different fields, validation rules, and allowed payloads. +The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction layer on top of legacy IOTA version transactions where the vertices are generalized *blocks*, which then contain the transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 version of the protocol. We change the calculation of the `Block ID`. Additionally, to updating the fields of the existing Block data structure, we introduce the _Validation Block_, which is a special type of block that is used by validators. + +The Block can contain a payload. These are core payloads that will be processed by all nodes as part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. + +Validation Blocks have additional functionality and different fields, validation rules, and allowed payloads. # Motivation @@ -27,24 +41,114 @@ The same is true with how blocks are parsed. The outer layer of the block enable By making it possible to add and exchange payloads, an architecture is being created that can easily be extended to accommodate future needs. -# Block ID -Block ID denotes an identifier of a block, with type `ArrayBytes[40]`. It is created from three separately spelled out fields due to committments proofs requirements to keep attestation proofs lightweight. It is calculated as the following steps, using [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: +# Building Blocks + +This section describes common building blocks used across multiple block types. + +## Block ID + +A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated as the following steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: * `content` is the serialized block **without** signature and nonce. * `slot_index` is the slot index of the `Issuing Time` of the block. - **Note**: It's **not** the same slot index as in the Slot Commitment. + **Note**: It is **not** the same slot index as in the Slot Commitment. * `signatureBytes` is the serialized signature. -Calculation: +### Calculation + 1. `content_hash` = hash(`content`) -2. `id` = hash(Concat(`content_hash`, signatureBytes)) -3. And finally, `BlockID` = Concat(`id`, `slot_index`) +2. `id` = hash(concat(`content_hash`, signatureBytes)) +3. `Block ID` = concat(`id`, `slot_index`) -The string format of Block ID is hexadecimal encoding of Block ID with `0x` prefix. +The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. -# Block Specification +## Slot Commitment -_Block_ uses the introduces [Block ID](#block-id) as its identifier. +A Slot Commitment contains a summary of a slot. The Slot Commitment is serialized as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    Indexuint64 + The slot index. +
    Prev IDByteArray[40]The slot identifier of the previous slot in the chain.
    Roots IDByteArray[32]The Merkle Tree Root of all commitment elements.
    Cumulative Weightuint64TODO: Description
    + +## Signature + +The _Ed25519 Signature_ is supported. It is serialized as follows: + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    Signature Typeuint8 + Set to value 0 to denote an Ed25519 Signature. +
    Public keyByteArray[32]The Ed25519 public key of the signature.
    SignatureByteArray[64]The Ed25519 signature signing the Blake2b-256 hash of the serialized Transaction Essence.
    + +The `Signature` field over the block is computed as follows: + +1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little endian. TODO: In code this is currently serialized as int64 but the block field is uint64 - inconsistent. +2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. The slot identifier is of type `ByteArray[40]`, computed as follows: + - Compute the Blake2b-256 hash over the serialized slot commitment. + - Return the slot identifier as the concatenation of the hash with the little-endian encoded slot index. +3. Compute the `contentHash` by computing the Blake2b-256 hash over the serialized block without the `Signature` and `Nonce` fields. +4. Generate the `signingInput` as the concatentation of `serializedTime`, `commitmentId` and `contentHash`. +5. Sign the `signingInput` with Ed25519 which returns a `ByteArray[64]`. + +**Semantic Validation** + +In order for the signature to be valid all of the following conditions must hold: + +- The `Public Key` must verify the `Signature`. +- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state in the latest committed slot. This reference slot may be different depending on when a block is processed, so the implication for a `Block Issuer Key` on an account is: + - it should only start to be used when the slot of the transaction in which it was added was committed to, + - and it should no longer be used when the transaction that removes it was published, however the block containing the transaction that removes the key can be signed by that same key. + +# Block Types + +## Block + +_Block_ uses the introduced [Block ID](#block-id) as its identifier. ### Serialized Layout @@ -59,8 +163,7 @@ The following table describes the serialization of a _Block_ following the notat Type uint8 - This field denotes the type of the block, used to decide which rules apply to the block. - + This field denotes the type of the block, used to decide which rules apply to the block. Set to value 0 to denote a Block. Network ID @@ -153,17 +256,17 @@ The following table describes the serialization of a _Block_ following the notat Account ID ByteArray[32] - The account identifier + The identifier of the account that issued this block. Issuing Time uint64 - The time the block is issued. It's a Unix-like timestamp in nanosecond. + The time at which the block was issued. It is a Unix timestamp in nanoseconds. - Credits Burned + Burned Credits uint64 - The amount of Block Issuance Credits burned by the Congestion Control for a block issuance from indicated`Account ID` block. + The amount of Block Issuance Credits the Account identified by Account ID is at most willing to burn for this block. The congestion control shall only burn credits for the block according to its size and the current RMC value which may be lower than the value of this field. Slot Commitment @@ -171,7 +274,7 @@ The following table describes the serialization of a _Block_ following the notat
    @@ -179,7 +282,7 @@ The following table describes the serialization of a _Block_ following the notat Latest Finalized Slot uint64 - The slot index of latest finalized slot. + The slot index of the latest finalized slot. Payload Length @@ -208,7 +311,7 @@ The following table describes the serialization of a _Block_ following the notat
    Ed25519 Signature
    - With Signature Type 0, more details are described in Signature section. + An Ed25519 Signature. More details in the Signature section.
    @@ -221,7 +324,6 @@ The following table describes the serialization of a _Block_ following the notat ### Syntactic validation -TODO align The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. The following criteria defines whether the block passes the syntactic validation: @@ -234,29 +336,20 @@ The following criteria defines whether the block passes the syntactic validation - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. +- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like parents. - Each `Block ID` must be unique. - Payload (if present): - `Payload Type` must match one of the values described under [Payloads](#payloads). - `Data Fields` must be correctly parsable in the context of the `Payload Type`. - The payload itself must pass syntactic validation. + - If the `Payload Type` is a `Transaction` and contains an `Account Unlock`, the slot index corresponding to the `Issuing Time` of the block must be equal to the slot of the transaction. + - TODO: Doesn't deal with Expiration UCs present in inputs, as that requires a much deeper inspection of the TX which may not be feasible since the inputs aren't included in full in the TX so those inputs would have to be loaded from storage? Options: (1) Get rid of Expiration UC, (2) always require block slot == tx slot, (3) be fine with loading inputs from storage during block validation. - `Nonce` must be valid with respect to the PoW condition described under [Payloads](#payloads). The PoW score itself is computed according to [TIP-12](../TIP-0012/tip-0012.md). - There must be no trailing bytes after all block fields have been parsed. +### Semantic Validation - -* Block size must not exceeds `MaxBlockSize` bytes, currently is `32768`. -* `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. -* It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. -* It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. -* It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. -* `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must be lexically ordered. -* `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must not have duplicates in each list. -* `Weak Parents` must be disjunct to the rest of the parents, no weak parent should be in either strong or shallow like parents. -* `Payload Type` must match one of the values described under Payloads. - Data Fields must be correctly parsable in the context of the `Payload Type`. - The payload itself must pass syntactic validation. -* `Signature` must be valid. -* There must be no trailing bytes after all block fields have been parsed. +- The `Signature` must pass semantic validation. #### PoW validation @@ -274,7 +367,8 @@ While blocks without a payload, i.e. `Payload Length` set to zero, are valid, su | Transaction | 6 | [TIP-20](../TIP-0020/tip-0020.md) | PoW score ≥ `Min PoW Score` | ### Example -TODO update example + +TODO: update example Below is the full serialization of a valid block with a _Tagged Data Payload_. The tag is the "IOTA" ASCII string and the data is the "hello world" ASCII string. Bytes are expressed as hexadecimal numbers. @@ -294,11 +388,11 @@ Below is the full serialization of a valid block with a _Tagged Data Payload_. T - Data (11-byte): `68656c6c6f20776f726c64` ("hello world") - Nonce (8-byte): `ce6d000000000000` (28110) -# Validation Block Specification +## Validation Block +A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. -Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and allows to be issued free of mana requirements withing allowed validator throughput. It is allowed to reference more parent blocks than normal _Block_. -_Validation Block_ uses the introduces [Block ID](#block-id) as its identifier. +## Serialized Layout @@ -309,8 +403,7 @@ _Validation Block_ uses the introduces [Block ID](#block-id) as its identifier. - + @@ -400,23 +493,23 @@ _Validation Block_ uses the introduces [Block ID](#block-id) as its identifier. - - + + - + - + - + @@ -424,7 +517,7 @@ _Validation Block_ uses the introduces [Block ID](#block-id) as its identifier. - + @@ -441,22 +534,41 @@ _Validation Block_ uses the introduces [Block ID](#block-id) as its identifier.
    Type uint8This field denotes the type of the block, used to decide which rules apply to the block. -This field denotes the type of the block, used to decide which rules apply to the block. Set to value 1 to denote a Validation Block.
    Network ID
    Issuer ID
    Account ID ByteArray[32]The issuer identifierThe identifier of the account that issued this block.
    Issuing Time uint64The time the block is issued. It's a Unix-like timestamp in nanosecond.The time at which the block was issued. It is a Unix timestamp in nanoseconds.
    Slot CommitmentSlot Commitment
    Slot Commitment
    - Slot Commitment is an object that contains a summary of a slot. More descriptions are in Slot Commitment section. + A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section.
    Latest Finalized Slot uint64The slot index of latest finalized slot.The slot index of the latest finalized slot.
    Payload Length
    Signature oneOf -
    +
    Ed25519 Signature
    - With Signature Type 0, more details are described in Signature section. + An Ed25519 Signature. More details in the Signature section.
    +### Syntactic validation +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. +The following criteria defines whether the block passes the syntactic validation: -# Rationale and alternatives +- The total length of the serialized block must not exceed `Max Block Length`. +- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. TODO: How many parents can a validation block reference? + - It must hold true that 1 ≤ `Strong Parents Count` ≤ XYZ. + - It must hold true that 0 ≤ `Weak Parents Count` ≤ XYZ. + - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ XYZ. +- `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: + - must be lexically ordered. + - must not have duplicates in each list. +- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like parents. +- Each `Block ID` must be unique. +- `Payload Length` must be 0 and the `Payload` must not be present. +- There must be no trailing bytes after all block fields have been parsed. + +### Semantic Validation -The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, having separate block type for validator related responsibilites is much cleaner, and allows for additional changes as allowing to select more parents, or having specific payload types or fields in the future. +- The `Signature` must pass semantic validation. + +# Rationale and alternatives +The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, having a separate block type for validator related responsibilites is much cleaner and allows for additional changes like allowing to reference more parents, or having specific payload types or fields in the future. # Copyright From 0254ebc5866f653fab72d1381c525ae306215d71 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 11:35:15 +0200 Subject: [PATCH 005/110] Add Cumulative Weight description --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 616c80fd0..7ed7a07f9 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -92,7 +92,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize Cumulative Weight uint64 - TODO: Description + The weight of the chain of the Index minus Maximum Committable Age slots in the past. This is required for attestations on whether to switch slot commitment chains. From b9093f0cae97405356272696b0ceefab94927cb4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:11:57 +0200 Subject: [PATCH 006/110] Remove PoW fields and validation --- tips/TIP-0046/tip-0046.md | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7ed7a07f9..b175d6f2f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -316,11 +316,6 @@ The following table describes the serialization of a _Block_ following the notat - - Nonce - uint64 - The nonce which lets this block fulfill the PoW requirement. - ### Syntactic validation @@ -344,27 +339,21 @@ The following criteria defines whether the block passes the syntactic validation - The payload itself must pass syntactic validation. - If the `Payload Type` is a `Transaction` and contains an `Account Unlock`, the slot index corresponding to the `Issuing Time` of the block must be equal to the slot of the transaction. - TODO: Doesn't deal with Expiration UCs present in inputs, as that requires a much deeper inspection of the TX which may not be feasible since the inputs aren't included in full in the TX so those inputs would have to be loaded from storage? Options: (1) Get rid of Expiration UC, (2) always require block slot == tx slot, (3) be fine with loading inputs from storage during block validation. -- `Nonce` must be valid with respect to the PoW condition described under [Payloads](#payloads). The PoW score itself is computed according to [TIP-12](../TIP-0012/tip-0012.md). - There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation - The `Signature` must pass semantic validation. -#### PoW validation - -The PoW that needs to be performed for each block protects the network against denial-of-service attacks where in a short time too many blocks are issued for the nodes to process. As the processing time of a block heavily depends on the contained payload, the PoW check can also depend on the `Payload Type` and is described under [Payloads](#payloads). -It is important to note, that the actual parsing and validating of a payload can be computationally expensive. Thus, it is recommended to first parse the block with all its fields including `Payload Type` (but not parsing or validating the actual payload `Data Fields`). Now, simple syntactic validation steps – including PoW validation – can be performed and invalid blocks already filtered out before the payload is validated. With this approach, payload-based PoW validation is not significantly more expensive than payload-agnostic validation. - ### Payloads While blocks without a payload, i.e. `Payload Length` set to zero, are valid, such blocks do not contain any information. As such, blocks usually contain a payload. The detailed specification of each payload type is out of scope of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: -| Payload Name | Type Value | TIP | PoW Condition | -|--------------|------------|-----------------------------------|--------------------------------| -| No Payload | - | - | PoW score ≥ `Min PoW Score` | -| Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | PoW score ≥ `Min PoW Score` | -| Transaction | 6 | [TIP-20](../TIP-0020/tip-0020.md) | PoW score ≥ `Min PoW Score` | +| Payload Name | Type Value | TIP | +|--------------|------------|-----------------------------------| +| No Payload | - | - | +| Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | +| Transaction | 6 | [TIP-20](../TIP-0020/tip-0020.md) | ### Example From 65e50a21f41bd08e802a4486ffe78f920b174e81 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:20:08 +0200 Subject: [PATCH 007/110] Update is public key allowed check state --- tips/TIP-0046/tip-0046.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b175d6f2f..5bf50d072 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -140,9 +140,7 @@ The `Signature` field over the block is computed as follows: In order for the signature to be valid all of the following conditions must hold: - The `Public Key` must verify the `Signature`. -- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state in the latest committed slot. This reference slot may be different depending on when a block is processed, so the implication for a `Block Issuer Key` on an account is: - - it should only start to be used when the slot of the transaction in which it was added was committed to, - - and it should no longer be used when the transaction that removes it was published, however the block containing the transaction that removes the key can be signed by that same key. +- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state at `MCA` slots in the past. # Block Types From 23e82c72364866ccf9a3b36f947a37cd6683a1bf Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:20:42 +0200 Subject: [PATCH 008/110] Remove block slot == tx slot check --- tips/TIP-0046/tip-0046.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 5bf50d072..da5edee2d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -335,8 +335,6 @@ The following criteria defines whether the block passes the syntactic validation - `Payload Type` must match one of the values described under [Payloads](#payloads). - `Data Fields` must be correctly parsable in the context of the `Payload Type`. - The payload itself must pass syntactic validation. - - If the `Payload Type` is a `Transaction` and contains an `Account Unlock`, the slot index corresponding to the `Issuing Time` of the block must be equal to the slot of the transaction. - - TODO: Doesn't deal with Expiration UCs present in inputs, as that requires a much deeper inspection of the TX which may not be feasible since the inputs aren't included in full in the TX so those inputs would have to be loaded from storage? Options: (1) Get rid of Expiration UC, (2) always require block slot == tx slot, (3) be fine with loading inputs from storage during block validation. - There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation From 91b6e1be553a62032e1e87e5d1cb9250bcff2154 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:35:57 +0200 Subject: [PATCH 009/110] Add `Burned Mana` rationale --- tips/TIP-0046/tip-0046.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index da5edee2d..849e46f48 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -262,7 +262,7 @@ The following table describes the serialization of a _Block_ following the notat The time at which the block was issued. It is a Unix timestamp in nanoseconds. - Burned Credits + Burned Mana uint64 The amount of Block Issuance Credits the Account identified by Account ID is at most willing to burn for this block. The congestion control shall only burn credits for the block according to its size and the current RMC value which may be lower than the value of this field. @@ -553,8 +553,14 @@ The following criteria defines whether the block passes the syntactic validation # Rationale and alternatives +**Validation Block** + The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, having a separate block type for validator related responsibilites is much cleaner and allows for additional changes like allowing to reference more parents, or having specific payload types or fields in the future. +**Burned Mana** + +The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account identified by the `Account ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana would be deducted from the account's Block Issuance Credit, but the account would not allot enough Mana in the containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking of the account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the account operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost for the issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the transaction will never result in the locking of the account. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From b86b308e42a0842c846c0d20b1b5fac890b82d1a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:37:05 +0200 Subject: [PATCH 010/110] Remove todo --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 849e46f48..0aa4ab23a 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -127,7 +127,7 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: The `Signature` field over the block is computed as follows: -1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little endian. TODO: In code this is currently serialized as int64 but the block field is uint64 - inconsistent. +1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little endian. 2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. The slot identifier is of type `ByteArray[40]`, computed as follows: - Compute the Blake2b-256 hash over the serialized slot commitment. - Return the slot identifier as the concatenation of the hash with the little-endian encoded slot index. From 766475a10b0959097b31d380bae73cc27175ea80 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 12:40:02 +0200 Subject: [PATCH 011/110] Update transaction type value --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 0aa4ab23a..198bdcdd0 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -349,7 +349,7 @@ While blocks without a payload, i.e. `Payload Length` set to zero, are valid, su |--------------|------------|-----------------------------------| | No Payload | - | - | | Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | -| Transaction | 6 | [TIP-20](../TIP-0020/tip-0020.md) | +| Transaction | 7 | [TIP-45](../TIP-0045/tip-0045.md) | ### Example From f61bad13cdb235abbfce6c20d7538a6eb2c94a6f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:11:07 +0200 Subject: [PATCH 012/110] Remove outdated example --- tips/TIP-0046/tip-0046.md | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 198bdcdd0..a9b9222bc 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -351,28 +351,6 @@ While blocks without a payload, i.e. `Payload Length` set to zero, are valid, su | Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | | Transaction | 7 | [TIP-45](../TIP-0045/tip-0045.md) | -### Example - -TODO: update example - -Below is the full serialization of a valid block with a _Tagged Data Payload_. The tag is the "IOTA" ASCII string and the data is the "hello world" ASCII string. Bytes are expressed as hexadecimal numbers. - -- Protocol Version (1-byte): `02` (2) -- Parents Count (1-byte): `02` (2) -- Parents (64-byte): - - `210fc7bb818639ac48a4c6afa2f1581a8b9525e20fda68927f2b2ff836f73578` - - `db0fa54c29f7fd928d92ca43f193dee47f591549f597a811c8fa67ab031ebd9c` -- Payload Length (4-byte): `18000000` (24) -- Payload (24-byte): - - Payload Type (4-byte): `05000000` (5) - - Tag (5-byte): - - Length (1-byte): `04` (4) - - Tag (4-byte): `494f5441` ("IOTA") - - Data (15-byte): - - Length (4-byte): `0b000000` (11) - - Data (11-byte): `68656c6c6f20776f726c64` ("hello world") -- Nonce (8-byte): `ce6d000000000000` (28110) - ## Validation Block A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. From 1e6d6f7c85e65c0930d71acdad7bedd1827912e4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:13:17 +0200 Subject: [PATCH 013/110] Add TODO for no of validation block parents --- tips/TIP-0046/tip-0046.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index a9b9222bc..325d1730b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -355,7 +355,7 @@ While blocks without a payload, i.e. `Payload Length` set to zero, are valid, su A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. -## Serialized Layout +### Serialized Layout @@ -513,10 +513,11 @@ The Tangle can only contain syntactically valid blocks. Invalid blocks must be r The following criteria defines whether the block passes the syntactic validation: - The total length of the serialized block must not exceed `Max Block Length`. -- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. TODO: How many parents can a validation block reference? - - It must hold true that 1 ≤ `Strong Parents Count` ≤ XYZ. - - It must hold true that 0 ≤ `Weak Parents Count` ≤ XYZ. - - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ XYZ. +- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. + - TODO: How many parents can a validation block reference? + - It must hold true that 1 ≤ `Strong Parents Count` ≤ TODO. + - It must hold true that 0 ≤ `Weak Parents Count` ≤ TODO. + - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ TODO. - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. From d7783ebd9d29899dbe8c074c8c84d040e78346a8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:18:26 +0200 Subject: [PATCH 014/110] Make is pubkey allowed check more precise --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 325d1730b..1bad1addf 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -140,7 +140,7 @@ The `Signature` field over the block is computed as follows: In order for the signature to be valid all of the following conditions must hold: - The `Public Key` must verify the `Signature`. -- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state at `MCA` slots in the past. +- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state at the slot index corresponding to the `Issuing Time` of the block minus `Maximum Committable Age` slots in the past. # Block Types From 18b564f7757dcf18130f9e3eac7f11372312b9e4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:36:33 +0200 Subject: [PATCH 015/110] Format markdown, wrap prose --- tips/TIP-0046/tip-0046.md | 106 ++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 34 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 1bad1addf..5992f7927 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -16,30 +16,42 @@ created: 2023-05-16 1. [Summary](#summary) 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) - - [Block ID](#block-id) - - [Slot Commitment](#slot-commitment) - - [Signature](#signature) + - [Block ID](#block-id) + - [Slot Commitment](#slot-commitment) + - [Signature](#signature) 4. [Block Types](#block-types) - - [Block](#block) - - [Validation Block](#validation-block) + - [Block](#block) + - [Validation Block](#validation-block) 5. [Rationale and Alternatives](#rationale-and-alternatives) -5. [Copyright](#copyright) +6. [Copyright](#copyright) # Summary -The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction layer on top of legacy IOTA version transactions where the vertices are generalized *blocks*, which then contain the transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 version of the protocol. We change the calculation of the `Block ID`. Additionally, to updating the fields of the existing Block data structure, we introduce the _Validation Block_, which is a special type of block that is used by validators. +The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction +layer on top of legacy IOTA version transactions where the vertices are generalized _blocks_, which then contain the +transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves +other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 +version of the protocol. We change the calculation of the `Block ID`. Additionally, to updating the fields of the +existing Block data structure, we introduce the _Validation Block_, which is a special type of block that is used by +validators. -The Block can contain a payload. These are core payloads that will be processed by all nodes as part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. +The Block can contain a payload. These are core payloads that will be processed by all nodes as part of the IOTA +protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. Validation Blocks have additional functionality and different fields, validation rules, and allowed payloads. # Motivation -To better understand this layered design, consider the Internet Protocol (IP), for example: There is an Ethernet frame that contains an IP payload. This in turn contains a TCP packet that encapsulates an HTTP payload. Each layer has a certain responsibility and once this responsibility is completed, we move on to the next layer. +To better understand this layered design, consider the Internet Protocol (IP), for example: There is an Ethernet frame +that contains an IP payload. This in turn contains a TCP packet that encapsulates an HTTP payload. Each layer has a +certain responsibility and once this responsibility is completed, we move on to the next layer. -The same is true with how blocks are parsed. The outer layer of the block enables the mapping of the block to a vertex in the Tangle and allows us to perform some basic validation. The next layer may be a transaction that mutates the ledger state, and one layer further may provide some extra functionality on the transactions to be used by applications. +The same is true with how blocks are parsed. The outer layer of the block enables the mapping of the block to a vertex +in the Tangle and allows us to perform some basic validation. The next layer may be a transaction that mutates the +ledger state, and one layer further may provide some extra functionality on the transactions to be used by applications. -By making it possible to add and exchange payloads, an architecture is being created that can easily be extended to accommodate future needs. +By making it possible to add and exchange payloads, an architecture is being created that can easily be extended to +accommodate future needs. # Building Blocks @@ -47,12 +59,14 @@ This section describes common building blocks used across multiple block types. ## Block ID -A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated as the following steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: +A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out +fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated as the following +steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: -* `content` is the serialized block **without** signature and nonce. -* `slot_index` is the slot index of the `Issuing Time` of the block. - **Note**: It is **not** the same slot index as in the Slot Commitment. -* `signatureBytes` is the serialized signature. +- `content` is the serialized block **without** signature and nonce. +- `slot_index` is the slot index of the `Issuing Time` of the block. **Note**: It is **not** the same slot index as in + the Slot Commitment. +- `signatureBytes` is the serialized signature. ### Calculation @@ -127,11 +141,14 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: The `Signature` field over the block is computed as follows: -1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little endian. -2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. The slot identifier is of type `ByteArray[40]`, computed as follows: - - Compute the Blake2b-256 hash over the serialized slot commitment. - - Return the slot identifier as the concatenation of the hash with the little-endian encoded slot index. -3. Compute the `contentHash` by computing the Blake2b-256 hash over the serialized block without the `Signature` and `Nonce` fields. +1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little + endian. +2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. The slot identifier is of type + `ByteArray[40]`, computed as follows: + - Compute the Blake2b-256 hash over the serialized slot commitment. + - Return the slot identifier as the concatenation of the hash with the little-endian encoded slot index. +3. Compute the `contentHash` by computing the Blake2b-256 hash over the serialized block without the `Signature` and + `Nonce` fields. 4. Generate the `signingInput` as the concatentation of `serializedTime`, `commitmentId` and `contentHash`. 5. Sign the `signingInput` with Ed25519 which returns a `ByteArray[64]`. @@ -140,7 +157,9 @@ The `Signature` field over the block is computed as follows: In order for the signature to be valid all of the following conditions must hold: - The `Public Key` must verify the `Signature`. -- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. This check is executed against the account state at the slot index corresponding to the `Issuing Time` of the block minus `Maximum Committable Age` slots in the past. +- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. + This check is executed against the account state at the slot index corresponding to the `Issuing Time` of the block + minus `Maximum Committable Age` slots in the past. # Block Types @@ -150,7 +169,8 @@ _Block_ uses the introduced [Block ID](#block-id) as its identifier. ### Serialized Layout -The following table describes the serialization of a _Block_ following the notation from [TIP-21](../TIP-0021/tip-0021.md): +The following table describes the serialization of a _Block_ following the notation from +[TIP-21](../TIP-0021/tip-0021.md):
    @@ -318,8 +338,8 @@ The following table describes the serialization of a _Block_ following the notat ### Syntactic validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. -The following criteria defines whether the block passes the syntactic validation: +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. The following +criteria defines whether the block passes the syntactic validation: - The total length of the serialized block must not exceed `Max Block Length`. - `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. @@ -329,7 +349,8 @@ The following criteria defines whether the block passes the syntactic validation - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. -- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like parents. +- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like + parents. - Each `Block ID` must be unique. - Payload (if present): - `Payload Type` must match one of the values described under [Payloads](#payloads). @@ -343,17 +364,23 @@ The following criteria defines whether the block passes the syntactic validation ### Payloads -While blocks without a payload, i.e. `Payload Length` set to zero, are valid, such blocks do not contain any information. As such, blocks usually contain a payload. The detailed specification of each payload type is out of scope of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: +While blocks without a payload, i.e. `Payload Length` set to zero, are valid, such blocks do not contain any +information. As such, blocks usually contain a payload. The detailed specification of each payload type is out of scope +of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their +specification: | Payload Name | Type Value | TIP | -|--------------|------------|-----------------------------------| +| ------------ | ---------- | --------------------------------- | | No Payload | - | - | | Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | | Transaction | 7 | [TIP-45](../TIP-0045/tip-0045.md) | ## Validation Block -A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. +A Validation Block is a special type of block used by validators to secure the network. It is recognised by the +Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the +constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. +_Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. ### Serialized Layout @@ -509,8 +536,8 @@ A Validation Block is a special type of block used by validators to secure the n ### Syntactic validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. -The following criteria defines whether the block passes the syntactic validation: +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. The following +criteria defines whether the block passes the syntactic validation: - The total length of the serialized block must not exceed `Max Block Length`. - `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. @@ -521,7 +548,8 @@ The following criteria defines whether the block passes the syntactic validation - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. -- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like parents. +- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like + parents. - Each `Block ID` must be unique. - `Payload Length` must be 0 and the `Payload` must not be present. - There must be no trailing bytes after all block fields have been parsed. @@ -534,11 +562,21 @@ The following criteria defines whether the block passes the syntactic validation **Validation Block** -The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, having a separate block type for validator related responsibilites is much cleaner and allows for additional changes like allowing to reference more parents, or having specific payload types or fields in the future. +The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, +having a separate block type for validator related responsibilites is much cleaner and allows for additional changes +like allowing to reference more parents, or having specific payload types or fields in the future. **Burned Mana** -The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account identified by the `Account ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana would be deducted from the account's Block Issuance Credit, but the account would not allot enough Mana in the containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking of the account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the account operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost for the issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the transaction will never result in the locking of the account. +The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account +identified by the `Account ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the +block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana +would be deducted from the account's Block Issuance Credit, but the account would not allot enough Mana in the +containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking +of the account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the +account operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost +for the issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the +transaction will never result in the locking of the account. # Copyright From 2b7488ff37b20829b51a109461a4f55a13793ed5 Mon Sep 17 00:00:00 2001 From: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:48:29 +0100 Subject: [PATCH 016/110] Update Mana terminology --- tips/TIP-0046/tip-0046.md | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 5992f7927..7f31722c4 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -13,17 +13,26 @@ created: 2023-05-16 # Table of Contents -1. [Summary](#summary) -2. [Motivation](#motivation) -3. [Building Blocks](#building-blocks) - - [Block ID](#block-id) - - [Slot Commitment](#slot-commitment) - - [Signature](#signature) -4. [Block Types](#block-types) - - [Block](#block) - - [Validation Block](#validation-block) -5. [Rationale and Alternatives](#rationale-and-alternatives) -6. [Copyright](#copyright) +- [Table of Contents](#table-of-contents) +- [Summary](#summary) +- [Motivation](#motivation) +- [Building Blocks](#building-blocks) + - [Block ID](#block-id) + - [Calculation](#calculation) + - [Slot Commitment](#slot-commitment) + - [Signature](#signature) +- [Block Types](#block-types) + - [Block](#block) + - [Serialized Layout](#serialized-layout) + - [Syntactic validation](#syntactic-validation) + - [Semantic Validation](#semantic-validation) + - [Payloads](#payloads) + - [Validation Block](#validation-block) + - [Serialized Layout](#serialized-layout-1) + - [Syntactic validation](#syntactic-validation-1) + - [Semantic Validation](#semantic-validation-1) +- [Rationale and alternatives](#rationale-and-alternatives) +- [Copyright](#copyright) # Summary @@ -284,7 +293,7 @@ The following table describes the serialization of a _Block_ following the notat - + @@ -378,7 +387,7 @@ specification: ## Validation Block A Validation Block is a special type of block used by validators to secure the network. It is recognised by the -Congestion Control of the IOTA 2.0 protocol and can be issued without burning block issuance credits within the +Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. @@ -571,7 +580,7 @@ like allowing to reference more parents, or having specific payload types or fie The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account identified by the `Account ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana -would be deducted from the account's Block Issuance Credit, but the account would not allot enough Mana in the +would be deducted from the account's Block Issuance Credit (BIC), but the account would not allot enough Mana in the containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking of the account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the account operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost From 843efde7bfdfc6281bddc95df816b7d18db66ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Mon, 5 Jun 2023 14:11:17 +0200 Subject: [PATCH 017/110] Time restriction --- tips/TIP-0046/tip-0046.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7f31722c4..1651f89cb 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -368,8 +368,9 @@ criteria defines whether the block passes the syntactic validation: - There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation - - The `Signature` must pass semantic validation. +- Time restrictions for blocks including a transaction: + - If a `Block` contains a transaction payload. The Slot Index from `Issuing Time` of a block must be greater or equal than Issuing Time slot of the transaction included. ### Payloads From 52c7f6ea4780c9f1ef9496f5277a61ba45bbf28a Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 3 Jul 2023 20:13:29 +0800 Subject: [PATCH 018/110] Add Slot Index and Slot Commitment ID calculation --- tips/TIP-0046/tip-0046.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 1651f89cb..004ff4dfc 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -19,7 +19,9 @@ created: 2023-05-16 - [Building Blocks](#building-blocks) - [Block ID](#block-id) - [Calculation](#calculation) + - [Slot Index](#slot-index) - [Slot Commitment](#slot-commitment) + - [Slot Commitment ID](#slot-commitment-id) - [Signature](#signature) - [Block Types](#block-types) - [Block](#block) @@ -85,6 +87,13 @@ steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash functio The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. +## Slot Index + +Timeline is divided into slots, and each slot has a corresponding slot index, which is a `uint64`. +To calculate the slot index of a timestamp, `genesisTimestamp` and the duration of a slot are needed. +The slot index of timestamp `ts` is `(ts - genesisTimestamp)/duration + 1`. +Slots are counted starting from 1 because 0 is reserved for the genesis which has to be addressable as its own. + ## Slot Commitment A Slot Commitment contains a summary of a slot. The Slot Commitment is serialized as follows: @@ -119,6 +128,19 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize
    Burned Mana uint64The amount of Block Issuance Credits the Account identified by Account ID is at most willing to burn for this block. The congestion control shall only burn credits for the block according to its size and the current RMC value which may be lower than the value of this field.The amount of Mana the Account identified by Account ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field.
    Slot Commitment
    +### Slot Commitment ID + +Slot Commitment ID denotes an identifier of a slot commitment, with type `ArrayBytes[40]`. It is calculated as the following steps, using BLAKE2b-256 hash function: + +* `content` is the serialized slot commitment. +* `slot_index` is the slot index of the slot commitment. + +Calculation: +1. `content_hash` = hash(`content`) +2. And finally, `CommitmentID` = Concat(`content_hash`, `slot_index`) + +The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitment ID with `0x` prefix. + ## Signature The _Ed25519 Signature_ is supported. It is serialized as follows: @@ -152,10 +174,7 @@ The `Signature` field over the block is computed as follows: 1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little endian. -2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. The slot identifier is of type - `ByteArray[40]`, computed as follows: - - Compute the Blake2b-256 hash over the serialized slot commitment. - - Return the slot identifier as the concatenation of the hash with the little-endian encoded slot index. +2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. 3. Compute the `contentHash` by computing the Blake2b-256 hash over the serialized block without the `Signature` and `Nonce` fields. 4. Generate the `signingInput` as the concatentation of `serializedTime`, `commitmentId` and `contentHash`. From 154fc63e1e68abaced4b58639847255eef7823f7 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 3 Jul 2023 20:32:12 +0800 Subject: [PATCH 019/110] Add Protocol Version to Block layout --- tips/TIP-0046/tip-0046.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 004ff4dfc..b443fe98c 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -211,6 +211,12 @@ The following table describes the serialization of a _Block_ following the notat uint8 This field denotes the type of the block, used to decide which rules apply to the block. Set to value 0 to denote a Block. + + Protocol Version + uint8 + This field denotes what protocol rules apply to the block. + + Network ID uint64 @@ -251,7 +257,7 @@ The following table describes the serialization of a _Block_ following the notat The number of blocks that are weakly directly approved. - Weak Parents anyOf + Weak Parents optAnyOf
    Parent @@ -280,7 +286,7 @@ The following table describes the serialization of a _Block_ following the notat The number of blocks that are directly referenced to adjust opinion. - Shallow Like Parents anyOf + Shallow Like Parents optAnyOf
    Parent @@ -309,11 +315,6 @@ The following table describes the serialization of a _Block_ following the notat uint64 The time at which the block was issued. It is a Unix timestamp in nanoseconds. - - Burned Mana - uint64 - The amount of Mana the Account identified by Account ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field. - Slot Commitment @@ -351,6 +352,11 @@ The following table describes the serialization of a _Block_ following the notat
    + + Burned Mana + uint64 + The amount of Mana the Account identified by Account ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field. + Signature oneOf @@ -424,6 +430,12 @@ _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. uint8 This field denotes the type of the block, used to decide which rules apply to the block. Set to value 1 to denote a Validation Block. + + Protocol Version + uint8 + This field denotes what protocol rules apply to the block. + + Network ID uint64 From 5cbf752cb1d027ac1ff4d84cd441c20fe35464db Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 10:46:07 +0200 Subject: [PATCH 020/110] Rename `Account ID` -> `Issuer ID` --- tips/TIP-0046/tip-0046.md | 50 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b443fe98c..41840799f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -89,10 +89,10 @@ The string format of the Block ID is the hexadecimal encoding of the `Block ID` ## Slot Index -Timeline is divided into slots, and each slot has a corresponding slot index, which is a `uint64`. -To calculate the slot index of a timestamp, `genesisTimestamp` and the duration of a slot are needed. -The slot index of timestamp `ts` is `(ts - genesisTimestamp)/duration + 1`. -Slots are counted starting from 1 because 0 is reserved for the genesis which has to be addressable as its own. +Protocol time is divided into slots and each slot has a corresponding slot index, which is a `uint64`. To calculate the +slot index of a timestamp `Genesis Unix Timestamp` and `Slot Duration In Seconds` are needed. The slot index of +timestamp `ts` is `(ts - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. Slots are counted starting from `1` +because `0` is reserved for the genesis, which has to be addressable as its own slot. ## Slot Commitment @@ -130,14 +130,16 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize ### Slot Commitment ID -Slot Commitment ID denotes an identifier of a slot commitment, with type `ArrayBytes[40]`. It is calculated as the following steps, using BLAKE2b-256 hash function: +Slot Commitment ID denotes an identifier of a slot commitment, with type `ArrayBytes[40]`. It is calculated as the +following steps, using BLAKE2b-256 hash function: -* `content` is the serialized slot commitment. -* `slot_index` is the slot index of the slot commitment. +- `content` is the serialized slot commitment. +- `slot_index` is the slot index of the slot commitment. Calculation: + 1. `content_hash` = hash(`content`) -2. And finally, `CommitmentID` = Concat(`content_hash`, `slot_index`) +2. And finally, `CommitmentID` = Concat(`content_hash`, `slot_index`) The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitment ID with `0x` prefix. @@ -185,7 +187,7 @@ The `Signature` field over the block is computed as follows: In order for the signature to be valid all of the following conditions must hold: - The `Public Key` must verify the `Signature`. -- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Account ID` field. +- The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. This check is executed against the account state at the slot index corresponding to the `Issuing Time` of the block minus `Maximum Committable Age` slots in the past. @@ -306,7 +308,7 @@ The following table describes the serialization of a _Block_ following the notat - Account ID + Issuer ID ByteArray[32] The identifier of the account that issued this block. @@ -355,7 +357,7 @@ The following table describes the serialization of a _Block_ following the notat Burned Mana uint64 - The amount of Mana the Account identified by Account ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field. + The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field. Signature oneOf @@ -393,9 +395,11 @@ criteria defines whether the block passes the syntactic validation: - There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation + - The `Signature` must pass semantic validation. - Time restrictions for blocks including a transaction: - - If a `Block` contains a transaction payload. The Slot Index from `Issuing Time` of a block must be greater or equal than Issuing Time slot of the transaction included. + - If a `Block` contains a transaction payload. The Slot Index from `Issuing Time` of a block must be greater or equal + than Issuing Time slot of the transaction included. ### Payloads @@ -413,9 +417,9 @@ specification: ## Validation Block A Validation Block is a special type of block used by validators to secure the network. It is recognised by the -Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the -constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Block_. -_Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. +Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed +validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the +introduced [Block ID](#block-id) as its identifier. ### Serialized Layout @@ -525,7 +529,7 @@ _Validation Block_ uses the introduced [Block ID](#block-id) as its identifier. - Account ID + Issuer ID ByteArray[32] The identifier of the account that issued this block. @@ -610,13 +614,13 @@ like allowing to reference more parents, or having specific payload types or fie **Burned Mana** The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account -identified by the `Account ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the -block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana -would be deducted from the account's Block Issuance Credit (BIC), but the account would not allot enough Mana in the -containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking -of the account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the -account operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost -for the issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the +identified by the `Issuer ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the block +size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana would be +deducted from the account's Block Issuance Credit (BIC), but the account would not allot enough Mana in the containing +transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking of the +account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the account +operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost for the +issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the transaction will never result in the locking of the account. # Copyright From 5b4089ea5893cddaa17ba29dc809658e96ff8abf Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 10:52:12 +0200 Subject: [PATCH 021/110] Update time restriction --- tips/TIP-0046/tip-0046.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 41840799f..b0ecb7ce0 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -397,9 +397,8 @@ criteria defines whether the block passes the syntactic validation: ### Semantic Validation - The `Signature` must pass semantic validation. -- Time restrictions for blocks including a transaction: - - If a `Block` contains a transaction payload. The Slot Index from `Issuing Time` of a block must be greater or equal - than Issuing Time slot of the transaction included. +- If a `Block` contains a transaction payload. The Slot Index corresponding to the `Issuing Time` of a block must be + greater or equal than the `Creation Slot` of the contained transaction. ### Payloads From 54ec8fbc589dc28576b29c894dd00b079a81aa7e Mon Sep 17 00:00:00 2001 From: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Date: Tue, 4 Jul 2023 18:55:28 +0100 Subject: [PATCH 022/110] Add commitment and commitment input related semantic validation checks. --- tips/TIP-0046/tip-0046.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b0ecb7ce0..e680b985f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -22,17 +22,18 @@ created: 2023-05-16 - [Slot Index](#slot-index) - [Slot Commitment](#slot-commitment) - [Slot Commitment ID](#slot-commitment-id) + - [Semantic Validation](#semantic-validation) - [Signature](#signature) - [Block Types](#block-types) - [Block](#block) - [Serialized Layout](#serialized-layout) - [Syntactic validation](#syntactic-validation) - - [Semantic Validation](#semantic-validation) + - [Semantic Validation](#semantic-validation-1) - [Payloads](#payloads) - [Validation Block](#validation-block) - [Serialized Layout](#serialized-layout-1) - [Syntactic validation](#syntactic-validation-1) - - [Semantic Validation](#semantic-validation-1) + - [Semantic Validation](#semantic-validation-2) - [Rationale and alternatives](#rationale-and-alternatives) - [Copyright](#copyright) @@ -143,6 +144,8 @@ Calculation: The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitment ID with `0x` prefix. +### Semantic Validation +- The `Index` of the commitment must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the `Issuing Time` of the block containing the commitment. ## Signature The _Ed25519 Signature_ is supported. It is serialized as follows: @@ -188,8 +191,7 @@ In order for the signature to be valid all of the following conditions must hold - The `Public Key` must verify the `Signature`. - The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. - This check is executed against the account state at the slot index corresponding to the `Issuing Time` of the block - minus `Maximum Committable Age` slots in the past. + This check is executed against the account state at the slot index corresponding to the slot commitment of the block. # Block Types @@ -397,8 +399,10 @@ criteria defines whether the block passes the syntactic validation: ### Semantic Validation - The `Signature` must pass semantic validation. -- If a `Block` contains a transaction payload. The Slot Index corresponding to the `Issuing Time` of a block must be - greater or equal than the `Creation Slot` of the contained transaction. +- The `Slot Commitment` must pass semantic validation. +- If a `Block` contains a transaction payload, the following conditions must be checked. + - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. + - If the transaction includes a `Commitment Input`, that input's `SlotIndex` field must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` ### Payloads @@ -601,6 +605,7 @@ criteria defines whether the block passes the syntactic validation: ### Semantic Validation - The `Signature` must pass semantic validation. +- The `Slot Commitment` must pass semantic validation. # Rationale and alternatives From 566a220b443a39ca13929d6e5a0016fbcbf34ddc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 5 Jul 2023 08:37:34 +0200 Subject: [PATCH 023/110] Update wording of commitment input condition; fmt --- tips/TIP-0046/tip-0046.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index e680b985f..7abbec12b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -145,7 +145,9 @@ Calculation: The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitment ID with `0x` prefix. ### Semantic Validation + - The `Index` of the commitment must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the `Issuing Time` of the block containing the commitment. + ## Signature The _Ed25519 Signature_ is supported. It is serialized as follows: @@ -402,7 +404,7 @@ criteria defines whether the block passes the syntactic validation: - The `Slot Commitment` must pass semantic validation. - If a `Block` contains a transaction payload, the following conditions must be checked. - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. - - If the transaction includes a `Commitment Input`, that input's `SlotIndex` field must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` + - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input resolves must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` ### Payloads From fb39d86ad1c34575a213877b0c6aa98e4ce0a170 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 14 Jul 2023 11:50:11 +0200 Subject: [PATCH 024/110] Fix `Public Key` casing --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7abbec12b..b8bebd9a8 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -166,7 +166,7 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: - Public key + Public Key ByteArray[32] The Ed25519 public key of the signature. From 6fb8833d026a5506b47a8d7302600f6c5e311e60 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 14 Jul 2023 12:47:07 +0200 Subject: [PATCH 025/110] Add epoch index calculation & format --- tips/TIP-0046/tip-0046.md | 54 +++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b8bebd9a8..d220d5299 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -19,7 +19,9 @@ created: 2023-05-16 - [Building Blocks](#building-blocks) - [Block ID](#block-id) - [Calculation](#calculation) - - [Slot Index](#slot-index) + - [Time](#time) + - [Slot Index](#slot-index) + - [Epoch Index](#epoch-index) - [Slot Commitment](#slot-commitment) - [Slot Commitment ID](#slot-commitment-id) - [Semantic Validation](#semantic-validation) @@ -39,18 +41,16 @@ created: 2023-05-16 # Summary -The Tangle is the graph data structure behind IOTA. For the Stardust upgrade we introduced an additional abstraction -layer on top of legacy IOTA version transactions where the vertices are generalized _blocks_, which then contain the +The Tangle is the graph data structure behind IOTA. For the Stardust upgrade an additional abstraction layer on top of +legacy IOTA version transactions was introduced where the vertices are generalized _blocks_, which then contain the transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 -version of the protocol. We change the calculation of the `Block ID`. Additionally, to updating the fields of the -existing Block data structure, we introduce the _Validation Block_, which is a special type of block that is used by -validators. - -The Block can contain a payload. These are core payloads that will be processed by all nodes as part of the IOTA -protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. - -Validation Blocks have additional functionality and different fields, validation rules, and allowed payloads. +version of the protocol. A new type of block is introduced, the _Validation Block_. It is a special type of block that +is used by validators. Validation Blocks have additional functionality and different fields, validation rules, and +allowed payloads. To better distinguish the _Validation Block_ from the previously introduced _Block_, the latter is +renamed to _Basic Block_. A _Basic Block_ can contain different types of payloads which are processed by all nodes as +part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by +layer. # Motivation @@ -88,12 +88,24 @@ steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash functio The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. -## Slot Index +## Time + +Protocol time is divided into slots and epochs. And epoch consists of `2^(Slots Per Epoch Exponent)` slots and each slot +is `Slot Duration In Seconds` seconds in length. + +### Slot Index + +Each slot has a corresponding slot index, which is a `uint64`. To calculate the slot index of a timestamp, the protocol +parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix timestamp +`Unix Timestamp` is `(Unix Timestamp - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. Slots are counted starting +from `1` with `0` being reserved for the genesis, which has to be addressable as its own slot. + +### Epoch Index -Protocol time is divided into slots and each slot has a corresponding slot index, which is a `uint64`. To calculate the -slot index of a timestamp `Genesis Unix Timestamp` and `Slot Duration In Seconds` are needed. The slot index of -timestamp `ts` is `(ts - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. Slots are counted starting from `1` -because `0` is reserved for the genesis, which has to be addressable as its own slot. +Each epoch has a corresponding epoch index, which is a `uint64`. To calculate the epoch index of a slot index, that is, +the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch +index of a slot index `Slot Index` is `(Slot Index >> Slots Per Epoch Exponent) + 1`, where `>>` is the _zero-fill +right-shift_ or _logical shift_ operation. ## Slot Commitment @@ -146,7 +158,9 @@ The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitme ### Semantic Validation -- The `Index` of the commitment must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the `Issuing Time` of the block containing the commitment. +- The `Index` of the commitment must be in the closed interval + `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the + `Issuing Time` of the block containing the commitment. ## Signature @@ -403,8 +417,10 @@ criteria defines whether the block passes the syntactic validation: - The `Signature` must pass semantic validation. - The `Slot Commitment` must pass semantic validation. - If a `Block` contains a transaction payload, the following conditions must be checked. - - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. - - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input resolves must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` + - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the + `Creation Slot` of the contained transaction. + - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input + resolves must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` ### Payloads From ca8e3c0791d4974cff714dc6cf576c1650ddb38a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 14 Jul 2023 15:07:15 +0200 Subject: [PATCH 026/110] Add Block Wrapper, update Basic and Valid. Block --- tips/TIP-0046/tip-0046.md | 274 ++++++++++++++++++-------------------- 1 file changed, 131 insertions(+), 143 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d220d5299..17860e44f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -26,8 +26,9 @@ created: 2023-05-16 - [Slot Commitment ID](#slot-commitment-id) - [Semantic Validation](#semantic-validation) - [Signature](#signature) -- [Block Types](#block-types) - - [Block](#block) +- [Blocks](#blocks) + - [Block Wrapper](#block-wrapper) + - [Basic Block](#basic-block) - [Serialized Layout](#serialized-layout) - [Syntactic validation](#syntactic-validation) - [Semantic Validation](#semantic-validation-1) @@ -69,22 +70,31 @@ accommodate future needs. This section describes common building blocks used across multiple block types. +## Data Types & Subschema Notation + +Data types and subschemas used throughout this TIP are defined in [TIP-21](../TIP-0021/tip-0021.md). + +## BLAKE2b Hash Function + +This TIP uses the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function. + +## Ed25519 Signature Scheme + +This TIP prescribes signature creation according to [RFC 8032](https://tools.ietf.org/html/rfc8032). + ## Block ID A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated as the following -steps, using the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function: +steps: -- `content` is the serialized block **without** signature and nonce. -- `slot_index` is the slot index of the `Issuing Time` of the block. **Note**: It is **not** the same slot index as in - the Slot Commitment. -- `signatureBytes` is the serialized signature. - -### Calculation - -1. `content_hash` = hash(`content`) -2. `id` = hash(concat(`content_hash`, signatureBytes)) -3. `Block ID` = concat(`id`, `slot_index`) +- Let `Content` be the serialized block **without** the _Signature_. +- Let `Slot Index` be the slot index of the `Issuing Time` of the block. + - **Note**: It is **not** the same as the index of the Slot Commitment. +- Let `Serialized Signature` be the serialized signature. +- Let `Content Hash` be the BLAKE2b-256 hash of `Content`. +- Let `ID` be the BLAKE2b-256 hash of the concatenation of `Content Hash` and `Serialized Signature`. +- Let `Block ID` be the concatenation of `ID` and `Slot Index`. The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. @@ -143,18 +153,15 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize ### Slot Commitment ID -Slot Commitment ID denotes an identifier of a slot commitment, with type `ArrayBytes[40]`. It is calculated as the -following steps, using BLAKE2b-256 hash function: - -- `content` is the serialized slot commitment. -- `slot_index` is the slot index of the slot commitment. +A Slot Commitment ID denotes an identifier of a slot commitment, with type `ByteArray[40]`. It is calculated as the +following steps: -Calculation: +- Let `Content` be the serialized slot commitment. +- Let `Slot Index` be the slot index of the slot commitment. +- Let `Content Hash` be the BLAKE2b-256 hash of `Content`. +- Let `Commitment ID` be the concatenation of `Content Hash` and `Slot Index`. -1. `content_hash` = hash(`content`) -2. And finally, `CommitmentID` = Concat(`content_hash`, `slot_index`) - -The string format of Slot Commitment ID is hexadecimal encoding of Slot Commitment ID with `0x` prefix. +The string format of a Slot Commitment ID is the hexadecimal encoding of the Slot Commitment ID with `0x` prefix. ### Semantic Validation @@ -187,19 +194,17 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: Signature ByteArray[64] - The Ed25519 signature signing the Blake2b-256 hash of the serialized Transaction Essence. + The Ed25519 signature signing the BLAKE2b-256 hash of the serialized Transaction Essence. -The `Signature` field over the block is computed as follows: +The _Signature_ field over the block is computed as follows: -1. Compute the `serializedTime` by serializing the `int64` representing the nanoseconds of `Issuing Time` in little - endian. -2. Compute the `commitmentId` by computing the slot identifier of the slot commitment. -3. Compute the `contentHash` by computing the Blake2b-256 hash over the serialized block without the `Signature` and - `Nonce` fields. -4. Generate the `signingInput` as the concatentation of `serializedTime`, `commitmentId` and `contentHash`. -5. Sign the `signingInput` with Ed25519 which returns a `ByteArray[64]`. +- Let `Serialized Time` be the little endian serialized `uint64` representing the nanoseconds of `Issuing Time`. +- Let `Commitment ID` be the slot identifier of the slot commitment. +- Let `Content Hash` be the BLAKE2b-256 hash over the serialized block without the _Signature_ field. +- Let `Signing Input` be the concatentation of `Serialized Time`, `Commitment ID` and `Content Hash`. +- Let the resulting signature be the Ed25519 signature of `Signing Input`. **Semantic Validation** @@ -209,16 +214,13 @@ In order for the signature to be valid all of the following conditions must hold - The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. This check is executed against the account state at the slot index corresponding to the slot commitment of the block. -# Block Types - -## Block +# Blocks -_Block_ uses the introduced [Block ID](#block-id) as its identifier. +## Block Wrapper -### Serialized Layout - -The following table describes the serialization of a _Block_ following the notation from -[TIP-21](../TIP-0021/tip-0021.md): +The two block types introduced in this TIP share some fields which are contained in an outer wrapper. This _Block +Wrapper_ is only introduced as a way to deduplicate the definition of those fields. It is not a standalone block type. +The _Block Wrapper_ with a concrete block type in its _Block_ field is serialized as follows: @@ -226,22 +228,92 @@ The following table describes the serialization of a _Block_ following the notat - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Type Description
    Typeuint8This field denotes the type of the block, used to decide which rules apply to the block. Set to value 0 to denote a Block.
    Protocol Version uint8This field denotes what protocol rules apply to the block. - This field denotes what protocol rules apply to the block.
    Network ID uint64 Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.
    Issuing Timeuint64The time at which the block was issued. It is a Unix timestamp in nanoseconds.
    Slot Commitment +
    + Slot Commitment +
    + A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section. +
    +
    +
    Latest Finalized Slotuint64The slot index of the latest finalized slot.
    Issuer IDByteArray[32]The identifier of the account that issued this block.
    Block oneOf +
    + Basic Block +
    + A Basic Block. More details in the Basic Block section. +
    +
    +
    + Validation Block +
    + A Validation Block. More details in the Validation Block section. +
    +
    +
    Signature oneOf +
    + Ed25519 Signature +
    + An Ed25519 Signature. More details in the Signature section. +
    +
    +
    + +## Basic Block + +The _Basic Block_ uses the introduced [Block ID](#block-id) as its identifier. + +### Serialized Layout + +The serialized layout of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following +layout: + + + + + + + + + + + + @@ -325,32 +397,6 @@ The following table describes the serialization of a _Block_ following the notat - - - - - - - - - - - - - - - - - - - @@ -377,17 +423,6 @@ The following table describes the serialization of a _Block_ following the notat - - - -
    NameTypeDescription
    Typeuint8Set to value 0 to denote a Basic Block.
    Strong Parents Count uint8
    Issuer IDByteArray[32]The identifier of the account that issued this block.
    Issuing Timeuint64The time at which the block was issued. It is a Unix timestamp in nanoseconds.
    Slot Commitment -
    - Slot Commitment -
    - A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section. -
    -
    -
    Latest Finalized Slotuint64The slot index of the latest finalized slot.
    Payload Length uint32uint64 The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field.
    Signature oneOf -
    - Ed25519 Signature -
    - An Ed25519 Signature. More details in the Signature section. -
    -
    -
    ### Syntactic validation @@ -439,11 +474,14 @@ specification: A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed -validator throughput. It is allowed to reference more parent blocks than a normal _Block_. _Validation Block_ uses the -introduced [Block ID](#block-id) as its identifier. +validator throughput. It is allowed to reference more parent blocks than a normal _Basic Block_. _Validation Block_ uses +the introduced [Block ID](#block-id) as its identifier. ### Serialized Layout +The serialized layout of a _Validation Block_ is that of a _Block Wrapper_ with the _Block_ field containing the +following layout: + @@ -453,18 +491,7 @@ introduced [Block ID](#block-id) as its identifier. - - - - - - - - - - - + @@ -549,54 +576,15 @@ introduced [Block ID](#block-id) as its identifier. - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + +
    Name
    Type uint8This field denotes the type of the block, used to decide which rules apply to the block. Set to value 1 to denote a Validation Block.
    Protocol Versionuint8This field denotes what protocol rules apply to the block. -
    Network IDuint64Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.Set to value 1 to denote a Validation Block.
    Strong Parents Count
    Issuer IDByteArray[32]The identifier of the account that issued this block.
    Issuing Timeuint64The time at which the block was issued. It is a Unix timestamp in nanoseconds.
    Slot Commitment -
    - Slot Commitment -
    - A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section. -
    -
    -
    Latest Finalized Slotuint64The slot index of the latest finalized slot.
    Payload Lengthuint32The length of the following payload in bytes. A length of 0 means no payload will be attached.
    Payload optOneOf -
    - None -
    +
    Highest Supported Versionuint8The highest supported protocol version the issuer of this block supports. TODO: Add more details.
    Signature oneOf -
    - Ed25519 Signature -
    - An Ed25519 Signature. More details in the Signature section. -
    -
    -
    Protocol Parameters HashByteArray[32]The hash of the protocol parameters for the Highest Supported Version.
    From 14390c3cacd487cadaed6c5c7a5f0985f7123e78 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 14 Jul 2023 15:43:40 +0200 Subject: [PATCH 027/110] Update Block ID, Commitment ID and Signature Calc --- tips/TIP-0046/tip-0046.md | 43 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 17860e44f..e85ec5483 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -80,21 +80,21 @@ This TIP uses the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash functi ## Ed25519 Signature Scheme -This TIP prescribes signature creation according to [RFC 8032](https://tools.ietf.org/html/rfc8032). +This TIP uses Ed25519 signatures according to [RFC 8032](https://tools.ietf.org/html/rfc8032). ## Block ID A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out -fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated as the following +fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated with the following steps: -- Let `Content` be the serialized block **without** the _Signature_. +- Let `Block Header Hash` be the BLAKE2b-256 hash over the serialized block header. +- Let `Block Hash` be the BLAKE2b-256 hash over the serialized content of the _Block_ field. +- Let `Serialized Signature` be the serialized _Signature_. +- Let `ID` be the BLAKE2b-256 hash of the concatenation of `Block Header Hash`, `Block Hash` and `Serialized Signature`. - Let `Slot Index` be the slot index of the `Issuing Time` of the block. - - **Note**: It is **not** the same as the index of the Slot Commitment. -- Let `Serialized Signature` be the serialized signature. -- Let `Content Hash` be the BLAKE2b-256 hash of `Content`. -- Let `ID` be the BLAKE2b-256 hash of the concatenation of `Content Hash` and `Serialized Signature`. -- Let `Block ID` be the concatenation of `ID` and `Slot Index`. +- Let `Serialized Slot Index` be the little-endian serialized `Slot Index`. +- Let `Block ID` be the concatenation of `ID` and `Serialized Slot Index`. The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. @@ -153,12 +153,13 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize ### Slot Commitment ID -A Slot Commitment ID denotes an identifier of a slot commitment, with type `ByteArray[40]`. It is calculated as the +A Slot Commitment ID denotes an identifier of a slot commitment, with type `ByteArray[40]`. It is calculated with the following steps: - Let `Content` be the serialized slot commitment. -- Let `Slot Index` be the slot index of the slot commitment. - Let `Content Hash` be the BLAKE2b-256 hash of `Content`. +- Let `Slot Index` be the slot index of the slot commitment. +- Let `Serialized Slot Index` be the little-endian serialized `Slot Index`. - Let `Commitment ID` be the concatenation of `Content Hash` and `Slot Index`. The string format of a Slot Commitment ID is the hexadecimal encoding of the Slot Commitment ID with `0x` prefix. @@ -200,17 +201,16 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: The _Signature_ field over the block is computed as follows: -- Let `Serialized Time` be the little endian serialized `uint64` representing the nanoseconds of `Issuing Time`. -- Let `Commitment ID` be the slot identifier of the slot commitment. -- Let `Content Hash` be the BLAKE2b-256 hash over the serialized block without the _Signature_ field. -- Let `Signing Input` be the concatentation of `Serialized Time`, `Commitment ID` and `Content Hash`. +- Let `Block Header Hash` be the BLAKE2b-256 hash over the serialized block header. +- Let `Block Hash` be the BLAKE2b-256 hash over the serialized content of the _Block_ field. +- Let `Signing Input` be the concatentation of `Block Header Hash` and `Block Hash`. - Let the resulting signature be the Ed25519 signature of `Signing Input`. **Semantic Validation** In order for the signature to be valid all of the following conditions must hold: -- The `Public Key` must verify the `Signature`. +- The `Public Key` must verify the `Signature`, according to [TIP-14](../TIP-0014/tip-0014.md). - The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. This check is executed against the account state at the slot index corresponding to the slot commitment of the block. @@ -218,9 +218,12 @@ In order for the signature to be valid all of the following conditions must hold ## Block Wrapper -The two block types introduced in this TIP share some fields which are contained in an outer wrapper. This _Block +The two block types introduced in this TIP share some common fields which are contained in an outer wrapper. This _Block Wrapper_ is only introduced as a way to deduplicate the definition of those fields. It is not a standalone block type. -The _Block Wrapper_ with a concrete block type in its _Block_ field is serialized as follows: + +All fields of a _Block Wrapper_ except for the _Block_ and _Signature_ constitute the _Block Header_. + +The _Block Wrapper_ is serialized as follows: @@ -615,6 +618,12 @@ criteria defines whether the block passes the syntactic validation: # Rationale and alternatives +**Block ID & Signature** + +Splitting the singing input of a Block Signature into a header and block part allows for verification of an attestation +where only the header and block hash are known. In a similar way, a Block ID can be recomputed from an attestation +without having the entire block. + **Validation Block** The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, From 85aefe6fb0ad5fef63f28181758815df6eb2b928 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 24 Jul 2023 17:34:32 +0200 Subject: [PATCH 028/110] Align with code: Use id instead of full commitment --- tips/TIP-0046/tip-0046.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index e85ec5483..7320ff73b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -247,15 +247,9 @@ The _Block Wrapper_ is serialized as follows: - - + + + @@ -453,7 +447,6 @@ criteria defines whether the block passes the syntactic validation: ### Semantic Validation - The `Signature` must pass semantic validation. -- The `Slot Commitment` must pass semantic validation. - If a `Block` contains a transaction payload, the following conditions must be checked. - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. @@ -614,7 +607,6 @@ criteria defines whether the block passes the syntactic validation: ### Semantic Validation - The `Signature` must pass semantic validation. -- The `Slot Commitment` must pass semantic validation. # Rationale and alternatives From 846f560fb149da8016562d6e07ccd5011f993980 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 14 Aug 2023 15:09:37 +0200 Subject: [PATCH 029/110] Rename `Signature Type` to `Type` --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7320ff73b..ce52462af 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -181,7 +181,7 @@ The _Ed25519 Signature_ is supported. It is serialized as follows: - + - +
    The time at which the block was issued. It is a Unix timestamp in nanoseconds.
    Slot Commitment -
    - Slot Commitment -
    - A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section. -
    -
    -
    Slot Commitment IDByteArray[40]The identifier of the slot this block commits to. More details in the Slot Commitment ID section.
    Latest Finalized SlotDescription
    Signature TypeType uint8 Set to value 0 to denote an Ed25519 Signature. From 5161084017328589d82d1846125be1e600205e25 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 14 Aug 2023 15:24:28 +0200 Subject: [PATCH 030/110] Fix signature description --- tips/TIP-0046/tip-0046.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ce52462af..3b0d188fe 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -195,15 +195,17 @@ The _Ed25519 Signature_ is supported. It is serialized as follows:
    Signature ByteArray[64]The Ed25519 signature signing the BLAKE2b-256 hash of the serialized Transaction Essence.The Ed25519 signature computed according to Signature Creation.
    +### Signature Creation + The _Signature_ field over the block is computed as follows: - Let `Block Header Hash` be the BLAKE2b-256 hash over the serialized block header. - Let `Block Hash` be the BLAKE2b-256 hash over the serialized content of the _Block_ field. -- Let `Signing Input` be the concatentation of `Block Header Hash` and `Block Hash`. +- Let `Signing Input` be the concatenation of `Block Header Hash` and `Block Hash`. - Let the resulting signature be the Ed25519 signature of `Signing Input`. **Semantic Validation** From 1a1e301ef2490709d7ea1217bb56fdbffd53988d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 14 Aug 2023 15:26:01 +0200 Subject: [PATCH 031/110] Fix singing typo --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 3b0d188fe..8c06b5605 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -614,7 +614,7 @@ criteria defines whether the block passes the syntactic validation: **Block ID & Signature** -Splitting the singing input of a Block Signature into a header and block part allows for verification of an attestation +Splitting the signing input of a Block Signature into a header and block part allows for verification of an attestation where only the header and block hash are known. In a similar way, a Block ID can be recomputed from an attestation without having the entire block. From 4b8ecf8e3261fd984cec7e96ed0d59c63edaf873 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 14 Aug 2023 15:52:30 +0200 Subject: [PATCH 032/110] Fix concept typo --- tips/TIP-0047/tip-0047.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index db76ef3f2..0384eb0f3 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -14,7 +14,7 @@ replaces: TIP-19 ## Summary -This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This cocnept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. +This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This concept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. From 8690b776e947442539257240c917fbdda722b3e9 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 16 Aug 2023 14:13:58 +0200 Subject: [PATCH 033/110] Add number of parents validation blocks can ref --- tips/TIP-0046/tip-0046.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 8c06b5605..134b61967 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -593,10 +593,9 @@ criteria defines whether the block passes the syntactic validation: - The total length of the serialized block must not exceed `Max Block Length`. - `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. - - TODO: How many parents can a validation block reference? - - It must hold true that 1 ≤ `Strong Parents Count` ≤ TODO. - - It must hold true that 0 ≤ `Weak Parents Count` ≤ TODO. - - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ TODO. + - It must hold true that 1 ≤ `Strong Parents Count` ≤ 50. + - It must hold true that 0 ≤ `Weak Parents Count` ≤ 50. + - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 50. - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. From 39b6de8c15eb8055afde141df98f9edc3ccdf0c9 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 16 Aug 2023 14:16:33 +0200 Subject: [PATCH 034/110] Update `Burned Mana` description --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 134b61967..0c3680f5f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -420,7 +420,7 @@ layout: Burned Mana uint64 - The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to its size and the current RMC value which may be lower than the value of this field. + The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to the product of the block's work score and the current RMC (Reference Mana Cost) value which may be lower than the value of this field. From 422beb7dbca565bbe0bf2369d727daa6e6fa2be7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 17 Aug 2023 15:17:03 +0200 Subject: [PATCH 035/110] Add Version and RMC to commitment --- tips/TIP-0046/tip-0046.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 0c3680f5f..eda2bc2e7 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -127,6 +127,13 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize Type Description + + Version + uint8 + + The version byte. + + Index uint64 @@ -149,6 +156,12 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize uint64 The weight of the chain of the Index minus Maximum Committable Age slots in the past. This is required for attestations on whether to switch slot commitment chains. + + RMC + uint64 + This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. Each new RMC value for a slot with index i is calculated upon commitment based on the RMC from slot i - 1 and the total work score of blocks in slot i. It is convenient to store the RMC in the commitment to avoid having to recalculate it from genesis when syncing. + + ### Slot Commitment ID From 1f3835fb108de2f1a1857ad1829c21a841426f70 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 24 Aug 2023 16:21:07 +0200 Subject: [PATCH 036/110] Add note on epoch 0 being reserved --- tips/TIP-0046/tip-0046.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index eda2bc2e7..370f26a1a 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -115,7 +115,8 @@ from `1` with `0` being reserved for the genesis, which has to be addressable as Each epoch has a corresponding epoch index, which is a `uint64`. To calculate the epoch index of a slot index, that is, the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch index of a slot index `Slot Index` is `(Slot Index >> Slots Per Epoch Exponent) + 1`, where `>>` is the _zero-fill -right-shift_ or _logical shift_ operation. +right-shift_ or _logical shift_ operation. Epochs are counted starting from `1` with `0` being reserved for the genesis, +which has to be addressable as its own epoch. ## Slot Commitment From 0835c505d78b4b7a543292e9c88a2ac0b2915aa1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 24 Aug 2023 16:40:13 +0200 Subject: [PATCH 037/110] Clarify slot and epoch conversions --- tips/TIP-0046/tip-0046.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 370f26a1a..9e41b9db3 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -107,16 +107,18 @@ is `Slot Duration In Seconds` seconds in length. Each slot has a corresponding slot index, which is a `uint64`. To calculate the slot index of a timestamp, the protocol parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix timestamp -`Unix Timestamp` is `(Unix Timestamp - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. Slots are counted starting -from `1` with `0` being reserved for the genesis, which has to be addressable as its own slot. +`Unix Timestamp` is `(Unix Timestamp - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. The `+ 1` is required +because slots are counted starting from `1` with `0` being reserved for the genesis, which has to be addressable as its +own slot. ### Epoch Index Each epoch has a corresponding epoch index, which is a `uint64`. To calculate the epoch index of a slot index, that is, the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch -index of a slot index `Slot Index` is `(Slot Index >> Slots Per Epoch Exponent) + 1`, where `>>` is the _zero-fill -right-shift_ or _logical shift_ operation. Epochs are counted starting from `1` with `0` being reserved for the genesis, -which has to be addressable as its own epoch. +index of a slot index `Slot Index` is `0` if `Slot Index == 0`, otherwise it is +`(Slot Index >> Slots Per Epoch Exponent) + 1`, where `>>` is the _zero-fill right-shift_ or _logical shift_ operation. +The `+ 1` is required because epochs are counted starting from `1` with `0` being reserved for the genesis, which has to +be addressable as its own epoch. ## Slot Commitment From b8ef6fb643b251ef49936cb5601a9af9430c0bec Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 28 Aug 2023 13:19:29 +0200 Subject: [PATCH 038/110] Update epoch/slot conversion calculations --- tips/TIP-0046/tip-0046.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 9e41b9db3..ea874bba5 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -107,18 +107,20 @@ is `Slot Duration In Seconds` seconds in length. Each slot has a corresponding slot index, which is a `uint64`. To calculate the slot index of a timestamp, the protocol parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix timestamp -`Unix Timestamp` is `(Unix Timestamp - Genesis Unix Timestamp)/Slot Duration In Seconds + 1`. The `+ 1` is required -because slots are counted starting from `1` with `0` being reserved for the genesis, which has to be addressable as its -own slot. +`Unix Timestamp` (in seconds) is calculated as follows: + +- Compute `Elapsed Time` as `Unix Timestamp - Genesis Unix Timestamp`. +- If `Elapsed Time < 0`, the slot index is `0`. +- Otherwise the slot index is `Elapsed Time/Slot Duration In Seconds + 1`. + - Note: The `+ 1` is required because slots are counted starting from `1` with `0` being reserved for the genesis, + which has to be addressable as its own slot. ### Epoch Index Each epoch has a corresponding epoch index, which is a `uint64`. To calculate the epoch index of a slot index, that is, the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch -index of a slot index `Slot Index` is `0` if `Slot Index == 0`, otherwise it is -`(Slot Index >> Slots Per Epoch Exponent) + 1`, where `>>` is the _zero-fill right-shift_ or _logical shift_ operation. -The `+ 1` is required because epochs are counted starting from `1` with `0` being reserved for the genesis, which has to -be addressable as its own epoch. +index of a slot index `Slot Index` is `Slot Index >> Slots Per Epoch Exponent`, where `>>` is the _zero-fill +right-shift_ or _logical shift_ operation. ## Slot Commitment From e95818e621e3edbcc6693b110024781bf5631a3f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 28 Aug 2023 14:29:49 +0200 Subject: [PATCH 039/110] Clarify slot 0 genesis reservation --- tips/TIP-0046/tip-0046.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ea874bba5..2b643f061 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -112,8 +112,8 @@ parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The - Compute `Elapsed Time` as `Unix Timestamp - Genesis Unix Timestamp`. - If `Elapsed Time < 0`, the slot index is `0`. - Otherwise the slot index is `Elapsed Time/Slot Duration In Seconds + 1`. - - Note: The `+ 1` is required because slots are counted starting from `1` with `0` being reserved for the genesis, - which has to be addressable as its own slot. + - Note: The `+ 1` is required because slots are counted starting from `1` with `0` being reserved for times before the + genesis, which has to be addressable as its own slot. ### Epoch Index From 2725ee3f087d1e59de4def078c938ff6de383257 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 6 Sep 2023 08:46:38 +0200 Subject: [PATCH 040/110] Fix signature link --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 2b643f061..d3f13bf87 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -304,7 +304,7 @@ The _Block Wrapper_ is serialized as follows:
    Ed25519 Signature
    - An Ed25519 Signature. More details in the Signature section. + An Ed25519 Signature. More details in the Signature section.
    From e1a7e4273b58fb91e2990ffa29fc3e91c6f8cd39 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 12 Sep 2023 10:02:28 +0200 Subject: [PATCH 041/110] Add constraints for highest supported version --- tips/TIP-0046/tip-0046.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d3f13bf87..e7a385f3d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -617,11 +617,12 @@ criteria defines whether the block passes the syntactic validation: - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. -- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like - parents. +- `Weak Parents` must be disjoint to the rest of the parents: No weak parent should be in either `Strong Parents` + or`Shallow Like Parents`. - Each `Block ID` must be unique. - `Payload Length` must be 0 and the `Payload` must not be present. - There must be no trailing bytes after all block fields have been parsed. +- `Highest Supported Version` must be greater or equal to `Protocol Version`. ### Semantic Validation From 3636aebfa68f8a2de9d387b224b73d52b7459f13 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 12 Sep 2023 10:19:18 +0200 Subject: [PATCH 042/110] Remove block id mention in block types --- tips/TIP-0046/tip-0046.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index e7a385f3d..512279f4d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -313,8 +313,6 @@ The _Block Wrapper_ is serialized as follows: ## Basic Block -The _Basic Block_ uses the introduced [Block ID](#block-id) as its identifier. - ### Serialized Layout The serialized layout of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following @@ -490,8 +488,7 @@ specification: A Validation Block is a special type of block used by validators to secure the network. It is recognised by the Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed -validator throughput. It is allowed to reference more parent blocks than a normal _Basic Block_. _Validation Block_ uses -the introduced [Block ID](#block-id) as its identifier. +validator throughput. It is allowed to reference more parent blocks than a normal _Basic Block_. ### Serialized Layout From 98e3827e56a54bdcd52ecf132b661e1047d6e454 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 13 Sep 2023 09:43:33 +0200 Subject: [PATCH 043/110] Fix broken link and rm validation block payloads --- tips/TIP-0046/tip-0046.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 512279f4d..ea1a2623c 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -18,7 +18,6 @@ created: 2023-05-16 - [Motivation](#motivation) - [Building Blocks](#building-blocks) - [Block ID](#block-id) - - [Calculation](#calculation) - [Time](#time) - [Slot Index](#slot-index) - [Epoch Index](#epoch-index) @@ -47,11 +46,10 @@ legacy IOTA version transactions was introduced where the vertices are generaliz transactions or other structures that are processed by the IOTA protocol. Just as before, each block directly approves other blocks, which are known as _parents_. The new block structure matches the requirements introduced by the IOTA 2.0 version of the protocol. A new type of block is introduced, the _Validation Block_. It is a special type of block that -is used by validators. Validation Blocks have additional functionality and different fields, validation rules, and -allowed payloads. To better distinguish the _Validation Block_ from the previously introduced _Block_, the latter is -renamed to _Basic Block_. A _Basic Block_ can contain different types of payloads which are processed by all nodes as -part of the IOTA protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by -layer. +is used by validators. Validation Blocks have additional functionality and different fields and validation rules. To +better distinguish the _Validation Block_ from the previously introduced _Block_, the latter is renamed to _Basic +Block_. A _Basic Block_ can contain different types of payloads which are processed by all nodes as part of the IOTA +protocol. Some payloads may have other nested payloads embedded inside. Hence, parsing is done layer by layer. # Motivation From 9e6711b6d8fa2f35d3d84583722d78baef42f477 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 13 Sep 2023 10:50:13 +0200 Subject: [PATCH 044/110] Clarify version description --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ea1a2623c..769053cb6 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -134,7 +134,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize Version uint8 - The version byte. + The version of the protocol in which this commitment was created. From 0fc7c7a238703d5591f2ff973394491ad65cb4da Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 13 Sep 2023 10:52:00 +0200 Subject: [PATCH 045/110] Update tips/TIP-0046/tip-0046.md Co-authored-by: Thibault Martinez --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 769053cb6..c1eef455f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -634,7 +634,7 @@ without having the entire block. **Validation Block** The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, -having a separate block type for validator related responsibilites is much cleaner and allows for additional changes +having a separate block type for validator related responsibilities is much cleaner and allows for additional changes like allowing to reference more parents, or having specific payload types or fields in the future. **Burned Mana** From b1cc60f64e3c7659b21d5285c0ba823dfdece41d Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 14 Sep 2023 14:17:00 +0800 Subject: [PATCH 046/110] Add example for BlockID, TransactionID and CommitmentID --- tips/TIP-0046/tip-0046.md | 247 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c1eef455f..3b4d6085f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -649,6 +649,253 @@ operates. If `Burned Mana` is lower than it should be, the block can simply be d issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the transaction will never result in the locking of the account. +# Appendix + +## Test Vectors + +### Slot Commitment ID + +``` +{ + "version":3, + "index":"10", + "prevId":"0x4b024b3e47280d05272a7d136f0c464e4e136b734e6c427749413e286162077560652c007e37241a", + "rootsId":"0x75614402763f5f045c040334631b791b4d755d626d504b134a505c001c516549", + "cumulativeWeight":"100", + "rmc":"6000" +} +``` + +Serialized bytes: +``` +[3 10 0 0 0 0 0 0 0 75 2 75 62 71 40 13 5 39 42 125 19 111 12 70 78 78 19 107 115 78 108 66 119 73 65 62 40 97 98 7 117 96 101 44 0 126 55 36 26 117 97 68 2 118 63 95 4 92 4 3 52 99 27 121 27 77 117 93 98 109 80 75 19 74 80 92 0 28 81 101 73 100 0 0 0 0 0 0 0 112 23 0 0 0 0 0 0] +``` + +Slot Commitment ID: `0x3a73079f3dbf8c1744ae0b020b9767546e32f5bbbf4c6f0233da7b64f16581f80a00000000000000` + +### Transaction ID + +``` +{ + "type":6, + "essence":{ + "type":2, + "networkId":"3650798313638353144", + "creationSlot":"28", + "contextInputs":[], + "inputs":[ + { + "type":0, + "transactionId":"0x24ff9b3038506fb1b406306a496001c3e24e2be07c838317922bf21d686a078f", + "transactionOutputIndex":10 + } + ], + "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", + "outputs":[ + { + "type":3, + "amount":"10000", + "mana":"0", + "unlockConditions":[ + { + "type":0, + "address":{ + "type":0, + "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" + } + } + ] + } + ], + "allotments":[], + "payload":{ + "type":5, + "tag":"0x1d7b3e11697264111e130b0e", + "data":"0x1d7b3e11697264111e130b0e" + } + }, + "unlocks":[ + { + "type":0, + "signature":{ + "type":0, + "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", + "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" + } + } + ] +} +``` + +Serialized bytes: +``` +[6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5] +``` + +Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682533` + +### Basic Block ID (Tagged Data payload) +``` +{ + "protocolVersion":3, + "networkId":"0", + "issuingTime":"1694608262748556515", + "slotCommitment":"0x49100d1d05557c7c204c221d5a3415570009752f7b10356d062c6d730d0568497e2c3c3d480d7d23", + "latestFinalizedSlot":"2", + "issuerId":"0x0000000000000000000000000000000000000000000000000000000000000000", + "block": { + "type":0, + "strongParents":[ + "0x00627e507d71337c3c1647747e5a4b565f2a71480e62170e1b3f085e0e0a41321c017a4d2b3b4210", + "0x03485a0516062d003a646a40676d5c1c1e0d574822443c630a08385836101a5c33181f2314573706", + "0x4274246513610f1b044562676e125e1e11781e5a0a2b4c5d1d6e7c2b792c163e5f74393149311513", + "0x7549226845340f730244733152263e553036684748704d5f74017c3b573c1b21345e59644c286b5e" + ], + "weakParents":[ + "0x12731a211b5323256c2c295564532a246125681d1163585f077149137578585e75407a5a4c51485a" + ], + "shallowLikeParents":[ + "0x1e1f5b10094a7e01134d65325f395c2d507703172e4b740814582b5a52536c1315706727541a582b" + ], + "payload":{ + "type":5, + "tag":"0x68656c6c6f20776f726c64", + "data":"0x01020304" + }, + "burnedMana":"100" + }, + "signature":{ + "type":0, + "publicKey":"0x0000000000000000000000000000000000000000000000000000000000000000", + "signature":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + +Serialized bytes: +`[3 0 0 0 0 0 0 0 0 227 204 145 142 60 117 132 23 73 16 13 29 5 85 124 124 32 76 34 29 90 52 21 87 0 9 117 47 123 16 53 109 6 44 109 115 13 5 104 73 126 44 60 61 72 13 125 35 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 98 126 80 125 113 51 124 60 22 71 116 126 90 75 86 95 42 113 72 14 98 23 14 27 63 8 94 14 10 65 50 28 1 122 77 43 59 66 16 3 72 90 5 22 6 45 0 58 100 106 64 103 109 92 28 30 13 87 72 34 68 60 99 10 8 56 88 54 16 26 92 51 24 31 35 20 87 55 6 66 116 36 101 19 97 15 27 4 69 98 103 110 18 94 30 17 120 30 90 10 43 76 93 29 110 124 43 121 44 22 62 95 116 57 49 73 49 21 19 117 73 34 104 69 52 15 115 2 68 115 49 82 38 62 85 48 54 104 71 72 112 77 95 116 1 124 59 87 60 27 33 52 94 89 100 76 40 107 94 1 18 115 26 33 27 83 35 37 108 44 41 85 100 83 42 36 97 37 104 29 17 99 88 95 7 113 73 19 117 120 88 94 117 64 122 90 76 81 72 90 1 30 31 91 16 9 74 126 1 19 77 101 50 95 57 92 45 80 119 3 23 46 75 116 8 20 88 43 90 82 83 108 19 21 112 103 39 84 26 88 43 24 0 0 0 5 0 + 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]` + +Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f0190100000000000000` + +### Basic Block ID (Transaction payload) + +``` +{ + "protocolVersion":3, + "networkId":"3650798313638353144", + "issuingTime":"1694613463455944982", + "slotCommitment":"0x5893048146ba125ea69c85a08bc122afec11baf6115ce03fc1d989df6aff2cdf1500000000000000", + "latestFinalizedSlot":"21", + "issuerId":"0x907c02e9302e0f0571f10f885594e56d8c54ff0708ab7a39bc1b74d396b93b12", + "block":{ + "type":0, + "strongParents":[ + "0xac5668c6ba7b3471a37e4a64c6611090b67babd368e1f5b670e30fb4eadba59d1c00000000000000" + ], + "weakParents":[], + "shallowLikeParents":[], + "payload":{ + "type":6, + "essence":{ + "type":2, + "networkId":"3650798313638353144", + "creationSlot":"28", + "contextInputs":[], + "inputs":[ + { + "type":0, + "transactionId":"0x24ff9b3038506fb1b406306a496001c3e24e2be07c838317922bf21d686a078f", + "transactionOutputIndex":10 + } + ], + "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", + "outputs":[ + { + "type":3, + "amount":"10000", + "mana":"0", + "unlockConditions":[ + { + "type":0, + "address":{ + "type":0, + "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" + } + } + ] + } + ], + "allotments":[], + "payload":{ + "type":5, + "tag":"0x1d7b3e11697264111e130b0e", + "data":"0x1d7b3e11697264111e130b0e" + } + }, + "unlocks":[ + { + "type":0, + "signature":{ + "type":0, + "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", + "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" + } + } + ] + }, + "burnedMana":"180500" + }, + "signature":{ + "type":0, + "publicKey":"0x293dc170d9a59474e6d81cfba7f7d924c09b25d7166bcfba606e53114d0a758b", + "signature":"0xf4dca05ba024867984cfd657aac7c4f782a8bf5830dcbea482f351c578ffb4db061dd30a31816e9b7ba6e7096d63ff1209f9a2a0449ac7277cae5d3ebc87310f" + } +} +``` + +Serialized bytes: +``` +[3 248 88 2 55 185 61 170 50 22 209 226 112 247 121 132 23 88 147 4 129 70 186 18 94 166 156 133 160 139 193 34 175 236 17 186 246 17 92 224 63 193 217 137 223 106 255 44 223 21 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 144 124 2 233 48 46 15 5 113 241 15 136 85 148 229 109 140 84 255 7 8 171 122 57 188 27 116 211 150 185 59 18 0 1 172 86 104 198 186 123 52 113 163 126 74 100 198 97 16 144 182 123 171 211 104 225 245 182 112 227 15 180 234 219 165 157 28 0 0 0 0 0 0 0 0 0 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 41 61 193 112 217 165 148 116 230 216 28 251 167 247 217 36 192 155 37 215 22 107 207 186 96 110 83 17 77 10 117 139 244 220 160 91 160 36 134 121 132 207 214 87 170 199 196 247 130 168 191 88 48 220 190 164 130 243 81 197 120 255 180 219 6 29 211 10 49 129 110 155 123 166 231 9 109 99 255 18 9 249 162 160 68 154 199 39 124 174 93 62 188 135 49 15] +``` + +Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c00000000000000` + +### Validation Block ID + +``` +{ + "protocolVersion":3, + "networkId":"0", + "issuingTime":"1694671670149673852", + "slotCommitment":"0xe0a1befd84ec67c1f70e97db1b2011fb391af164c89b92ecf277add20e3bdba10700000000000000", + "latestFinalizedSlot":"7", + "issuerId":"0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea", + "block":{ + "type":1, + "strongParents":[ + "0x4c0f68416d3eba7a7a8a570983ac63bbacb94f97908cde435292932af37d8a060e00000000000000" + ], + "weakParents":[], + "shallowLikeParents":[], + "highestSupportedVersion":3, + "protocolParametersHash":"0xf8b1cbfe835723facdcd83b2ec042346a4404df11082366e906894aa9ac7e813" + }, + "signature":{ + "type":0, + "publicKey":"0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064", + "signature":"0x4b7b3bd8f184334740ac04443b774ef299fe56b24e88f3d60d1df6a33b4581b0c791c98085eb9c2d48e7646b17261c43d4e7be1ecf4e015d5488395017d82906" + } +} +``` + +Serialized bytes: +``` +[3 0 0 0 0 0 0 0 0 124 115 48 190 231 174 132 23 224 161 190 253 132 236 103 193 247 14 151 219 27 32 17 251 57 26 241 100 200 155 146 236 242 119 173 210 14 59 219 161 7 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 55 83 88 249 44 201 71 80 102 149 152 176 170 165 90 111 247 51 16 185 7 16 225 250 213 36 192 249 17 190 15 234 1 1 76 15 104 65 109 62 186 122 122 138 87 9 131 172 99 187 172 185 79 151 144 140 222 67 82 146 147 42 243 125 138 6 14 0 0 0 0 0 0 0 0 0 3 248 177 203 254 131 87 35 250 205 205 131 178 236 4 35 70 164 64 77 241 16 130 54 110 144 104 148 170 154 199 232 19 0 5 193 222 39 68 81 219 141 232 24 45 100 198 238 13 202 58 224 201 7 126 11 67 48 201 118 151 97 113 215 144 100 75 123 59 216 241 132 51 71 64 172 4 68 59 119 78 242 153 254 86 178 78 136 243 214 13 29 246 163 59 69 129 176 199 145 201 128 133 235 156 45 72 231 100 107 23 38 28 67 212 231 190 30 207 78 1 93 84 136 57 80 23 216 41 6] +``` + +Block ID: `0x37ea373f2c0c7b78ab87298e754931f775df985171ddad7e9e9fb64d8b5219a70e00000000000000` + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 8656062aa0f925ceae02e5ad703691711f3e0e9a Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 14 Sep 2023 14:19:33 +0800 Subject: [PATCH 047/110] Add appendix to TOC --- tips/TIP-0046/tip-0046.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 3b4d6085f..af9e89e0d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -37,6 +37,8 @@ created: 2023-05-16 - [Syntactic validation](#syntactic-validation-1) - [Semantic Validation](#semantic-validation-2) - [Rationale and alternatives](#rationale-and-alternatives) +- [Appendix](#appendix) + - [Test Vectors](#test-vectors) - [Copyright](#copyright) # Summary From 9a2a3e6bbb669d3b005b16ff8005e9729574c344 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 14 Sep 2023 14:26:58 +0800 Subject: [PATCH 048/110] Use code block for serialized bytes --- tips/TIP-0046/tip-0046.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index af9e89e0d..4cb094a13 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -775,8 +775,10 @@ Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682 ``` Serialized bytes: -`[3 0 0 0 0 0 0 0 0 227 204 145 142 60 117 132 23 73 16 13 29 5 85 124 124 32 76 34 29 90 52 21 87 0 9 117 47 123 16 53 109 6 44 109 115 13 5 104 73 126 44 60 61 72 13 125 35 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 98 126 80 125 113 51 124 60 22 71 116 126 90 75 86 95 42 113 72 14 98 23 14 27 63 8 94 14 10 65 50 28 1 122 77 43 59 66 16 3 72 90 5 22 6 45 0 58 100 106 64 103 109 92 28 30 13 87 72 34 68 60 99 10 8 56 88 54 16 26 92 51 24 31 35 20 87 55 6 66 116 36 101 19 97 15 27 4 69 98 103 110 18 94 30 17 120 30 90 10 43 76 93 29 110 124 43 121 44 22 62 95 116 57 49 73 49 21 19 117 73 34 104 69 52 15 115 2 68 115 49 82 38 62 85 48 54 104 71 72 112 77 95 116 1 124 59 87 60 27 33 52 94 89 100 76 40 107 94 1 18 115 26 33 27 83 35 37 108 44 41 85 100 83 42 36 97 37 104 29 17 99 88 95 7 113 73 19 117 120 88 94 117 64 122 90 76 81 72 90 1 30 31 91 16 9 74 126 1 19 77 101 50 95 57 92 45 80 119 3 23 46 75 116 8 20 88 43 90 82 83 108 19 21 112 103 39 84 26 88 43 24 0 0 0 5 0 - 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]` +``` +[3 0 0 0 0 0 0 0 0 227 204 145 142 60 117 132 23 73 16 13 29 5 85 124 124 32 76 34 29 90 52 21 87 0 9 117 47 123 16 53 109 6 44 109 115 13 5 104 73 126 44 60 61 72 13 125 35 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 98 126 80 125 113 51 124 60 22 71 116 126 90 75 86 95 42 113 72 14 98 23 14 27 63 8 94 14 10 65 50 28 1 122 77 43 59 66 16 3 72 90 5 22 6 45 0 58 100 106 64 103 109 92 28 30 13 87 72 34 68 60 99 10 8 56 88 54 16 26 92 51 24 31 35 20 87 55 6 66 116 36 101 19 97 15 27 4 69 98 103 110 18 94 30 17 120 30 90 10 43 76 93 29 110 124 43 121 44 22 62 95 116 57 49 73 49 21 19 117 73 34 104 69 52 15 115 2 68 115 49 82 38 62 85 48 54 104 71 72 112 77 95 116 1 124 59 87 60 27 33 52 94 89 100 76 40 107 94 1 18 115 26 33 27 83 35 37 108 44 41 85 100 83 42 36 97 37 104 29 17 99 88 95 7 113 73 19 117 120 88 94 117 64 122 90 76 81 72 90 1 30 31 91 16 9 74 126 1 19 77 101 50 95 57 92 45 80 119 3 23 46 75 116 8 20 88 43 90 82 83 108 19 21 112 103 39 84 26 88 43 24 0 0 0 5 0 + 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] + ``` Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f0190100000000000000` From 3bcd377d2a49bd20fe8c7987e35ede803c215694 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Sep 2023 10:55:02 +0200 Subject: [PATCH 049/110] Add work score --- tips/TIP-0046/tip-0046.md | 62 ++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 4cb094a13..4a3f09a12 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -98,6 +98,13 @@ steps: The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. +## Work Score + +The WorkScore expresses the cost of an object in terms of computational requirements for a node to process it. These +costs attempt to encapsulate all processing steps carried out on this object throughout its life in the node. The +calculation of the work score is done with the use of the _Work Score Structure_ protocol parameters. The work score is +expressed as a `uint32` and all operations used in its calculation are integer arithmetic. + ## Time Protocol time is divided into slots and epochs. And epoch consists of `2^(Slots Per Epoch Exponent)` slots and each slot @@ -234,6 +241,12 @@ In order for the signature to be valid all of the following conditions must hold - The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. This check is executed against the account state at the slot index corresponding to the slot commitment of the block. +### Work Score + +Let the Work Score of a Signature be defined as follows. + +- If the type is _Ed25519 Signature_: The work score protocol parameter `Signature Ed25519`. + # Blocks ## Block Wrapper @@ -311,6 +324,16 @@ The _Block Wrapper_ is serialized as follows: +### Work Score + +The work score of a block wrapper is given by: + +- Let `Block Size` be the size of the serialized block. +- Let `Size Score` be `Block Size * Data Kilobyte / 1024` +- Let `Inner Block Score` be the work score of the contained `Block`. +- Let `Signature Score` be the work score of the `Signature`. +- Return `Size Score + Inner Block Score + Signature Score`. + ## Basic Block ### Serialized Layout @@ -484,6 +507,19 @@ specification: | Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | | Transaction | 7 | [TIP-45](../TIP-0045/tip-0045.md) | +### Work Score + +Let the work score of a _Basic Block_ be defined as follows. + +- Let `Missing Parents Score` be defined as: + - If `Strong Parents Count < Min Strong Parents Threshold`: + `Missing Parent * (Min Strong Parents Threshold - Strong Parents Count)`. + - Otherwise `0`. +- Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. + - If the type is _Tagged Data_ the work score is `0`. + - If the type is _Transaction_ the work score is defined in TIP-45. +- Return `Block + Missing Parents Score + Payload Score`. + ## Validation Block A Validation Block is a special type of block used by validators to secure the network. It is recognised by the @@ -625,6 +661,10 @@ criteria defines whether the block passes the syntactic validation: - The `Signature` must pass semantic validation. +## Work Score + +The work score of a _Validation Block_ is `0`. + # Rationale and alternatives **Block ID & Signature** @@ -668,7 +708,8 @@ transaction will never result in the locking of the account. } ``` -Serialized bytes: +Serialized bytes: + ``` [3 10 0 0 0 0 0 0 0 75 2 75 62 71 40 13 5 39 42 125 19 111 12 70 78 78 19 107 115 78 108 66 119 73 65 62 40 97 98 7 117 96 101 44 0 126 55 36 26 117 97 68 2 118 63 95 4 92 4 3 52 99 27 121 27 77 117 93 98 109 80 75 19 74 80 92 0 28 81 101 73 100 0 0 0 0 0 0 0 112 23 0 0 0 0 0 0] ``` @@ -726,10 +767,11 @@ Slot Commitment ID: `0x3a73079f3dbf8c1744ae0b020b9767546e32f5bbbf4c6f0233da7b64f } } ] -} +} ``` -Serialized bytes: +Serialized bytes: + ``` [6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5] ``` @@ -737,6 +779,7 @@ Serialized bytes: Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682533` ### Basic Block ID (Tagged Data payload) + ``` { "protocolVersion":3, @@ -774,11 +817,12 @@ Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682 } ``` -Serialized bytes: +Serialized bytes: + ``` [3 0 0 0 0 0 0 0 0 227 204 145 142 60 117 132 23 73 16 13 29 5 85 124 124 32 76 34 29 90 52 21 87 0 9 117 47 123 16 53 109 6 44 109 115 13 5 104 73 126 44 60 61 72 13 125 35 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 98 126 80 125 113 51 124 60 22 71 116 126 90 75 86 95 42 113 72 14 98 23 14 27 63 8 94 14 10 65 50 28 1 122 77 43 59 66 16 3 72 90 5 22 6 45 0 58 100 106 64 103 109 92 28 30 13 87 72 34 68 60 99 10 8 56 88 54 16 26 92 51 24 31 35 20 87 55 6 66 116 36 101 19 97 15 27 4 69 98 103 110 18 94 30 17 120 30 90 10 43 76 93 29 110 124 43 121 44 22 62 95 116 57 49 73 49 21 19 117 73 34 104 69 52 15 115 2 68 115 49 82 38 62 85 48 54 104 71 72 112 77 95 116 1 124 59 87 60 27 33 52 94 89 100 76 40 107 94 1 18 115 26 33 27 83 35 37 108 44 41 85 100 83 42 36 97 37 104 29 17 99 88 95 7 113 73 19 117 120 88 94 117 64 122 90 76 81 72 90 1 30 31 91 16 9 74 126 1 19 77 101 50 95 57 92 45 80 119 3 23 46 75 116 8 20 88 43 90 82 83 108 19 21 112 103 39 84 26 88 43 24 0 0 0 5 0 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] - ``` +``` Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f0190100000000000000` @@ -855,10 +899,11 @@ Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f019010 "publicKey":"0x293dc170d9a59474e6d81cfba7f7d924c09b25d7166bcfba606e53114d0a758b", "signature":"0xf4dca05ba024867984cfd657aac7c4f782a8bf5830dcbea482f351c578ffb4db061dd30a31816e9b7ba6e7096d63ff1209f9a2a0449ac7277cae5d3ebc87310f" } -} +} ``` -Serialized bytes: +Serialized bytes: + ``` [3 248 88 2 55 185 61 170 50 22 209 226 112 247 121 132 23 88 147 4 129 70 186 18 94 166 156 133 160 139 193 34 175 236 17 186 246 17 92 224 63 193 217 137 223 106 255 44 223 21 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 144 124 2 233 48 46 15 5 113 241 15 136 85 148 229 109 140 84 255 7 8 171 122 57 188 27 116 211 150 185 59 18 0 1 172 86 104 198 186 123 52 113 163 126 74 100 198 97 16 144 182 123 171 211 104 225 245 182 112 227 15 180 234 219 165 157 28 0 0 0 0 0 0 0 0 0 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 41 61 193 112 217 165 148 116 230 216 28 251 167 247 217 36 192 155 37 215 22 107 207 186 96 110 83 17 77 10 117 139 244 220 160 91 160 36 134 121 132 207 214 87 170 199 196 247 130 168 191 88 48 220 190 164 130 243 81 197 120 255 180 219 6 29 211 10 49 129 110 155 123 166 231 9 109 99 255 18 9 249 162 160 68 154 199 39 124 174 93 62 188 135 49 15] ``` @@ -890,10 +935,11 @@ Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c0 "publicKey":"0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064", "signature":"0x4b7b3bd8f184334740ac04443b774ef299fe56b24e88f3d60d1df6a33b4581b0c791c98085eb9c2d48e7646b17261c43d4e7be1ecf4e015d5488395017d82906" } -} +} ``` Serialized bytes: + ``` [3 0 0 0 0 0 0 0 0 124 115 48 190 231 174 132 23 224 161 190 253 132 236 103 193 247 14 151 219 27 32 17 251 57 26 241 100 200 155 146 236 242 119 173 210 14 59 219 161 7 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 55 83 88 249 44 201 71 80 102 149 152 176 170 165 90 111 247 51 16 185 7 16 225 250 213 36 192 249 17 190 15 234 1 1 76 15 104 65 109 62 186 122 122 138 87 9 131 172 99 187 172 185 79 151 144 140 222 67 82 146 147 42 243 125 138 6 14 0 0 0 0 0 0 0 0 0 3 248 177 203 254 131 87 35 250 205 205 131 178 236 4 35 70 164 64 77 241 16 130 54 110 144 104 148 170 154 199 232 19 0 5 193 222 39 68 81 219 141 232 24 45 100 198 238 13 202 58 224 201 7 126 11 67 48 201 118 151 97 113 215 144 100 75 123 59 216 241 132 51 71 64 172 4 68 59 119 78 242 153 254 86 178 78 136 243 214 13 29 246 163 59 69 129 176 199 145 201 128 133 235 156 45 72 231 100 107 23 38 28 67 212 231 190 30 207 78 1 93 84 136 57 80 23 216 41 6] ``` From ecd1550cfd377afcf1c9ff9fcb68f183a7d58625 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Sep 2023 14:38:47 +0200 Subject: [PATCH 050/110] Update work score description --- tips/TIP-0046/tip-0046.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 4a3f09a12..62dd5bb9e 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -100,10 +100,12 @@ The string format of the Block ID is the hexadecimal encoding of the `Block ID` ## Work Score -The WorkScore expresses the cost of an object in terms of computational requirements for a node to process it. These -costs attempt to encapsulate all processing steps carried out on this object throughout its life in the node. The -calculation of the work score is done with the use of the _Work Score Structure_ protocol parameters. The work score is -expressed as a `uint32` and all operations used in its calculation are integer arithmetic. +The Work Score expresses the cost of an object in terms of computational requirements for a node to process it. It +differs from the storage deposit in that it only accounts for one-off costs that the processing of a block and its +payload incur, while the storage deposit accounts for recurring costs like data storage or holding block issuer keys in +memory. The work score attempts to encapsulate all processing steps carried out on this object throughout its life in +the node. The calculation of the work score is done with the use of the _Work Score Structure_ protocol parameters. The +work score is expressed as a `uint32` and all operations used in its calculation are integer arithmetic. ## Time From 46128d96bbf87f378a3aea53f79309bae6bbb991 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Sep 2023 14:47:51 +0200 Subject: [PATCH 051/110] Add work score to ToC --- tips/TIP-0046/tip-0046.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 62dd5bb9e..51055c707 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -18,6 +18,7 @@ created: 2023-05-16 - [Motivation](#motivation) - [Building Blocks](#building-blocks) - [Block ID](#block-id) + - [Work Score](#work-score) - [Time](#time) - [Slot Index](#slot-index) - [Epoch Index](#epoch-index) @@ -27,15 +28,18 @@ created: 2023-05-16 - [Signature](#signature) - [Blocks](#blocks) - [Block Wrapper](#block-wrapper) + - [Work Score](#work-score-2) - [Basic Block](#basic-block) - [Serialized Layout](#serialized-layout) - [Syntactic validation](#syntactic-validation) - [Semantic Validation](#semantic-validation-1) - [Payloads](#payloads) + - [Work Score](#work-score-3) - [Validation Block](#validation-block) - [Serialized Layout](#serialized-layout-1) - [Syntactic validation](#syntactic-validation-1) - [Semantic Validation](#semantic-validation-2) + - [Work Score](#work-score-4) - [Rationale and alternatives](#rationale-and-alternatives) - [Appendix](#appendix) - [Test Vectors](#test-vectors) From f078093f3f1ce0bcd1c5e30c9331341730727296 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Sep 2023 14:55:12 +0200 Subject: [PATCH 052/110] Apply suggestions from code review Co-authored-by: Thibault Martinez --- tips/TIP-0046/tip-0046.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 51055c707..409bdcb2d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -707,10 +707,10 @@ transaction will never result in the locking of the account. { "version":3, "index":"10", - "prevId":"0x4b024b3e47280d05272a7d136f0c464e4e136b734e6c427749413e286162077560652c007e37241a", + "previousCommitmentId":"0x4b024b3e47280d05272a7d136f0c464e4e136b734e6c427749413e286162077560652c007e37241a", "rootsId":"0x75614402763f5f045c040334631b791b4d755d626d504b134a505c001c516549", "cumulativeWeight":"100", - "rmc":"6000" + "referenceManaCost":"6000" } ``` @@ -791,7 +791,7 @@ Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682 "protocolVersion":3, "networkId":"0", "issuingTime":"1694608262748556515", - "slotCommitment":"0x49100d1d05557c7c204c221d5a3415570009752f7b10356d062c6d730d0568497e2c3c3d480d7d23", + "slotCommitmentId":"0x49100d1d05557c7c204c221d5a3415570009752f7b10356d062c6d730d0568497e2c3c3d480d7d23", "latestFinalizedSlot":"2", "issuerId":"0x0000000000000000000000000000000000000000000000000000000000000000", "block": { From 45e6a4aafe2b0ea4027f310e4b7f319dd1396115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Wed, 20 Sep 2023 09:10:33 +0200 Subject: [PATCH 053/110] Change Cumulative Weight description --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 409bdcb2d..ccba83d91 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -172,7 +172,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize Cumulative Weight uint64 - The weight of the chain of the Index minus Maximum Committable Age slots in the past. This is required for attestations on whether to switch slot commitment chains. + The weight of the chain of the Index minus Maximum Committable Age slots in the past. This value is required for attestations and is used by node in chain switching mechanism. RMC From 000712d4b000cca557dff53d701b08781edb906a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 20 Sep 2023 13:29:59 +0200 Subject: [PATCH 054/110] Add Work Score prefixes, move block validation --- tips/TIP-0046/tip-0046.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ccba83d91..3fb9150ab 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -251,7 +251,7 @@ In order for the signature to be valid all of the following conditions must hold Let the Work Score of a Signature be defined as follows. -- If the type is _Ed25519 Signature_: The work score protocol parameter `Signature Ed25519`. +- If the type is _Ed25519 Signature_ the work score is `Work Score Signature Ed25519`. # Blocks @@ -490,15 +490,15 @@ criteria defines whether the block passes the syntactic validation: - `Data Fields` must be correctly parsable in the context of the `Payload Type`. - The payload itself must pass syntactic validation. - There must be no trailing bytes after all block fields have been parsed. +- If a `Block` contains a transaction payload, the block is valid only if all of the following conditions hold: + - The Slot Index `Block Slot` corresponding to the `Issuing Time` of a block must be greater or equal than the + `Creation Slot` of the contained transaction. + - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input + resolves must be in the closed interval `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]` ### Semantic Validation - The `Signature` must pass semantic validation. -- If a `Block` contains a transaction payload, the following conditions must be checked. - - The Slot Index, `BlockSlot`, corresponding to the `Issuing Time` of a block must be greater or equal than the - `Creation Slot` of the contained transaction. - - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input - resolves must be in the closed interval `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]` ### Payloads @@ -518,13 +518,13 @@ specification: Let the work score of a _Basic Block_ be defined as follows. - Let `Missing Parents Score` be defined as: - - If `Strong Parents Count < Min Strong Parents Threshold`: - `Missing Parent * (Min Strong Parents Threshold - Strong Parents Count)`. + - If `Strong Parents Count < Work Score Min Strong Parents Threshold`: + `Work Score Missing Parent * (Work Score Min Strong Parents Threshold - Strong Parents Count)`. - Otherwise `0`. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - If the type is _Tagged Data_ the work score is `0`. - If the type is _Transaction_ the work score is defined in TIP-45. -- Return `Block + Missing Parents Score + Payload Score`. +- Return `Work Score Block + Missing Parents Score + Payload Score`. ## Validation Block From 8d592d22003e39abe57b693aebbf4c8e36e1b88f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 20 Sep 2023 13:54:08 +0200 Subject: [PATCH 055/110] Use `Work Score Data Kibibyte` --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 3fb9150ab..f5f822fa1 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -335,7 +335,7 @@ The _Block Wrapper_ is serialized as follows: The work score of a block wrapper is given by: - Let `Block Size` be the size of the serialized block. -- Let `Size Score` be `Block Size * Data Kilobyte / 1024` +- Let `Size Score` be `Block Size * Data Kibibyte / 1024` - Let `Inner Block Score` be the work score of the contained `Block`. - Let `Signature Score` be the work score of the `Signature`. - Return `Size Score + Inner Block Score + Signature Score`. From 1bf055b96df3d26d0398f755789b513ed81c2817 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 20 Sep 2023 14:29:53 +0200 Subject: [PATCH 056/110] Remove superfluous and incorrect check --- tips/TIP-0046/tip-0046.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f5f822fa1..63130ce95 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -484,7 +484,6 @@ criteria defines whether the block passes the syntactic validation: - must not have duplicates in each list. - `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like parents. -- Each `Block ID` must be unique. - Payload (if present): - `Payload Type` must match one of the values described under [Payloads](#payloads). - `Data Fields` must be correctly parsable in the context of the `Payload Type`. From 64026e9551655437be083482e7d00d53d97a2eaa Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 21 Sep 2023 14:34:12 +0800 Subject: [PATCH 057/110] Add protocol parameter example for validation block --- tips/TIP-0046/tip-0046.md | 105 +++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 13 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 63130ce95..563729a84 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -920,25 +920,30 @@ Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c0 ``` { "protocolVersion":3, - "networkId":"0", - "issuingTime":"1694671670149673852", - "slotCommitment":"0xe0a1befd84ec67c1f70e97db1b2011fb391af164c89b92ecf277add20e3bdba10700000000000000", - "latestFinalizedSlot":"7", - "issuerId":"0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea", + "networkId":"10549460113735494767", + "issuingTime":"1675563954966263210", + "slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", + "latestFinalizedSlot":"0", + "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", "block":{ "type":1, "strongParents":[ - "0x4c0f68416d3eba7a7a8a570983ac63bbacb94f97908cde435292932af37d8a060e00000000000000" + "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", + "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" + ], + "weakParents":[ + "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" + ], + "shallowLikeParents":[ + "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" ], - "weakParents":[], - "shallowLikeParents":[], "highestSupportedVersion":3, - "protocolParametersHash":"0xf8b1cbfe835723facdcd83b2ec042346a4404df11082366e906894aa9ac7e813" + "protocolParametersHash":"0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873" }, "signature":{ "type":0, - "publicKey":"0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064", - "signature":"0x4b7b3bd8f184334740ac04443b774ef299fe56b24e88f3d60d1df6a33b4581b0c791c98085eb9c2d48e7646b17261c43d4e7be1ecf4e015d5488395017d82906" + "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c", + "signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" } } ``` @@ -946,11 +951,85 @@ Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c0 Serialized bytes: ``` -[3 0 0 0 0 0 0 0 0 124 115 48 190 231 174 132 23 224 161 190 253 132 236 103 193 247 14 151 219 27 32 17 251 57 26 241 100 200 155 146 236 242 119 173 210 14 59 219 161 7 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 55 83 88 249 44 201 71 80 102 149 152 176 170 165 90 111 247 51 16 185 7 16 225 250 213 36 192 249 17 190 15 234 1 1 76 15 104 65 109 62 186 122 122 138 87 9 131 172 99 187 172 185 79 151 144 140 222 67 82 146 147 42 243 125 138 6 14 0 0 0 0 0 0 0 0 0 3 248 177 203 254 131 87 35 250 205 205 131 178 236 4 35 70 164 64 77 241 16 130 54 110 144 104 148 170 154 199 232 19 0 5 193 222 39 68 81 219 141 232 24 45 100 198 238 13 202 58 224 201 7 126 11 67 48 201 118 151 97 113 215 144 100 75 123 59 216 241 132 51 71 64 172 4 68 59 119 78 242 153 254 86 178 78 136 243 214 13 29 246 163 59 69 129 176 199 145 201 128 133 235 156 45 72 231 100 107 23 38 28 67 212 231 190 30 207 78 1 93 84 136 57 80 23 216 41 6] +[3 111 44 91 123 20 54 103 146 170 117 54 30 138 204 64 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 1 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 3 246 2 31 174 101 73 117 219 46 130 193 116 68 220 141 67 87 60 180 34 47 80 111 180 107 164 106 9 124 248 200 115 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] +``` + +Block ID: `0x58861f95e72f76d31061c20408c5e176f31f111f794dd4d5e7b33ce42d4f11440000000000000000` + +The containing protocol parameter hash is calculated from the following: +``` +{ + "type":0, + "version":3, + "networkName":"TestJungle", + "bech32Hrp":"tgl", + "rentStructure":{ + "vByteCost":0, + "vByteFactorData":0, + "vByteFactorKey":0, + "vByteFactorBlockIssuerKey":0, + "vByteFactorStakingFeature":0, + "vByteFactorDelegation":0 + }, + "workScoreStructure":{ + "workScoreDataKibibyte":0, + "workScoreBlock":1, + "workScoreMissingParent":0, + "workScoreInput":0, + "workScoreContextInput":0, + "workScoreOutput":0, + "workScoreNativeToken":0, + "workScoreStaking":0, + "workScoreBlockIssuer":0, + "workScoreAllotment":0, + "workScoreSignatureEd25519":0, + "workScoreMinStrongParentsThreshold":0 + }, + "tokenSupply":"2779530283277761", + "genesisUnixTimestamp":"1695275822", + "slotDurationInSeconds":10, + "slotsPerEpochExponent":13, + "manaStructure":{ + "manaBitsCount":63, + "manaGenerationRate":1, + "manaGenerationRateExponent":17, + "manaDecayFactors":[10,20], + "manaDecayFactorsExponent":32, + "manaDecayFactorEpochsSum":2420916375, + "manaDecayFactorEpochsSumExponent":21 + }, + "stakingUnbondingPeriod":"10", + "validationBlocksPerSlot":10, + "punishmentEpochs":"10", + "livenessThreshold":"3", + "minCommittableAge":"10", + "maxCommittableAge":"20", + "epochNearingThreshold":"24", + "congestionControlParameters":{ + "rmcMin":"1", + "increase":"0", + "decrease":"0", + "increaseThreshold":800000, + "decreaseThreshold":500000, + "schedulerRate":100000, + "minMana":"1", + "maxBufferSize":1000, + "maxValidationBufferSize":100 + }, + "versionSignaling":{ + "windowSize":7, + "windowTargetRatio":5, + "activationOffset":7 + } +} ``` -Block ID: `0x37ea373f2c0c7b78ab87298e754931f775df985171ddad7e9e9fb64d8b5219a70e00000000000000` +Serialized bytes: +``` +[0 3 10 84 101 115 116 74 117 110 103 108 101 3 116 103 108 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 193 93 45 211 247 223 9 0 46 219 11 101 0 0 0 0 10 13 63 1 17 2 0 10 0 0 0 20 0 0 0 32 151 64 76 144 21 10 0 0 0 0 0 0 0 10 0 10 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 12 0 32 161 7 0 160 134 1 0 1 0 0 0 0 0 0 0 232 3 0 0 100 0 0 0 7 5 7] +``` +Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 06b6edf8745b49b9fdff7f1d2918f35e826361b1 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 21 Sep 2023 16:14:29 +0800 Subject: [PATCH 058/110] Update examples --- tips/TIP-0046/tip-0046.md | 221 ++++++++++++++------------------------ 1 file changed, 80 insertions(+), 141 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 563729a84..c852bd342 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -700,6 +700,16 @@ transaction will never result in the locking of the account. ## Test Vectors +The containing protocol parameter are used to calculate IDs: +``` +{ + "genesisUnixTimestamp":"1695275822", + "slotDurationInSeconds":10, + "slotsPerEpochExponent":13, +} +``` +Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` + ### Slot Commitment ID ``` @@ -788,36 +798,33 @@ Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682 ``` { "protocolVersion":3, - "networkId":"0", - "issuingTime":"1694608262748556515", - "slotCommitmentId":"0x49100d1d05557c7c204c221d5a3415570009752f7b10356d062c6d730d0568497e2c3c3d480d7d23", - "latestFinalizedSlot":"2", - "issuerId":"0x0000000000000000000000000000000000000000000000000000000000000000", - "block": { + "networkId":"10549460113735494767", + "issuingTime":"1695275834000000000", + "slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", + "latestFinalizedSlot":"21", + "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", + "block":{ "type":0, "strongParents":[ - "0x00627e507d71337c3c1647747e5a4b565f2a71480e62170e1b3f085e0e0a41321c017a4d2b3b4210", - "0x03485a0516062d003a646a40676d5c1c1e0d574822443c630a08385836101a5c33181f2314573706", - "0x4274246513610f1b044562676e125e1e11781e5a0a2b4c5d1d6e7c2b792c163e5f74393149311513", - "0x7549226845340f730244733152263e553036684748704d5f74017c3b573c1b21345e59644c286b5e" + "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", + "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" ], "weakParents":[ - "0x12731a211b5323256c2c295564532a246125681d1163585f077149137578585e75407a5a4c51485a" + "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" ], "shallowLikeParents":[ - "0x1e1f5b10094a7e01134d65325f395c2d507703172e4b740814582b5a52536c1315706727541a582b" + "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" ], "payload":{ "type":5, "tag":"0x68656c6c6f20776f726c64", "data":"0x01020304" }, - "burnedMana":"100" + "burnedMana":"180500" }, "signature":{ "type":0, - "publicKey":"0x0000000000000000000000000000000000000000000000000000000000000000", - "signature":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c","signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" } } ``` @@ -825,29 +832,32 @@ Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682 Serialized bytes: ``` -[3 0 0 0 0 0 0 0 0 227 204 145 142 60 117 132 23 73 16 13 29 5 85 124 124 32 76 34 29 90 52 21 87 0 9 117 47 123 16 53 109 6 44 109 115 13 5 104 73 126 44 60 61 72 13 125 35 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 98 126 80 125 113 51 124 60 22 71 116 126 90 75 86 95 42 113 72 14 98 23 14 27 63 8 94 14 10 65 50 28 1 122 77 43 59 66 16 3 72 90 5 22 6 45 0 58 100 106 64 103 109 92 28 30 13 87 72 34 68 60 99 10 8 56 88 54 16 26 92 51 24 31 35 20 87 55 6 66 116 36 101 19 97 15 27 4 69 98 103 110 18 94 30 17 120 30 90 10 43 76 93 29 110 124 43 121 44 22 62 95 116 57 49 73 49 21 19 117 73 34 104 69 52 15 115 2 68 115 49 82 38 62 85 48 54 104 71 72 112 77 95 116 1 124 59 87 60 27 33 52 94 89 100 76 40 107 94 1 18 115 26 33 27 83 35 37 108 44 41 85 100 83 42 36 97 37 104 29 17 99 88 95 7 113 73 19 117 120 88 94 117 64 122 90 76 81 72 90 1 30 31 91 16 9 74 126 1 19 77 101 50 95 57 92 45 80 119 3 23 46 75 116 8 20 88 43 90 82 83 108 19 21 112 103 39 84 26 88 43 24 0 0 0 5 0 - 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] +[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 24 0 0 0 5 0 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f0190100000000000000` +Block ID: `0xb2c397afa61262c10af75320a166d28be34debcc4449f272f90c8769681c0b710200000000000000` +Block ID slot index: 2 ### Basic Block ID (Transaction payload) ``` { "protocolVersion":3, - "networkId":"3650798313638353144", - "issuingTime":"1694613463455944982", - "slotCommitment":"0x5893048146ba125ea69c85a08bc122afec11baf6115ce03fc1d989df6aff2cdf1500000000000000", + "networkId":"10549460113735494767","issuingTime":"1695275834000000000","slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", "latestFinalizedSlot":"21", - "issuerId":"0x907c02e9302e0f0571f10f885594e56d8c54ff0708ab7a39bc1b74d396b93b12", + "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", "block":{ "type":0, "strongParents":[ - "0xac5668c6ba7b3471a37e4a64c6611090b67babd368e1f5b670e30fb4eadba59d1c00000000000000" + "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", + "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" + ], + "weakParents":[ + "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" + ], + "shallowLikeParents":[ + "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" ], - "weakParents":[], - "shallowLikeParents":[], "payload":{ "type":6, "essence":{ @@ -860,60 +870,61 @@ Block ID: `0xd5b4743580e968c6418b279620fa690331b51cfff28464f8d767e43fd586f019010 "type":0, "transactionId":"0x24ff9b3038506fb1b406306a496001c3e24e2be07c838317922bf21d686a078f", "transactionOutputIndex":10 - } - ], - "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", - "outputs":[ - { - "type":3, - "amount":"10000", - "mana":"0", - "unlockConditions":[ - { - "type":0, - "address":{ + } + ], + "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", + "outputs":[ + { + "type":3, + "amount":"10000", + "mana":"0", + "unlockConditions":[ + { "type":0, - "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" + "address":{ + "type":0, + "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" + } } - } - ] + ] + } + ], + "allotments":[], + "payload":{ + "type":5, + "tag":"0x1d7b3e11697264111e130b0e", + "data":"0x1d7b3e11697264111e130b0e" } - ], - "allotments":[], - "payload":{ - "type":5, - "tag":"0x1d7b3e11697264111e130b0e", - "data":"0x1d7b3e11697264111e130b0e" - } - }, - "unlocks":[ - { - "type":0, - "signature":{ + }, + "unlocks":[ + { "type":0, - "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", - "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" + "signature":{ + "type":0, + "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", + "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" + } } - } - ] + ] + }, + "burnedMana":"180500" }, - "burnedMana":"180500" - }, - "signature":{ - "type":0, - "publicKey":"0x293dc170d9a59474e6d81cfba7f7d924c09b25d7166bcfba606e53114d0a758b", - "signature":"0xf4dca05ba024867984cfd657aac7c4f782a8bf5830dcbea482f351c578ffb4db061dd30a31816e9b7ba6e7096d63ff1209f9a2a0449ac7277cae5d3ebc87310f" + "signature":{ + "type":0, + "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c", + "signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" + } } -} ``` Serialized bytes: ``` -[3 248 88 2 55 185 61 170 50 22 209 226 112 247 121 132 23 88 147 4 129 70 186 18 94 166 156 133 160 139 193 34 175 236 17 186 246 17 92 224 63 193 217 137 223 106 255 44 223 21 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 144 124 2 233 48 46 15 5 113 241 15 136 85 148 229 109 140 84 255 7 8 171 122 57 188 27 116 211 150 185 59 18 0 1 172 86 104 198 186 123 52 113 163 126 74 100 198 97 16 144 182 123 171 211 104 225 245 182 112 227 15 180 234 219 165 157 28 0 0 0 0 0 0 0 0 0 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 41 61 193 112 217 165 148 116 230 216 28 251 167 247 217 36 192 155 37 215 22 107 207 186 96 110 83 17 77 10 117 139 244 220 160 91 160 36 134 121 132 207 214 87 170 199 196 247 130 168 191 88 48 220 190 164 130 243 81 197 120 255 180 219 6 29 211 10 49 129 110 155 123 166 231 9 109 99 255 18 9 249 162 160 68 154 199 39 124 174 93 62 188 135 49 15] +[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c00000000000000` +Block ID: `0x22215ad9e912989a4886d48a7147b23b753c251861cd0ed14649a11cd85028f60200000000000000` +Block ID slot index: 2 ### Validation Block ID @@ -921,7 +932,7 @@ Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c0 { "protocolVersion":3, "networkId":"10549460113735494767", - "issuingTime":"1675563954966263210", + "issuingTime":"1695275834000000000", "slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", "latestFinalizedSlot":"0", "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", @@ -951,85 +962,13 @@ Block ID: `0xddebfd0434bfe8140c938d4124ab76e9fee7e18ca7a7be1ba7331d42868724d91c0 Serialized bytes: ``` -[3 111 44 91 123 20 54 103 146 170 117 54 30 138 204 64 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 1 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 3 246 2 31 174 101 73 117 219 46 130 193 116 68 220 141 67 87 60 180 34 47 80 111 180 107 164 106 9 124 248 200 115 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] +[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 1 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 3 246 2 31 174 101 73 117 219 46 130 193 116 68 220 141 67 87 60 180 34 47 80 111 180 107 164 106 9 124 248 200 115 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0x58861f95e72f76d31061c20408c5e176f31f111f794dd4d5e7b33ce42d4f11440000000000000000` +Block ID: `0xe7577f23f82595fcf5501d3858666e5efe2e3063d715b03e43cdd93ea69d6af60200000000000000` +Block ID slot index: 2 -The containing protocol parameter hash is calculated from the following: -``` -{ - "type":0, - "version":3, - "networkName":"TestJungle", - "bech32Hrp":"tgl", - "rentStructure":{ - "vByteCost":0, - "vByteFactorData":0, - "vByteFactorKey":0, - "vByteFactorBlockIssuerKey":0, - "vByteFactorStakingFeature":0, - "vByteFactorDelegation":0 - }, - "workScoreStructure":{ - "workScoreDataKibibyte":0, - "workScoreBlock":1, - "workScoreMissingParent":0, - "workScoreInput":0, - "workScoreContextInput":0, - "workScoreOutput":0, - "workScoreNativeToken":0, - "workScoreStaking":0, - "workScoreBlockIssuer":0, - "workScoreAllotment":0, - "workScoreSignatureEd25519":0, - "workScoreMinStrongParentsThreshold":0 - }, - "tokenSupply":"2779530283277761", - "genesisUnixTimestamp":"1695275822", - "slotDurationInSeconds":10, - "slotsPerEpochExponent":13, - "manaStructure":{ - "manaBitsCount":63, - "manaGenerationRate":1, - "manaGenerationRateExponent":17, - "manaDecayFactors":[10,20], - "manaDecayFactorsExponent":32, - "manaDecayFactorEpochsSum":2420916375, - "manaDecayFactorEpochsSumExponent":21 - }, - "stakingUnbondingPeriod":"10", - "validationBlocksPerSlot":10, - "punishmentEpochs":"10", - "livenessThreshold":"3", - "minCommittableAge":"10", - "maxCommittableAge":"20", - "epochNearingThreshold":"24", - "congestionControlParameters":{ - "rmcMin":"1", - "increase":"0", - "decrease":"0", - "increaseThreshold":800000, - "decreaseThreshold":500000, - "schedulerRate":100000, - "minMana":"1", - "maxBufferSize":1000, - "maxValidationBufferSize":100 - }, - "versionSignaling":{ - "windowSize":7, - "windowTargetRatio":5, - "activationOffset":7 - } -} -``` -Serialized bytes: -``` -[0 3 10 84 101 115 116 74 117 110 103 108 101 3 116 103 108 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 193 93 45 211 247 223 9 0 46 219 11 101 0 0 0 0 10 13 63 1 17 2 0 10 0 0 0 20 0 0 0 32 151 64 76 144 21 10 0 0 0 0 0 0 0 10 0 10 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 12 0 32 161 7 0 160 134 1 0 1 0 0 0 0 0 0 0 232 3 0 0 100 0 0 0 7 5 7] -``` - -Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From a487ba3f28f8812b19baf2f97121df355a476d29 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 21 Sep 2023 17:23:17 +0800 Subject: [PATCH 059/110] Add comment to genesisUnixTimestamp --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c852bd342..c9d6ad716 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -703,7 +703,7 @@ transaction will never result in the locking of the account. The containing protocol parameter are used to calculate IDs: ``` { - "genesisUnixTimestamp":"1695275822", + "genesisUnixTimestamp":"1695275822", // seconds "slotDurationInSeconds":10, "slotsPerEpochExponent":13, } From 29589483454f0f84aee3796f423061774b830a64 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 14:14:31 +0200 Subject: [PATCH 060/110] Use namespacing for work score parameters --- tips/TIP-0046/tip-0046.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c9d6ad716..d758cd848 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -251,7 +251,7 @@ In order for the signature to be valid all of the following conditions must hold Let the Work Score of a Signature be defined as follows. -- If the type is _Ed25519 Signature_ the work score is `Work Score Signature Ed25519`. +- If the type is _Ed25519 Signature_ the work score is `Work Score Structure::Signature Ed25519`. # Blocks @@ -517,13 +517,13 @@ specification: Let the work score of a _Basic Block_ be defined as follows. - Let `Missing Parents Score` be defined as: - - If `Strong Parents Count < Work Score Min Strong Parents Threshold`: - `Work Score Missing Parent * (Work Score Min Strong Parents Threshold - Strong Parents Count)`. + - If `Strong Parents Count < Work Score Structure::Min Strong Parents Threshold`: + `Work Score Structure::Missing Parent * (Work Score Structure::Min Strong Parents Threshold - Strong Parents Count)`. - Otherwise `0`. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - If the type is _Tagged Data_ the work score is `0`. - If the type is _Transaction_ the work score is defined in TIP-45. -- Return `Work Score Block + Missing Parents Score + Payload Score`. +- Return `Work Score Structure::Block + Missing Parents Score + Payload Score`. ## Validation Block @@ -701,6 +701,7 @@ transaction will never result in the locking of the account. ## Test Vectors The containing protocol parameter are used to calculate IDs: + ``` { "genesisUnixTimestamp":"1695275822", // seconds @@ -708,6 +709,7 @@ The containing protocol parameter are used to calculate IDs: "slotsPerEpochExponent":13, } ``` + Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` ### Slot Commitment ID @@ -835,8 +837,7 @@ Serialized bytes: [3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 24 0 0 0 5 0 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0xb2c397afa61262c10af75320a166d28be34debcc4449f272f90c8769681c0b710200000000000000` -Block ID slot index: 2 +Block ID: `0xb2c397afa61262c10af75320a166d28be34debcc4449f272f90c8769681c0b710200000000000000` Block ID slot index: 2 ### Basic Block ID (Transaction payload) @@ -923,8 +924,7 @@ Serialized bytes: [3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0x22215ad9e912989a4886d48a7147b23b753c251861cd0ed14649a11cd85028f60200000000000000` -Block ID slot index: 2 +Block ID: `0x22215ad9e912989a4886d48a7147b23b753c251861cd0ed14649a11cd85028f60200000000000000` Block ID slot index: 2 ### Validation Block ID @@ -965,9 +965,7 @@ Serialized bytes: [3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 1 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 3 246 2 31 174 101 73 117 219 46 130 193 116 68 220 141 67 87 60 180 34 47 80 111 180 107 164 106 9 124 248 200 115 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] ``` -Block ID: `0xe7577f23f82595fcf5501d3858666e5efe2e3063d715b03e43cdd93ea69d6af60200000000000000` -Block ID slot index: 2 - +Block ID: `0xe7577f23f82595fcf5501d3858666e5efe2e3063d715b03e43cdd93ea69d6af60200000000000000` Block ID slot index: 2 # Copyright From 9f271c60328bd1e32cbd5cd885d66a7f8c991dd9 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 25 Sep 2023 16:14:13 +0200 Subject: [PATCH 061/110] Rm work score protocol block, update basic block --- tips/TIP-0046/tip-0046.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d758cd848..a0d9339f0 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -330,16 +330,6 @@ The _Block Wrapper_ is serialized as follows: -### Work Score - -The work score of a block wrapper is given by: - -- Let `Block Size` be the size of the serialized block. -- Let `Size Score` be `Block Size * Data Kibibyte / 1024` -- Let `Inner Block Score` be the work score of the contained `Block`. -- Let `Signature Score` be the work score of the `Signature`. -- Return `Size Score + Inner Block Score + Signature Score`. - ## Basic Block ### Serialized Layout @@ -521,7 +511,8 @@ Let the work score of a _Basic Block_ be defined as follows. `Work Score Structure::Missing Parent * (Work Score Structure::Min Strong Parents Threshold - Strong Parents Count)`. - Otherwise `0`. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - - If the type is _Tagged Data_ the work score is `0`. + - If the type is _Tagged Data_ the work score is `Work Score Structure::DataByte * Tagged Data Size` where: + - `Tagged Data Size` is the size of the serialized _Tagged Data_. - If the type is _Transaction_ the work score is defined in TIP-45. - Return `Work Score Structure::Block + Missing Parents Score + Payload Score`. From 21fc627700928b408111145f5d010855078fc338 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 17:30:09 +0200 Subject: [PATCH 062/110] Fix sparsity typo --- tips/TIP-0047/tip-0047.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index 0384eb0f3..ff6ef32b4 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -76,7 +76,7 @@ However, in this scenario no outputs hold more IOTA coins than required for the - With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. - Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. -Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsitiy percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. +Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsity percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. ### Weights for different outputs From b89fc9b976313cbcba29d8e1a3b022d6cb8bfc3e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 3 Oct 2023 13:10:15 +0200 Subject: [PATCH 063/110] Move Signature data model to TIP-38 --- tips/TIP-0046/tip-0046.md | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index a0d9339f0..030dbfba0 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -25,7 +25,7 @@ created: 2023-05-16 - [Slot Commitment](#slot-commitment) - [Slot Commitment ID](#slot-commitment-id) - [Semantic Validation](#semantic-validation) - - [Signature](#signature) + - [Block Signature](#block-signature) - [Blocks](#blocks) - [Block Wrapper](#block-wrapper) - [Work Score](#work-score-2) @@ -201,34 +201,9 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the `Issuing Time` of the block containing the commitment. -## Signature +## Block Signature -The _Ed25519 Signature_ is supported. It is serialized as follows: - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Typeuint8 - Set to value 0 to denote an Ed25519 Signature. -
    Public KeyByteArray[32]The Ed25519 public key of the signature.
    SignatureByteArray[64]The Ed25519 signature computed according to Signature Creation.
    +The [_Ed25519 Signature_](../TIP-0038/tip-0038.md#ed25519-signature) is supported. ### Signature Creation @@ -239,7 +214,7 @@ The _Signature_ field over the block is computed as follows: - Let `Signing Input` be the concatenation of `Block Header Hash` and `Block Hash`. - Let the resulting signature be the Ed25519 signature of `Signing Input`. -**Semantic Validation** +### Semantic Validation In order for the signature to be valid all of the following conditions must hold: From cd679e11b824b21610588e0350ddf39c3193fc5c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 3 Oct 2023 13:20:15 +0200 Subject: [PATCH 064/110] Fix formula style --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 030dbfba0..c2804ac00 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -198,7 +198,7 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ### Semantic Validation - The `Index` of the commitment must be in the closed interval - `[BlockSlot-MaxCommittableAge, BlockSlot-MinCommittableAge]`, where `BlockSlot` is the slot index corresponding to the + `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`, where `Block Slot` is the slot index corresponding to the `Issuing Time` of the block containing the commitment. ## Block Signature From 37ec284cc4879f4c703a95251b5a517632a7a17e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 11:41:20 +0100 Subject: [PATCH 065/110] Update types containing a slot index --- tips/TIP-0046/tip-0046.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c2804ac00..c589fc812 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -88,7 +88,7 @@ This TIP uses Ed25519 signatures according to [RFC 8032](https://tools.ietf.org/ ## Block ID -A Block ID denotes an identifier of a block, with type `ByteArray[40]`. It is created from three separately spelled out +A Block ID denotes an identifier of a block, with type `ByteArray[36]`. It is created from three separately spelled out fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated with the following steps: @@ -113,12 +113,12 @@ work score is expressed as a `uint32` and all operations used in its calculation ## Time -Protocol time is divided into slots and epochs. And epoch consists of `2^(Slots Per Epoch Exponent)` slots and each slot -is `Slot Duration In Seconds` seconds in length. +Protocol time is divided into slots and epochs. And epoch consists of 2Slots Per Epoch Exponent +slots and each slot is `Slot Duration In Seconds` seconds in length. ### Slot Index -Each slot has a corresponding slot index, which is a `uint64`. To calculate the slot index of a timestamp, the protocol +Each slot has a corresponding slot index, which is a `uint32`. To calculate the slot index of a timestamp, the protocol parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix timestamp `Unix Timestamp` (in seconds) is calculated as follows: @@ -130,7 +130,7 @@ parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The ### Epoch Index -Each epoch has a corresponding epoch index, which is a `uint64`. To calculate the epoch index of a slot index, that is, +Each epoch has a corresponding epoch index, which is a `uint32`. To calculate the epoch index of a slot index, that is, the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch index of a slot index `Slot Index` is `Slot Index >> Slots Per Epoch Exponent`, where `>>` is the _zero-fill right-shift_ or _logical shift_ operation. @@ -154,14 +154,14 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize Index - uint64 + uint32 The slot index. Prev ID - ByteArray[40] + ByteArray[36] The slot identifier of the previous slot in the chain. @@ -184,7 +184,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize ### Slot Commitment ID -A Slot Commitment ID denotes an identifier of a slot commitment, with type `ByteArray[40]`. It is calculated with the +A Slot Commitment ID denotes an identifier of a slot commitment, with type `ByteArray[36]`. It is calculated with the following steps: - Let `Content` be the serialized slot commitment. @@ -198,8 +198,8 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ### Semantic Validation - The `Index` of the commitment must be in the closed interval - `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`, where `Block Slot` is the slot index corresponding to the - `Issuing Time` of the block containing the commitment. + `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`, where `Block Slot` is the slot index + corresponding to the `Issuing Time` of the block containing the commitment. ## Block Signature @@ -262,12 +262,12 @@ The _Block Wrapper_ is serialized as follows: Slot Commitment ID - ByteArray[40] + ByteArray[36] The identifier of the slot this block commits to. More details in the Slot Commitment ID section. Latest Finalized Slot - uint64 + uint32 The slot index of the latest finalized slot. @@ -344,7 +344,7 @@ layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the strong parent. @@ -373,7 +373,7 @@ layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the parent. @@ -399,7 +399,7 @@ layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the parent. @@ -534,7 +534,7 @@ following layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the strong parent. @@ -563,7 +563,7 @@ following layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the parent. @@ -589,7 +589,7 @@ following layout: Block ID - ByteArray[40] + ByteArray[36] The Block ID of the parent. From d9d3ecf256065352da35a47a468fd298342c00d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Tue, 17 Oct 2023 09:58:36 +0200 Subject: [PATCH 066/110] Add author --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c589fc812..eb3019560 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -2,7 +2,7 @@ tip: 46 title: Tangle Block for IOTA 2.0 description: The Block for IOTA 2.0 and validation block type -author: TODO +author: TODO, Daria Dziubałtowska (@daria305) discussions-to: TODO status: Draft type: Standards From aa334b7b5290bf4a3800182ca604a656c68aa881 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 10:53:11 +0100 Subject: [PATCH 067/110] Remove Transaction ID test vector (moved to 45) --- tips/TIP-0046/tip-0046.md | 64 +-------------------------------------- 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index eb3019560..fb9359924 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -668,7 +668,7 @@ transaction will never result in the locking of the account. The containing protocol parameter are used to calculate IDs: -``` +```json { "genesisUnixTimestamp":"1695275822", // seconds "slotDurationInSeconds":10, @@ -699,68 +699,6 @@ Serialized bytes: Slot Commitment ID: `0x3a73079f3dbf8c1744ae0b020b9767546e32f5bbbf4c6f0233da7b64f16581f80a00000000000000` -### Transaction ID - -``` -{ - "type":6, - "essence":{ - "type":2, - "networkId":"3650798313638353144", - "creationSlot":"28", - "contextInputs":[], - "inputs":[ - { - "type":0, - "transactionId":"0x24ff9b3038506fb1b406306a496001c3e24e2be07c838317922bf21d686a078f", - "transactionOutputIndex":10 - } - ], - "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", - "outputs":[ - { - "type":3, - "amount":"10000", - "mana":"0", - "unlockConditions":[ - { - "type":0, - "address":{ - "type":0, - "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" - } - } - ] - } - ], - "allotments":[], - "payload":{ - "type":5, - "tag":"0x1d7b3e11697264111e130b0e", - "data":"0x1d7b3e11697264111e130b0e" - } - }, - "unlocks":[ - { - "type":0, - "signature":{ - "type":0, - "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", - "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" - } - } - ] -} -``` - -Serialized bytes: - -``` -[6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5] -``` - -Transaction ID: `0xc4f095a7ee824c8fd53040c4143963153636d56bb2334167fd4f531472682533` - ### Basic Block ID (Tagged Data payload) ``` From b9758fcd9b3a1bd853a504697be844cc6484c255 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 11:58:49 +0100 Subject: [PATCH 068/110] Update test vectors --- tips/TIP-0046/tip-0046.md | 352 ++++++++++++++++++++++---------------- 1 file changed, 209 insertions(+), 143 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index fb9359924..d90e56dec 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -41,8 +41,7 @@ created: 2023-05-16 - [Semantic Validation](#semantic-validation-2) - [Work Score](#work-score-4) - [Rationale and alternatives](#rationale-and-alternatives) -- [Appendix](#appendix) - - [Test Vectors](#test-vectors) +- [Test Vectors](#test-vectors) - [Copyright](#copyright) # Summary @@ -662,9 +661,7 @@ operates. If `Burned Mana` is lower than it should be, the block can simply be d issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the transaction will never result in the locking of the account. -# Appendix - -## Test Vectors +# Test Vectors The containing protocol parameter are used to calculate IDs: @@ -678,198 +675,267 @@ The containing protocol parameter are used to calculate IDs: Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` -### Slot Commitment ID +## Slot Commitment ID -``` +Slot Commitment (json-encoded): + +```json { - "version":3, - "index":"10", - "previousCommitmentId":"0x4b024b3e47280d05272a7d136f0c464e4e136b734e6c427749413e286162077560652c007e37241a", - "rootsId":"0x75614402763f5f045c040334631b791b4d755d626d504b134a505c001c516549", - "cumulativeWeight":"100", - "referenceManaCost":"6000" + "protocolVersion": 3, + "slot": 18, + "previousCommitmentId": "0x5f400a6621684e7b260f353b3937113c153c387c5c2f7110463a2f1b2f1c392a581e192d", + "rootsId": "0x533543553e75065c0c115c220624400b02693c6177284b4f1b7748610c515968", + "cumulativeWeight": "89", + "referenceManaCost": "144" } ``` -Serialized bytes: +Slot Commitment (binary-encoded): ``` -[3 10 0 0 0 0 0 0 0 75 2 75 62 71 40 13 5 39 42 125 19 111 12 70 78 78 19 107 115 78 108 66 119 73 65 62 40 97 98 7 117 96 101 44 0 126 55 36 26 117 97 68 2 118 63 95 4 92 4 3 52 99 27 121 27 77 117 93 98 109 80 75 19 74 80 92 0 28 81 101 73 100 0 0 0 0 0 0 0 112 23 0 0 0 0 0 0] +0x03120000005f400a6621684e7b260f353b3937113c153c387c5c2f7110463a2f1b2f1c392a581e192d533543553e75065c0c115c220624400b02693c6177284b4f1b7748610c51596859000000000000009000000000000000 ``` -Slot Commitment ID: `0x3a73079f3dbf8c1744ae0b020b9767546e32f5bbbf4c6f0233da7b64f16581f80a00000000000000` - -### Basic Block ID (Tagged Data payload) +Slot Commitment ID: ``` +0xb4d22598e6ed4a4405c5f3199ab260ac5c718e8c63a93773fabeff155add895312000000 +``` + +## Basic Block ID (Tagged Data payload) + +Block (json-encoded): + +```json { - "protocolVersion":3, - "networkId":"10549460113735494767", - "issuingTime":"1695275834000000000", - "slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", - "latestFinalizedSlot":"21", - "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", - "block":{ - "type":0, - "strongParents":[ - "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", - "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" - ], - "weakParents":[ - "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1695275834000000000", + "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", + "latestFinalizedSlot": 0, + "issuerId": "0x7d534a464b76373157466e412a643733787626623a3a556f4333606b6471034b", + "block": { + "type": 0, + "strongParents": [ + "0x14385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e3173" ], - "shallowLikeParents":[ - "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" - ], - "payload":{ - "type":5, - "tag":"0x68656c6c6f20776f726c64", - "data":"0x01020304" + "weakParents": [], + "shallowLikeParents": [], + "payload": { + "type": 0, + "tag": "0x746167", + "data": "0x6f354e0077473c7c730974575172383d17721a013103477159793576283c31027e38703a2e1a1e3d50703c1a4e60405f6d7d5c564727012d2b1e585c083d721a533a20774a36417a6d1563291a714c4a66100a712e793428315324705a45673f276f62263b0848264a2409646c182b67565f2c6a6c543d40645108461d3e630f1a611c5a2e6433" }, - "burnedMana":"180500" + "maxBurnedMana": "100" }, - "signature":{ - "type":0, - "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c","signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" + "signature": { + "type": 0, + "publicKey": "0x1d7237456c3508712f7c5c4a471b544b43285e571b2b23631a3331164e2f1479", + "signature": "0x4f216c783a290e3e5f5e6a13226d603046376c083d0f4a4737644e311d0f234338537555582f3151361060566d371d30083d25503d03620c316a6e42205f3321" } } ``` -Serialized bytes: +Block (binary-encoded): ``` -[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 24 0 0 0 5 0 0 0 11 104 101 108 108 111 32 119 111 114 108 100 4 0 0 0 1 2 3 4 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] +0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000000000007d534a464b76373157466e412a643733787626623a3a556f4333606b6471034b000114385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e31730000900000000003746167870000006f354e0077473c7c730974575172383d17721a013103477159793576283c31027e38703a2e1a1e3d50703c1a4e60405f6d7d5c564727012d2b1e585c083d721a533a20774a36417a6d1563291a714c4a66100a712e793428315324705a45673f276f62263b0848264a2409646c182b67565f2c6a6c543d40645108461d3e630f1a611c5a2e64336400000000000000001d7237456c3508712f7c5c4a471b544b43285e571b2b23631a3331164e2f14794f216c783a290e3e5f5e6a13226d603046376c083d0f4a4737644e311d0f234338537555582f3151361060566d371d30083d25503d03620c316a6e42205f3321 ``` -Block ID: `0xb2c397afa61262c10af75320a166d28be34debcc4449f272f90c8769681c0b710200000000000000` Block ID slot index: 2 - -### Basic Block ID (Transaction payload) +Block ID: ``` +0x90854936ca5fda332065d882ebb38580d14cd8429ada34c92401051d291a180702000000 +``` + +## Basic Block ID (Transaction payload) + +Block (json-encoded): + +```json { - "protocolVersion":3, - "networkId":"10549460113735494767","issuingTime":"1695275834000000000","slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", - "latestFinalizedSlot":"21", - "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", - "block":{ - "type":0, - "strongParents":[ - "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", - "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" - ], - "weakParents":[ - "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" - ], - "shallowLikeParents":[ - "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1695275834000000000", + "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", + "latestFinalizedSlot": 0, + "issuerId": "0x554813020e6324372e4b2018284c1403321457351a620a227a2e68201d325471", + "block": { + "type": 0, + "strongParents": [ + "0x580b62530a1a4f2f6a25442448043a0d324c7579291a5c144742314c3a481e667035040e", + "0x5a29685d615d331e38684c0d1c7a2b7875243c77322048215c5c6740562c146155747479", + "0x7c602d30626b1056351c464b03672f260c50730f344b1152491451445e18653f3a515567" ], - "payload":{ - "type":6, - "essence":{ - "type":2, - "networkId":"3650798313638353144", - "creationSlot":"28", - "contextInputs":[], - "inputs":[ + "weakParents": [], + "shallowLikeParents": [], + "payload": { + "type": 1, + "transaction": { + "networkId": "14147312347886322761", + "creationSlot": 0, + "contextInputs": [], + "inputs": [ { - "type":0, - "transactionId":"0x24ff9b3038506fb1b406306a496001c3e24e2be07c838317922bf21d686a078f", - "transactionOutputIndex":10 - } - ], - "inputsCommitment":"0xb70c6f86a1ea03a59a71d73dcd07e2082bbdf0ce971faa21748348bca22fb023", - "outputs":[ - { - "type":3, - "amount":"10000", - "mana":"0", - "unlockConditions":[ - { - "type":0, - "address":{ - "type":0, - "pubKeyHash":"0xd9f84458286dc41cd34789dec566cd096cf47de991aa36a97aebfaea14128f6d" - } - } - ] - } - ], - "allotments":[], - "payload":{ - "type":5, - "tag":"0x1d7b3e11697264111e130b0e", - "data":"0x1d7b3e11697264111e130b0e" + "type": 0, + "transactionId": "0x3b27570e163e3c283e744d305a57473c51624e3e4c093865592576054025411920390b7c", + "transactionOutputIndex": 57 + }, + { + "type": 0, + "transactionId": "0x1c0c0c3e6740486b175a333c4a414b295036795b1e67045f6b405b790968750d6352770a", + "transactionOutputIndex": 114 } - }, - "unlocks":[ + ], + "allotments": [ + { + "accountID": "0x470b7b276e6c644b7b3577213c7b3874183d677831596e667702386952432e68", + "value": "8343" + } + ], + "capabilities": "", + "outputs": [ { - "type":0, - "signature":{ - "type":0, - "publicKey":"0x803361fe1effc899dca7f931d8ad07c01ba23aaa93f986adb04d4c17cf6368d8", - "signature":"0xccddbac3aaac413e0193e16da3449f30c183d0e7eaa7f303dc12ae0dbc9fb890e449a52f9056e7d952ea796fd3e5645f60d9eb98ed91cb3261720fb528d2a105" - } + "type": 0, + "amount": "5892", + "mana": "0", + "unlockConditions": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0x286a580f29774c5b7b7d0e6a7610303a277b124e6427363f1635161c753f3e53" + } + } + ], + "features": [] + }, + { + "type": 0, + "amount": "9003", + "mana": "0", + "unlockConditions": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0x7a0d271a7b347e7e614c5463683b405b357a2b0c594a22340b6a1d1a2d667a26" + } + } + ], + "features": [] } ] }, - "burnedMana":"180500" + "unlocks": [ + { + "type": 0, + "signature": { + "type": 0, + "publicKey": "0x0d2128337477155d5e48225e6c500b2538124611456c7739447031592f1d4d1d", + "signature": "0x55414109320a16182c162c1022713126396c4330505352550608266d3c5a364274525914514475730030295e0e0b1a7e6b367a236348382a6e625147512b3813" + } + }, + { + "type": 0, + "signature": { + "type": 0, + "publicKey": "0x4459093a134a3b285d3c720c4d5c415204700d0c5c09525b340905233e1a7d61", + "signature": "0x446e174632766b145020080225044d545423625d6a12440e58791f122f3b150e266c4a1429774857602b7c5d3e015313330020025833610e541d74770a047a4d" + } + } + ] }, - "signature":{ - "type":0, - "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c", - "signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" - } + "maxBurnedMana": "100" + }, + "signature": { + "type": 0, + "publicKey": "0x20306836691b10254f3e3e5e6c315b4963433152054d452d1b582f785b3b3864", + "signature": "0x5263165b422d662427447346404c7d634c49301c0505231e624b481331544f271c4f7e6c33044a06432b655c607a6e056f2e0d1a122004334258020e7d2a3d42" } +} ``` -Serialized bytes: +Block (binary-encoded): ``` -[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 0 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 31 1 0 0 6 0 0 0 2 248 88 2 55 185 61 170 50 28 0 0 0 0 0 0 0 0 0 1 0 0 36 255 155 48 56 80 111 177 180 6 48 106 73 96 1 195 226 78 43 224 124 131 131 23 146 43 242 29 104 106 7 143 10 0 183 12 111 134 161 234 3 165 154 113 215 61 205 7 226 8 43 189 240 206 151 31 170 33 116 131 72 188 162 47 176 35 1 0 3 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 217 248 68 88 40 109 196 28 211 71 137 222 197 102 205 9 108 244 125 233 145 170 54 169 122 235 250 234 20 18 143 109 0 0 0 33 0 0 0 5 0 0 0 12 29 123 62 17 105 114 100 17 30 19 11 14 12 0 0 0 29 123 62 17 105 114 100 17 30 19 11 14 1 0 0 0 128 51 97 254 30 255 200 153 220 167 249 49 216 173 7 192 27 162 58 170 147 249 134 173 176 77 76 23 207 99 104 216 204 221 186 195 170 172 65 62 1 147 225 109 163 68 159 48 193 131 208 231 234 167 243 3 220 18 174 13 188 159 184 144 228 73 165 47 144 86 231 217 82 234 121 111 211 229 100 95 96 217 235 152 237 145 203 50 97 114 15 181 40 210 161 5 20 193 2 0 0 0 0 0 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] +0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000554813020e6324372e4b2018284c1403321457351a620a227a2e68201d3254710003580b62530a1a4f2f6a25442448043a0d324c7579291a5c144742314c3a481e667035040e5a29685d615d331e38684c0d1c7a2b7875243c77322048215c5c6740562c1461557474797c602d30626b1056351c464b03672f260c50730f344b1152491451445e18653f3a5155670000c001000001490443ee9f5955c40000000000000200003b27570e163e3c283e744d305a57473c51624e3e4c093865592576054025411920390b7c3900001c0c0c3e6740486b175a333c4a414b295036795b1e67045f6b405b790968750d6352770a72000100470b7b276e6c644b7b3577213c7b3874183d677831596e667702386952432e689720000000000000000000000002000004170000000000000000000000000000010000286a580f29774c5b7b7d0e6a7610303a277b124e6427363f1635161c753f3e5300002b2300000000000000000000000000000100007a0d271a7b347e7e614c5463683b405b357a2b0c594a22340b6a1d1a2d667a2600020000000d2128337477155d5e48225e6c500b2538124611456c7739447031592f1d4d1d55414109320a16182c162c1022713126396c4330505352550608266d3c5a364274525914514475730030295e0e0b1a7e6b367a236348382a6e625147512b381300004459093a134a3b285d3c720c4d5c415204700d0c5c09525b340905233e1a7d61446e174632766b145020080225044d545423625d6a12440e58791f122f3b150e266c4a1429774857602b7c5d3e015313330020025833610e541d74770a047a4d64000000000000000020306836691b10254f3e3e5e6c315b4963433152054d452d1b582f785b3b38645263165b422d662427447346404c7d634c49301c0505231e624b481331544f271c4f7e6c33044a06432b655c607a6e056f2e0d1a122004334258020e7d2a3d42 ``` -Block ID: `0x22215ad9e912989a4886d48a7147b23b753c251861cd0ed14649a11cd85028f60200000000000000` Block ID slot index: 2 - -### Validation Block ID +Block ID: ``` +0x209b69c1c332fc3649d941847b549ed97e0d2eae6a5fa45237854affbb2c8c9302000000 +``` + +## Validation Block ID + +Block (json-encoded): + +```json { - "protocolVersion":3, - "networkId":"10549460113735494767", - "issuingTime":"1695275834000000000", - "slotCommitmentId":"0x498bf08a5ed287bc87340341ffab28706768cd3a7035ae5e33932d9a12bb30940000000000000000", - "latestFinalizedSlot":"0", - "issuerId":"0x3370746f30705b7d0b42597459714d45241e5a64761b09627c447b751c7e145c", - "block":{ - "type":1, - "strongParents":[ - "0x304442486c7a05361408585e4b5f7a67441c437528755a70041e0e557a6d4b2d7d4362083d492b57", - "0x5f736978340a243d381b343b160b316a6b7d4b1e3c0355492e2e72113c2b126600157e69113c0b5c" + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1695275834000000000", + "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", + "latestFinalizedSlot": 0, + "issuerId": "0x154a1767047449742d2063001f3105661562281d523476623c505f142b111455", + "block": { + "type": 1, + "strongParents": [ + "0x06532d24754f512011512f6b3d522e451c1f65457036383f5f7c3f297342403557411d73", + "0x085a4f1c5028673403193c2f6c630b18340e1a3a191612011418780b211c250c79204a20", + "0x0d44571c59600f553755491e2d71325e2f1c252772517b4b6d3d78452e1f7e0f663d2603", + "0x104b6d354f00073677382e553d1c78230820095a2702700b6f466a59520445176d0b1f2b", + "0x141c2d2c4e1c7d6b3c621c7852331c7d005d541c596d0c4d7c163621471d234a4a6d5075", + "0x14645b184b485f60393f2a216309490a411d17454f604d31570d77725030716019430152", + "0x1801471a315c75100068344b4f277c0f6776766d16140a6908470c432339615266363319", + "0x1a66261f7323385f326d1b47780a74561473161e496f672b233161200c112d5976745846", + "0x1b1a687a4b40184f7d26234441672d11084646452b603f767b43757d032f4f6a32721721", + "0x1b6e2a68476a303f2814222b604b4c253f0c005817215f1c5f7021263948756f4e37066c", + "0x230752313b2e5c296972110e78457c6117274a1d2f475f5e1932111115546930017c1f1b", + "0x2b03440a5e016c4d6b41060f6d3f101f423b2c256b3969755d395e2a7d266c1d7a607b54", + "0x2b2b3929396c42657b1e2a6f7925367937674567645b5318731a5b162f153a655a12542c", + "0x2c1b4023067c182533573c4f102d0230683d384b4c382c4f4b530974215065122a5c6360", + "0x300b01792b715a44625c17451c296a36165f331f282b40573f71146116632c5201410a68", + "0x304e482a4029224275364039686d70180c1a084474354c5845432663502d2e4f355c6f6a", + "0x375c75465c0e50343c483c4205504457305f65066e6c741b1b347d374b342770151f6745", + "0x3f19694a000f3247651a7b3c0c05101b5e5b3c3768581d4a0e0e20212e017a6640123950", + "0x425c6b69220e5e0f365b7d43694e7129254f223442670c771b677e2723475f0e5f154e11", + "0x4a276f4f39592c2f255c0631146e0445684c6e732d6d774045071e2d44787c497d3d5d49", + "0x4b20275230617d5377705d64671a7b6a63114f2a54106f1d016d5353734112394a465604", + "0x592e4e781b41466d556e526a5f654200351e782763452c732d2f4a7336783e27274b5e4e", + "0x607e06657a433d2e0417461c78185732567c78531b5b670226781b26526813364b72675b", + "0x62202d1d2d66522e07703d3d767a6b3a330829542b6d454b690c5a4364516c302d435625", + "0x62797960364210310a0f01223b504a1436553c44765570503514051034062e48310d6a26", + "0x70094d783979401a4b4f117372101f2f27196649382e113f4671194c27080c2b3e712d28", + "0x7371635333410a7500102e1240131a7a3b1b3a5b7131195706056907214a334f573e6906", + "0x7419161176184c42345c2722236b131d6940061373243b533e5f10712a473a2748195c15" ], - "weakParents":[ - "0x0b5a48384f382f4a49471c4860683c6f0a0d446f012e1b117c4e405f5e24497c72691f43535c0b42" - ], - "shallowLikeParents":[ - "0x163007217803006078040b0f51507d3572355a457839095e572f125500401b7d220c772b56165a12" - ], - "highestSupportedVersion":3, - "protocolParametersHash":"0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873" + "weakParents": [], + "shallowLikeParents": [], + "highestSupportedVersion": 4, + "protocolParametersHash": "0xa19d3fef401f40efc739569dbef84627db1b8af59ee3ef82f9028d00c4d77413" }, - "signature":{ - "type":0, - "publicKey":"0x024b6f086177156350111d5e56227242034e596b7e3d0901180873740723193c", - "signature":"0x7c274e5e771d5d60202d334f06773d3672484b1e4e6f03231b4e69305329267a4834374b0f2e0d5c6c2f7779620f4f534c773b1679400c52303d1f23121a4049" + "signature": { + "type": 0, + "publicKey": "0x7026712f3170262410010e037e6f454243567c7d3a4827060e617b6b0f757064", + "signature": "0x092d0c2e2374337e060819320c3a5b39686334564a560c0b007b2c041f76455677576e310e16683a367c690c2a425c3f1f3d525b201f4c7c41675b443804383c" } } ``` -Serialized bytes: +Block (binary-encoded): ``` -[3 111 44 91 123 20 54 103 146 0 196 223 153 99 212 134 23 73 139 240 138 94 210 135 188 135 52 3 65 255 171 40 112 103 104 205 58 112 53 174 94 51 147 45 154 18 187 48 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 112 116 111 48 112 91 125 11 66 89 116 89 113 77 69 36 30 90 100 118 27 9 98 124 68 123 117 28 126 20 92 1 2 48 68 66 72 108 122 5 54 20 8 88 94 75 95 122 103 68 28 67 117 40 117 90 112 4 30 14 85 122 109 75 45 125 67 98 8 61 73 43 87 95 115 105 120 52 10 36 61 56 27 52 59 22 11 49 106 107 125 75 30 60 3 85 73 46 46 114 17 60 43 18 102 0 21 126 105 17 60 11 92 1 11 90 72 56 79 56 47 74 73 71 28 72 96 104 60 111 10 13 68 111 1 46 27 17 124 78 64 95 94 36 73 124 114 105 31 67 83 92 11 66 1 22 48 7 33 120 3 0 96 120 4 11 15 81 80 125 53 114 53 90 69 120 57 9 94 87 47 18 85 0 64 27 125 34 12 119 43 86 22 90 18 3 246 2 31 174 101 73 117 219 46 130 193 116 68 220 141 67 87 60 180 34 47 80 111 180 107 164 106 9 124 248 200 115 0 2 75 111 8 97 119 21 99 80 17 29 94 86 34 114 66 3 78 89 107 126 61 9 1 24 8 115 116 7 35 25 60 124 39 78 94 119 29 93 96 32 45 51 79 6 119 61 54 114 72 75 30 78 111 3 35 27 78 105 48 83 41 38 122 72 52 55 75 15 46 13 92 108 47 119 121 98 15 79 83 76 119 59 22 121 64 12 82 48 61 31 35 18 26 64 73] +0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000154a1767047449742d2063001f3105661562281d523476623c505f142b111455011c06532d24754f512011512f6b3d522e451c1f65457036383f5f7c3f297342403557411d73085a4f1c5028673403193c2f6c630b18340e1a3a191612011418780b211c250c79204a200d44571c59600f553755491e2d71325e2f1c252772517b4b6d3d78452e1f7e0f663d2603104b6d354f00073677382e553d1c78230820095a2702700b6f466a59520445176d0b1f2b141c2d2c4e1c7d6b3c621c7852331c7d005d541c596d0c4d7c163621471d234a4a6d507514645b184b485f60393f2a216309490a411d17454f604d31570d777250307160194301521801471a315c75100068344b4f277c0f6776766d16140a6908470c4323396152663633191a66261f7323385f326d1b47780a74561473161e496f672b233161200c112d59767458461b1a687a4b40184f7d26234441672d11084646452b603f767b43757d032f4f6a327217211b6e2a68476a303f2814222b604b4c253f0c005817215f1c5f7021263948756f4e37066c230752313b2e5c296972110e78457c6117274a1d2f475f5e1932111115546930017c1f1b2b03440a5e016c4d6b41060f6d3f101f423b2c256b3969755d395e2a7d266c1d7a607b542b2b3929396c42657b1e2a6f7925367937674567645b5318731a5b162f153a655a12542c2c1b4023067c182533573c4f102d0230683d384b4c382c4f4b530974215065122a5c6360300b01792b715a44625c17451c296a36165f331f282b40573f71146116632c5201410a68304e482a4029224275364039686d70180c1a084474354c5845432663502d2e4f355c6f6a375c75465c0e50343c483c4205504457305f65066e6c741b1b347d374b342770151f67453f19694a000f3247651a7b3c0c05101b5e5b3c3768581d4a0e0e20212e017a6640123950425c6b69220e5e0f365b7d43694e7129254f223442670c771b677e2723475f0e5f154e114a276f4f39592c2f255c0631146e0445684c6e732d6d774045071e2d44787c497d3d5d494b20275230617d5377705d64671a7b6a63114f2a54106f1d016d5353734112394a465604592e4e781b41466d556e526a5f654200351e782763452c732d2f4a7336783e27274b5e4e607e06657a433d2e0417461c78185732567c78531b5b670226781b26526813364b72675b62202d1d2d66522e07703d3d767a6b3a330829542b6d454b690c5a4364516c302d43562562797960364210310a0f01223b504a1436553c44765570503514051034062e48310d6a2670094d783979401a4b4f117372101f2f27196649382e113f4671194c27080c2b3e712d287371635333410a7500102e1240131a7a3b1b3a5b7131195706056907214a334f573e69067419161176184c42345c2722236b131d6940061373243b533e5f10712a473a2748195c15000004a19d3fef401f40efc739569dbef84627db1b8af59ee3ef82f9028d00c4d77413007026712f3170262410010e037e6f454243567c7d3a4827060e617b6b0f757064092d0c2e2374337e060819320c3a5b39686334564a560c0b007b2c041f76455677576e310e16683a367c690c2a425c3f1f3d525b201f4c7c41675b443804383c ``` -Block ID: `0xe7577f23f82595fcf5501d3858666e5efe2e3063d715b03e43cdd93ea69d6af60200000000000000` Block ID slot index: 2 +Block ID: + +``` +0x566efb97c267bee5195b03c2e42bfb665f82e0535b72005f3cdbb50f3ad0da2702000000 +``` # Copyright From a1e657f2a4cd514243c1a8af75e672a62b33461c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 11:59:27 +0100 Subject: [PATCH 069/110] Add authors & fmt --- tips/TIP-0046/tip-0046.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d90e56dec..f112fde50 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -2,7 +2,9 @@ tip: 46 title: Tangle Block for IOTA 2.0 description: The Block for IOTA 2.0 and validation block type -author: TODO, Daria Dziubałtowska (@daria305) +author: + Philipp Gackstatter (@PhilippGackstatter) , Daria Dziubałtowska (@daria305) + discussions-to: TODO status: Draft type: Standards @@ -667,9 +669,9 @@ The containing protocol parameter are used to calculate IDs: ```json { - "genesisUnixTimestamp":"1695275822", // seconds - "slotDurationInSeconds":10, - "slotsPerEpochExponent":13, + "genesisUnixTimestamp": "1695275822", // seconds + "slotDurationInSeconds": 10, + "slotsPerEpochExponent": 13 } ``` @@ -716,9 +718,7 @@ Block (json-encoded): "issuerId": "0x7d534a464b76373157466e412a643733787626623a3a556f4333606b6471034b", "block": { "type": 0, - "strongParents": [ - "0x14385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e3173" - ], + "strongParents": ["0x14385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e3173"], "weakParents": [], "shallowLikeParents": [], "payload": { From 11711ef170507ce19b2e4789d8a24d3cdce87129 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 12:32:10 +0100 Subject: [PATCH 070/110] Remove outdated TIP-47 --- .../assets/microtransactions_pt3_layer1.png | Bin 151403 -> 0 bytes .../assets/microtransactions_pt3_layer2.png | Bin 135355 -> 0 bytes tips/TIP-0047/tip-0047.md | 145 ------------------ 3 files changed, 145 deletions(-) delete mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer1.png delete mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer2.png delete mode 100644 tips/TIP-0047/tip-0047.md diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer1.png b/tips/TIP-0047/assets/microtransactions_pt3_layer1.png deleted file mode 100644 index 561db0bb10b06d55b8b34ad89ce27f95c5f45c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151403 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
      0bU6`jY&V0Bfv!nW;`K!e*PYS%T;eKcRFCFJo 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 X;=Oo!w%qtV@SmEJCN@vO#P9zAY}gb> diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer2.png b/tips/TIP-0047/assets/microtransactions_pt3_layer2.png deleted file mode 100644 index 67a46901dc89a453ddbd72cf8006a417f9097760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135355 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
      @GVI=78mTm?pJw;^-E|@&`a*Z@W2#uA( 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
      B*EQRjTbEL+idRQV9=N%hbD#_oNTh1~ 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 -discussions-to: TODO -status: Draft -type: Standards -layer: Core -created: 2023-05-12 -requires: TIP-20, TIP-21, TIP-22 and TIP-38 -replaces: TIP-19 ---- - -## Summary - -This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This concept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. - -This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. - -## Motivation - -In a distributed ledger network, every participant, a so-called node, needs to keep track of the current ledger state. Since `chrysalis-pt2`, the IOTA ledger state is based on the UTXO model, where every node keeps track of all the currently unspent outputs. - -Misusage by honest users or intentionally bad behavior by malicious actors can lead to growing database and snapshot sizes and increasing computational costs (database lookups, balance calculations). Due to these increasing hardware requirements, the entry barrier to participate in the network becomes unaffordable and less nodes would operate the network. - -Especially in a fee-less system like IOTA, this is a serious issue, since an attacker can create a lot of damage with low effort. Other DLTs do not yet face this problem, as such an attack would be much more expensive due to the high transaction fees. -However, in order to solve scalability issues more and more transactions need to be handled. Therefore, other DLT projects will also eventually run into the same dust limitations. This document proposes to introduce `storage deposit` to address this. - -## Requirements - -- The maximum possible ledger database size must be limited to a reasonable and manageable size. -- The `dust protection` must not depend on a global shared state of the ledger, so that transaction validation can happen in parallel. -- The `dust protection` should work for outputs with arbitrary data and size. -- The ledger database size should be fairly allocated to users based on the scarce resource, IOTA coins. - -## Detailed Design - -A transaction validation rule is introduced which is exactly the same as the one defined in TIP-19, but stated here again for self-containment. - -Blocks including payloads, even transaction payloads, are considered to be pruned by the nodes, but unspent transaction outputs must be kept until they are spent. Therefore the `dust protection` is based on the unspent outputs only. - -**Every output created by a transaction needs to have at least a minimum amount of IOTA coins deposited in the output itself, otherwise the output is syntactically invalid.** - -min_deposit_of_output = ⌊v_byte_cost · v_byte⌋ -v_byte = ∑(weight𝑖 · byte_size𝑖) + offset - -where: -- v_byte_cost: costs in IOTA coins per virtual byte -- weight𝑖: factor of field 𝑖 that takes computational and storage costs into account -- byte_size𝑖: size of field 𝑖 in bytes -- offset: additional v_bytes that are caused by additional data that has to be stored in the database but is not part of the output itself - -| :warning: `min_deposit_of_output` is rounded down | -| ------------------------------------------------- | - -TIP-18 and its replacement TIPs introduce new output types that contain mandatory and optional fields with variable length. Each of these fields result in different computational and storage costs, which will be considered by the positive `weight_i`. The size of the field itself is expressed with `byte_size_i`. `offset` is used to take the overhead of the specific output itself into account. - -The `v_byte_cost` is a protocol value, which has to be defined based on reasonable calculations and estimates. - -**In simple words, the more data you write to the global ledger database, the more IOTA you need to deposit in the output.** -This is not a fee, because the deposited coins can be reclaimed by consuming the output in a new transaction. - -### How does it affect other parts of the protocol? - -The `dust protection` only affects "value-transactions". Since blocks containing other payloads are not stored in the ledger state and are subject to pruning, they cannot cause permanent "dust" and do not need to be considered for `dust protection`. -However, all output types like e.g. smart contract requests are affected and must comply with the `min_deposit_of_output` criteria. Therefore, these requests could get quite expensive for the user, but the same mechanism introduced for [Microtransactions on Layer 1](#Microtransactions-on-Layer-1) can be utilized for smart contract requests as well. - -### Byte cost calculations - -To limit the maximum database size, the total IOTA supply needs to be divided by the target database size in bytes to get the worst case scenario regarding the byte costs. - -However, in this scenario no outputs hold more IOTA coins than required for the `dust protection`. This does not represent the real distribution of funds over the UTXOs. We could assume that these output amounts follow Zipf's law. Unfortunately, fitting a Zipf distribution to the current ledger state will not match the future distribution of the funds for several reasons: - -- There is already another `dust protection` in place, which distorts the distribution. -- With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. -- Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. - -Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsity percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. - -### Weights for different outputs - -Output types contain several mandatory and optional fields. Every field itself creates individual computational and storage requirements for the node, which is considered by having different weights for every field. - -##### Field types - -The following table describes different field types in an output: - - - - - - - - - - - - - - - - - - - - -
      NameDescriptionWeightReasoning
      keyCreates a key lookup in the database.10.0Keys need to be stored in the LSM tree of the key-value database engine and need to be merged and leveled, which is computational-, memory- and read/write IO-wise a heavy task.
      dataPlain binary data on disk.1.0Data is stored as the value in the key-value database, and therefore only consumes disc space.
      - -TIPs that define new output types may define additional weights based on the storage and computational requirements that the affected fields induce for the node. However, the weights defined here should take precedence whenever possible and inform the newly defined weights. - -| :warning: Protocol parameters are not set yet | -| ---------------------------------------------- | - -Protocol parameters presented in this document are design parameters that will change in the future based on simulation results, benchmarking and security assumptions. The reader should not take these values as definitive. - -An example of such parameter for example is the `weight` assigned to different output field types. - -### Microtransactions - -#### Microtransactions on Layer 1 - -To enable microtransactions on Layer 1 and still satisfy the `min_deposit_of_output` requirement, a new mechanism called `conditional sending` is introduced with [TIP-38](../TIP-0038/tip-0038.md). - -![Microtransactions on Layer 1](assets/microtransactions_pt3_layer1.png) - -The preceding picture shows the process of the `conditional sending` mechanism. Alice uses the `Basic Output` ([TIP-41](../TIP-0041/tip-0041.md)) to send a microtransaction of 1 IOTA to Bob's `Address`. To fulfill the `min_deposit_of_output` requirement, the `Amount` is increased by `min_deposit_of_output` IOTA, which is 1 MIOTA in the above example. To prevent Bob from accessing these additional funds called the `storage deposit`, Alice adds the optional `Storage Deposit Return Unlock Condition` to the `Basic Output`. Now Bob can only consume the newly created output, if the unlocking transaction deposits the specified `Return Amount` IOTA coins, in this case 1 MIOTA, to the `Return Address` value defined by Alice. By consuming another UTXO and adding its amount to the received 1 IOTA, Bob takes care to create a valid output according to the dust protection rules. - -To prevent Bob from blocking access to the `storage deposit` forever, Alice specifies the additional `Expiration Unlock Condition` in the `Basic Output`. If Bob does not consume the output before the time window defined by Alice expires, Alice regains total control over the output. - -This means that there is no risk for Alice to lose the `storage deposit`, because either Bob needs to return the specified `Return Amount`, or the ownership of the created output switches back to Alice after the specified time-window has expired. - -This mechanism can also be used to transfer native tokens or on-chain requests to ISCP chains without losing control over the required `storage deposit`. - -#### Microtransactions on Layer 2 - -Another solution is to outsource microtransactions to Layer 2 applications like smart contracts. In Layer 2 there are no restrictions regarding the minimum balance of an output. - -![Microtransactions on Layer 2](assets/microtransactions_pt3_layer2.png) - -In this example, Alice sends funds to a smart contract chain on Layer 1 with an output that covers at least `min_deposit_of_output`. From this point on, Alice can send any number of off-chain requests to the smart contract chain, causing the smart contract to send microtransactions from Alice' on-chain account to Bob's on-chain account. Bob can now request his on-chain account balances to be withdrawn to his Layer 1 address. The last step can also be combined with the formerly introduced `conditional sending` mechanism, in case Bob wants to withdraw less than `min_deposit_of_output` IOTA coins or native assets. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 41743396f0a714e0fd19519a07d8898bf0766068 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 12:33:11 +0100 Subject: [PATCH 071/110] Revert changes to README and TIP-19 --- README.md | 1 - tips/TIP-0019/tip-0019.md | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index fd4f081c3..b1da09f1d 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,6 @@ more improvements. Browse the [list of TIPs](#list-of-tips) below with the _Star | 34 | [Wotsicide (Stardust update)](tips/TIP-0034/tip-0034.md) | Define migration from legacy W-OTS addresses to post-Chrysalis networks. Replaces TIP-17. | Standards | Core | Proposed | **Stardust** | | 35 | [Local Snapshot File Format (Stardust Update)](tips/TIP-0035/tip-0035.md) | File format to export/import ledger state. Replaces TIP-9. | Standards | Interface | Proposed | **Stardust** | | 37 | [Dynamic Proof-of-Work](https://github.com/iotaledger/tips/pull/81) | Dynamically adapt the PoW difficulty | Standards | Core | Draft | **Stardust** | -| 47 | [Storage Deposit Dust Protection (IOTA 2.0)](tips/TIP-0047/tip-0047.md) | Prevent bloating the ledger size with dust outputs | Standards | Core | Draft | **IOTA 2.0** | ## Need help? diff --git a/tips/TIP-0019/tip-0019.md b/tips/TIP-0019/tip-0019.md index 91dfb1058..a63145875 100644 --- a/tips/TIP-0019/tip-0019.md +++ b/tips/TIP-0019/tip-0019.md @@ -10,7 +10,6 @@ layer: Core created: 2021-11-04 requires: TIP-18, TIP-20, TIP-21 and TIP-22 replaces: TIP-15 -superseded-by: TIP-47 --- ## Summary From e3c6f96fe233c93066b0ad9e0103ade25130d2d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Wed, 18 Oct 2023 11:54:52 +0200 Subject: [PATCH 072/110] Update RMC description regarding the index --- tips/TIP-0046/tip-0046.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f112fde50..d1d56c915 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -178,7 +178,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize RMC uint64 - This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. Each new RMC value for a slot with index i is calculated upon commitment based on the RMC from slot i - 1 and the total work score of blocks in slot i. It is convenient to store the RMC in the commitment to avoid having to recalculate it from genesis when syncing. + This field provides the Reference Mana Cost (RMC) to be used for mana burnt calculations for blocks that included this commitment. Each new RMC value for a slot with index i is calculated upon commitment based on the RMC from slot i - 1 and the total work score of blocks in slot i. It is convenient to store the RMC in the commitment to avoid having to recalculate it from genesis when syncing. @@ -431,7 +431,7 @@ layout: Burned Mana uint64 - The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to the product of the block's work score and the current RMC (Reference Mana Cost) value which may be lower than the value of this field. + The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to the product of the block's work score and the current RMC (Reference Mana Cost) value which may be lower than the value of this field. RMC value needs to match value from the commitment corresponding to `CommitmentID` included in the block. From 06955844167854b2e7f26ae9074a98871f9ae4c4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 17:41:15 +0100 Subject: [PATCH 073/110] Polish block validation rules --- tips/TIP-0046/tip-0046.md | 86 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d1d56c915..9322e736a 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -178,7 +178,7 @@ A Slot Commitment contains a summary of a slot. The Slot Commitment is serialize RMC uint64 - This field provides the Reference Mana Cost (RMC) to be used for mana burnt calculations for blocks that included this commitment. Each new RMC value for a slot with index i is calculated upon commitment based on the RMC from slot i - 1 and the total work score of blocks in slot i. It is convenient to store the RMC in the commitment to avoid having to recalculate it from genesis when syncing. + This field provides the Reference Mana Cost (RMC) to be used for Mana burn calculations for blocks that included this commitment. Each new RMC value for a slot with index i is calculated upon commitment based on the RMC from slot i - 1 and the total work score of blocks in slot i. It is convenient to store the RMC in the commitment to avoid having to recalculate it from genesis when syncing. @@ -308,10 +308,9 @@ The _Block Wrapper_ is serialized as follows: ## Basic Block -### Serialized Layout +### Schema -The serialized layout of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following -layout: +The schema of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following schema: @@ -418,51 +417,49 @@ layout:
      Tagged Data Payload
      - With Payload Type 5, more details are described in Tagged Data Payload section. + With Payload Type 0, more details are described in Tagged Data Payload section.
      Transaction Payload
      - With Payload Type 6, more details are described in Transaction section. + With Payload Type 1, more details are described in Transaction section.
      - + - +
      Burned ManaMax Burned Mana uint64The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit is calculated according to the product of the block's work score and the current RMC (Reference Mana Cost) value which may be lower than the value of this field. RMC value needs to match value from the commitment corresponding to `CommitmentID` included in the block. The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit may be lower than the value of this field and is calculated according to the product of the block's work score and the RMC (Reference Mana Cost) from the block's slot commitment, identified by the Slot Commitment ID. Therefore, for the calculation of this field, the block issuer should also use the RMC value from the same commitment.
      ### Syntactic validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. The following -criteria defines whether the block passes the syntactic validation: +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. A _Basic Block_ is +syntactically valid if all of the following conditions hold: +- The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). - The total length of the serialized block must not exceed `Max Block Length`. -- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. - - It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. - - It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. - - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. +- It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. +- It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. +- It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. -- `Weak Parents` must be disjoint to the rest of the parents, no weak parent should be in either strong or shallow like - parents. -- Payload (if present): - - `Payload Type` must match one of the values described under [Payloads](#payloads). - - `Data Fields` must be correctly parsable in the context of the `Payload Type`. - - The payload itself must pass syntactic validation. +- `Weak Parents` must be disjoint from the rest of the parents: No weak parent should be in either `Strong Parents` or + `Shallow Like Parents`. - There must be no trailing bytes after all block fields have been parsed. -- If a `Block` contains a transaction payload, the block is valid only if all of the following conditions hold: +- If a _Basic Block_ contains a transaction payload, the block is valid only if all of the following conditions hold: - The Slot Index `Block Slot` corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input - resolves must be in the closed interval `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]` + resolves must be in the closed interval `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`. ### Semantic Validation +A _Basic Block_ is semantically valid if the following condition holds: + - The `Signature` must pass semantic validation. ### Payloads @@ -475,8 +472,8 @@ specification: | Payload Name | Type Value | TIP | | ------------ | ---------- | --------------------------------- | | No Payload | - | - | -| Tagged Data | 5 | [TIP-23](../TIP-0023/tip-0023.md) | -| Transaction | 7 | [TIP-45](../TIP-0045/tip-0045.md) | +| Tagged Data | 0 | [TIP-23](../TIP-0023/tip-0023.md) | +| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | ### Work Score @@ -498,10 +495,9 @@ A Validation Block is a special type of block used by validators to secure the n Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed validator throughput. It is allowed to reference more parent blocks than a normal _Basic Block_. -### Serialized Layout +### Schema -The serialized layout of a _Validation Block_ is that of a _Block Wrapper_ with the _Block_ field containing the -following layout: +The schema of a _Validation Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following schema: @@ -609,28 +605,28 @@ following layout:
      -### Syntactic validation +### Syntactic Validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. The following -criteria defines whether the block passes the syntactic validation: +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. A _Validation +Block_ is syntactically valid if all of the following conditions hold: +- The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). - The total length of the serialized block must not exceed `Max Block Length`. -- `Type` must comply with the allowed block types for the `Protocol Version` config parameter of the node. - - It must hold true that 1 ≤ `Strong Parents Count` ≤ 50. - - It must hold true that 0 ≤ `Weak Parents Count` ≤ 50. - - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 50. +- It must hold true that 1 ≤ `Strong Parents Count` ≤ 50. +- It must hold true that 0 ≤ `Weak Parents Count` ≤ 50. +- It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 50. - `Strong Parents`, `Weak Parents`, `Shallow Like Parents` must comply with the following rules: - must be lexically ordered. - must not have duplicates in each list. -- `Weak Parents` must be disjoint to the rest of the parents: No weak parent should be in either `Strong Parents` - or`Shallow Like Parents`. -- Each `Block ID` must be unique. -- `Payload Length` must be 0 and the `Payload` must not be present. -- There must be no trailing bytes after all block fields have been parsed. +- `Weak Parents` must be disjoint from the rest of the parents: No weak parent should be in either `Strong Parents` or + `Shallow Like Parents`. - `Highest Supported Version` must be greater or equal to `Protocol Version`. +- There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation +A _Validation Block_ is semantically valid if the following condition holds: + - The `Signature` must pass semantic validation. ## Work Score @@ -653,15 +649,15 @@ like allowing to reference more parents, or having specific payload types or fie **Burned Mana** -The rationale for including the `Burned Mana` field on the block is the following. For a given block, the account +The rationale for including the `Max Burned Mana` field on the block is the following. For a given block, the account identified by the `Issuer ID` field on the block needs to burn the amount of Mana corresponding to the RMC and the block size. A malicious node might provide a false, lower RMC value. If the field was not present, the required Mana would be deducted from the account's Block Issuance Credit (BIC), but the account would not allot enough Mana in the containing transaction, since it assumed a lower RMC value. This would result in a negative BIC balance and the locking of the -account. The `Burned Mana` field prevents this situation by effectively stating the assumption under which the account -operates. If `Burned Mana` is lower than it should be, the block can simply be dropped without incurring a cost for the -issuing account. Thus, as long as `Burned Mana` matches the amount allotted in the contained transaction, the -transaction will never result in the locking of the account. +account. The `Max Burned Mana` field prevents this situation by effectively stating the assumption under which the +account operates. If `Max Burned Mana` is lower than it should be, the block can simply be dropped without incurring a +cost for the issuing account. Thus, as long as `Max Burned Mana` matches the amount allotted in the contained +transaction, the transaction will never result in the locking of the account. # Test Vectors @@ -669,7 +665,7 @@ The containing protocol parameter are used to calculate IDs: ```json { - "genesisUnixTimestamp": "1695275822", // seconds + "genesisUnixTimestamp": "1695275822", "slotDurationInSeconds": 10, "slotsPerEpochExponent": 13 } From 612705a9cc4f0f43f29e35f98e09b653d23b6910 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 17:48:45 +0100 Subject: [PATCH 074/110] Remove missing parents work score penalty --- tips/TIP-0046/tip-0046.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 9322e736a..08648b923 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -479,15 +479,11 @@ specification: Let the work score of a _Basic Block_ be defined as follows. -- Let `Missing Parents Score` be defined as: - - If `Strong Parents Count < Work Score Structure::Min Strong Parents Threshold`: - `Work Score Structure::Missing Parent * (Work Score Structure::Min Strong Parents Threshold - Strong Parents Count)`. - - Otherwise `0`. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - - If the type is _Tagged Data_ the work score is `Work Score Structure::DataByte * Tagged Data Size` where: + - If the type is _Tagged Data_ the work score is `Work Score Structure::Data Byte * Tagged Data Size` where: - `Tagged Data Size` is the size of the serialized _Tagged Data_. - If the type is _Transaction_ the work score is defined in TIP-45. -- Return `Work Score Structure::Block + Missing Parents Score + Payload Score`. +- Return `Work Score Structure::Block + Payload Score`. ## Validation Block From 5a98152872c8d39e357be870c30e5d69237752be Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 24 Oct 2023 09:20:28 +0100 Subject: [PATCH 075/110] Remove manually added Table of Contents GitHub and the Wiki both auto-generate a ToC, so it's unnecessary to maintain it. --- tips/TIP-0046/tip-0046.md | 37 ++----------------------------------- 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 08648b923..3d252a697 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -1,7 +1,7 @@ --- tip: 46 -title: Tangle Block for IOTA 2.0 -description: The Block for IOTA 2.0 and validation block type +title: Tangle Blocks for IOTA 2.0 +description: Defines the Basic and Validation Block of IOTA 2.0 author: Philipp Gackstatter (@PhilippGackstatter) , Daria Dziubałtowska (@daria305) @@ -13,39 +13,6 @@ replaces: 24 created: 2023-05-16 --- -# Table of Contents - -- [Table of Contents](#table-of-contents) -- [Summary](#summary) -- [Motivation](#motivation) -- [Building Blocks](#building-blocks) - - [Block ID](#block-id) - - [Work Score](#work-score) - - [Time](#time) - - [Slot Index](#slot-index) - - [Epoch Index](#epoch-index) - - [Slot Commitment](#slot-commitment) - - [Slot Commitment ID](#slot-commitment-id) - - [Semantic Validation](#semantic-validation) - - [Block Signature](#block-signature) -- [Blocks](#blocks) - - [Block Wrapper](#block-wrapper) - - [Work Score](#work-score-2) - - [Basic Block](#basic-block) - - [Serialized Layout](#serialized-layout) - - [Syntactic validation](#syntactic-validation) - - [Semantic Validation](#semantic-validation-1) - - [Payloads](#payloads) - - [Work Score](#work-score-3) - - [Validation Block](#validation-block) - - [Serialized Layout](#serialized-layout-1) - - [Syntactic validation](#syntactic-validation-1) - - [Semantic Validation](#semantic-validation-2) - - [Work Score](#work-score-4) -- [Rationale and alternatives](#rationale-and-alternatives) -- [Test Vectors](#test-vectors) -- [Copyright](#copyright) - # Summary The Tangle is the graph data structure behind IOTA. For the Stardust upgrade an additional abstraction layer on top of From 3a94ef6f23bd565f7f6bcf0e58def584c037f485 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 24 Oct 2023 09:26:37 +0100 Subject: [PATCH 076/110] Use new Work Score Paramter name --- tips/TIP-0046/tip-0046.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 3d252a697..214b62ea5 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -50,10 +50,6 @@ Data types and subschemas used throughout this TIP are defined in [TIP-21](../TI This TIP uses the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function. -## Ed25519 Signature Scheme - -This TIP uses Ed25519 signatures according to [RFC 8032](https://tools.ietf.org/html/rfc8032). - ## Block ID A Block ID denotes an identifier of a block, with type `ByteArray[36]`. It is created from three separately spelled out @@ -76,7 +72,7 @@ The Work Score expresses the cost of an object in terms of computational require differs from the storage deposit in that it only accounts for one-off costs that the processing of a block and its payload incur, while the storage deposit accounts for recurring costs like data storage or holding block issuer keys in memory. The work score attempts to encapsulate all processing steps carried out on this object throughout its life in -the node. The calculation of the work score is done with the use of the _Work Score Structure_ protocol parameters. The +the node. The calculation of the work score is done with the use of the _Work Score Parameters_ protocol parameters. The work score is expressed as a `uint32` and all operations used in its calculation are integer arithmetic. ## Time @@ -194,7 +190,7 @@ In order for the signature to be valid all of the following conditions must hold Let the Work Score of a Signature be defined as follows. -- If the type is _Ed25519 Signature_ the work score is `Work Score Structure::Signature Ed25519`. +- If the type is _Ed25519 Signature_ the work score is `Work Score Parameters::Signature Ed25519`. # Blocks @@ -447,10 +443,10 @@ specification: Let the work score of a _Basic Block_ be defined as follows. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - - If the type is _Tagged Data_ the work score is `Work Score Structure::Data Byte * Tagged Data Size` where: + - If the type is _Tagged Data_ the work score is `Work Score Parameters::Data Byte * Tagged Data Size` where: - `Tagged Data Size` is the size of the serialized _Tagged Data_. - If the type is _Transaction_ the work score is defined in TIP-45. -- Return `Work Score Structure::Block + Payload Score`. +- Return `Work Score Parameters::Block + Payload Score`. ## Validation Block From 9d4a725461f9254e53a78f8d721188e6a45c5dab Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 13:34:43 +0100 Subject: [PATCH 077/110] Update to new block schemas --- tips/TIP-0046/tip-0046.md | 323 +++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 181 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 214b62ea5..f2194c234 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -192,78 +192,99 @@ Let the Work Score of a Signature be defined as follows. - If the type is _Ed25519 Signature_ the work score is `Work Score Parameters::Signature Ed25519`. -# Blocks +# Block -## Block Wrapper +A block consists of a header, body and a signature. The body defines the concrete flavor of a block. -The two block types introduced in this TIP share some common fields which are contained in an outer wrapper. This _Block -Wrapper_ is only introduced as a way to deduplicate the definition of those fields. It is not a standalone block type. - -All fields of a _Block Wrapper_ except for the _Block_ and _Signature_ constitute the _Block Header_. - -The _Block Wrapper_ is serialized as follows: +The schema of a block is as follows: +
      + Block +
      The block consisting of a header, body and signature.
      +
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + - + - + @@ -273,99 +294,68 @@ The _Block Wrapper_ is serialized as follows: ### Schema -The schema of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following schema: +A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Body_, which is defined as: +
      + Basic Block Body +
      The basic block body.
      +
      NameTypeDescription
      Protocol Versionuint8This field denotes what protocol rules apply to the block.
      Network IDuint64Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.
      Issuing Timeuint64The time at which the block was issued. It is a Unix timestamp in nanoseconds.
      Slot Commitment IDByteArray[36]The identifier of the slot this block commits to. More details in the Slot Commitment ID section.
      Latest Finalized Slotuint32The slot index of the latest finalized slot. + Name + + Type + + Description +
      Issuer IDByteArray[32]The identifier of the account that issued this block.Header +
      + Block Header +
      The common header fields of a block.
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Name + + Type + + Description +
      Protocol Versionuint8This field denotes what protocol rules apply to the block.
      Network IDuint64Network identifier. Usually, it will be set to the first 8 bytes of the BLAKE2b-256 hash of the concatenation of the network type and the protocol version string.
      Issuing Timeuint64The time at which the block was issued. It is a Unix timestamp in nanoseconds.
      Slot Commitment IDByteArray[36]The identifier of the slot this block commits to. More details in the Slot Commitment ID section.
      Latest Finalized Slotuint32The slot index of the latest finalized slot.
      Issuer IDByteArray[32]The identifier of the account that issued this block.
      +
      +
      Block oneOfBody oneOf
      - Basic Block -
      - A Basic Block. More details in the Basic Block section. -
      + Basic Block Body +
      The basic block body. Defined in TIP-46 (Basic Block).
      - Validation Block -
      - A Validation Block. More details in the Validation Block section. -
      + Validation Block Body +
      The validation block body. Defined in TIP-46 (Validation Block).
      Signature oneOfSignature oneOf
      Ed25519 Signature -
      - An Ed25519 Signature. More details in the Signature section. -
      +
      An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
      - - - + + + - + - + - + - + - - + - + - - + - + @@ -375,25 +365,22 @@ The schema of a _Basic Block_ is that of a _Block Wrapper_ with the _Block_ fiel - + - + - +
      NameTypeDescription + Name + + Type + + Description +
      TypeBlock Body Type uint8Set to value 0 to denote a Basic Block.Set to value 0 to denote a Basic Block Body.
      Strong Parents Count uint8The number of blocks that are strongly directly approved.The number of blocks following, which are strongly directly approved.
      Strong Parents anyOfStrong Parents anyOf
      Parent -
      - References another directly approved block. -
      - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the strong parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      Weak Parents Count uint8The number of blocks that are weakly directly approved.The number of blocks following, which are weakly directly approved.
      Weak Parents optAnyOfWeak Parents optAnyOf
      Parent -
      - References another directly approved block. -
      - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      Shallow Like Parents Count uint8The number of blocks that are directly referenced to adjust opinion.The number of blocks following, which are directly referenced to adjust opinion.
      Shallow Like Parents optAnyOfShallow Like Parents optAnyOf
      Parent - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      The length of the following payload in bytes. A length of 0 means no payload will be attached.
      Payload optOneOfPayload optOneOf
      - Tagged Data Payload -
      - With Payload Type 0, more details are described in Tagged Data Payload section. -
      + Signed Transaction +
      A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
      - Transaction Payload -
      - With Payload Type 1, more details are described in Transaction section. -
      + Tagged Data +
      Data with an optional tag. It is defined in TIP-23 (Specification) with the exception of the type value, which must be set to value 0 to be compatible with this TIP.
      +
      Max Burned ManaMax Burned Mana uint64The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit may be lower than the value of this field and is calculated according to the product of the block's work score and the RMC (Reference Mana Cost) from the block's slot commitment, identified by the Slot Commitment ID. Therefore, for the calculation of this field, the block issuer should also use the RMC value from the same commitment.The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit may be lower than the value of this field which is the product of the block's work score and the RMC (Reference Mana Cost) from the block's slot commitment, identified by the Slot Commitment ID. Therefore, for the calculation of this field, the block issuer should also use the RMC value from the same commitment.
      @@ -450,116 +437,90 @@ Let the work score of a _Basic Block_ be defined as follows. ## Validation Block -A Validation Block is a special type of block used by validators to secure the network. It is recognised by the -Congestion Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed -validator throughput. It is allowed to reference more parent blocks than a normal _Basic Block_. +A Validation Block is a type of block used by validators to secure the network. It is recognised by the Congestion +Control of the IOTA 2.0 protocol and can be issued without burning Mana within the constraints of the allowed validator +throughput. It is allowed to reference more parent blocks than a _Basic Block_. ### Schema -The schema of a _Validation Block_ is that of a _Block Wrapper_ with the _Block_ field containing the following schema: +A _Validation Block_ is the name for a _Block_ with its body set to a _Validation Block Body_, which is defined as: +
      + Validation Block Body +
      The validation block body.
      +
      - - - + + + - - + + - + - + - + - - + - + - - + - + + + + + + - + - +
      NameTypeDescription + Name + + Type + + Description +
      Type
      Block Body Type uint8Set to value 1 to denote a Validation Block.Set to value 1 to denote a Basic Block Body.
      Strong Parents Count uint8The number of blocks that are strongly directly approved.The number of blocks following, which are strongly directly approved.
      Strong Parents anyOfStrong Parents anyOf
      Parent -
      - References another directly approved block. -
      - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the strong parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      Weak Parents Count uint8The number of blocks that are weakly directly approved.The number of blocks following, which are weakly directly approved.
      Weak Parents anyOfWeak Parents optAnyOf
      Parent -
      - References another directly approved block. -
      - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      Shallow Like Parents Count uint8The number of blocks that are directly referenced to adjust opinion.The number of blocks following, which are directly referenced to adjust opinion.
      Shallow Like Parents anyOfShallow Like Parents optAnyOf
      Parent - - - - - - - - - - - -
      NameTypeDescription
      Block IDByteArray[36]The Block ID of the parent.
      +
      A reference to a block. Defined in TIP-46 (Parent).
      Payload Lengthuint32The length of the following payload in bytes. A length of 0 means no payload will be attached.
      Highest Supported Version uint8The highest supported protocol version the issuer of this block supports. TODO: Add more details.The highest supported protocol version the issuer of this block supports.
      Protocol Parameters HashByteArray[32]uint8 The hash of the protocol parameters for the Highest Supported Version.
      From 2c9c70d37f27601f7137e51e52fa680f1753bcca Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 13:40:40 +0100 Subject: [PATCH 078/110] Update Block ID & Sig calculation --- tips/TIP-0046/tip-0046.md | 46 +++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f2194c234..247a16dd6 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -50,22 +50,6 @@ Data types and subschemas used throughout this TIP are defined in [TIP-21](../TI This TIP uses the [BLAKE2b-256](https://tools.ietf.org/html/rfc7693) hash function. -## Block ID - -A Block ID denotes an identifier of a block, with type `ByteArray[36]`. It is created from three separately spelled out -fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated with the following -steps: - -- Let `Block Header Hash` be the BLAKE2b-256 hash over the serialized block header. -- Let `Block Hash` be the BLAKE2b-256 hash over the serialized content of the _Block_ field. -- Let `Serialized Signature` be the serialized _Signature_. -- Let `ID` be the BLAKE2b-256 hash of the concatenation of `Block Header Hash`, `Block Hash` and `Serialized Signature`. -- Let `Slot Index` be the slot index of the `Issuing Time` of the block. -- Let `Serialized Slot Index` be the little-endian serialized `Slot Index`. -- Let `Block ID` be the concatenation of `ID` and `Serialized Slot Index`. - -The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. - ## Work Score The Work Score expresses the cost of an object in terms of computational requirements for a node to process it. It @@ -173,9 +157,9 @@ The [_Ed25519 Signature_](../TIP-0038/tip-0038.md#ed25519-signature) is supporte The _Signature_ field over the block is computed as follows: -- Let `Block Header Hash` be the BLAKE2b-256 hash over the serialized block header. -- Let `Block Hash` be the BLAKE2b-256 hash over the serialized content of the _Block_ field. -- Let `Signing Input` be the concatenation of `Block Header Hash` and `Block Hash`. +- Let `Header Hash` be the BLAKE2b-256 hash over the serialized `Header`. +- Let `Body Hash` be the BLAKE2b-256 hash over the serialized content of the `Body` field. +- Let `Signing Input` be the concatenation of `Header Hash` and `Body Hash`. - Let the resulting signature be the Ed25519 signature of `Signing Input`. ### Semantic Validation @@ -290,6 +274,22 @@ The schema of a block is as follows: +## Block ID + +A Block ID denotes an identifier of a block, with type `ByteArray[36]`. It is created from three separately spelled out +fields due to commitment proof requirements to keep attestation proofs lightweight. It is calculated with the following +steps: + +- Let `Header Hash` be the BLAKE2b-256 hash over the serialized `Header`. +- Let `Body Hash` be the BLAKE2b-256 hash over the serialized content of the `Body` field. +- Let `Serialized Signature` be the serialized `Signature`. +- Let `ID` be the BLAKE2b-256 hash of the concatenation of `Header Hash`, `Body Hash` and `Serialized Signature`. +- Let `Slot Index` be the slot index of the `Issuing Time` of the block. +- Let `Serialized Slot Index` be the little-endian serialized `Slot Index`. +- Let `Block ID` be the concatenation of `ID` and `Serialized Slot Index`. + +The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. + ## Basic Block ### Schema @@ -557,15 +557,15 @@ The work score of a _Validation Block_ is `0`. **Block ID & Signature** -Splitting the signing input of a Block Signature into a header and block part allows for verification of an attestation -where only the header and block hash are known. In a similar way, a Block ID can be recomputed from an attestation +Splitting the signing input of a Block Signature into a header and body part allows for verification of an attestation +where only the header and body hash are known. In a similar way, a Block ID can be recomputed from an attestation without having the entire block. **Validation Block** The alternative could be to use a `Block` instead of `Validation Block` with some additional validation logic. However, -having a separate block type for validator related responsibilities is much cleaner and allows for additional changes -like allowing to reference more parents, or having specific payload types or fields in the future. +having a separate block body type for validator related responsibilities is much cleaner and allows for additional +changes like allowing to reference more parents, or having specific payload types or fields in the future. **Burned Mana** From 746da4346bbc6ebfa104aff1091db7f739105f77 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 15:00:16 +0100 Subject: [PATCH 079/110] Fix Protocol Params Hash type --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 247a16dd6..c7ea58931 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -520,7 +520,7 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio Protocol Parameters Hash - uint8 + ByteArray[32] The hash of the protocol parameters for the Highest Supported Version. From 2aae3814c208153595acc6f8acbabaa233c47af3 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 15:02:37 +0100 Subject: [PATCH 080/110] Fix Validation block body typo --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c7ea58931..578716041 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -464,7 +464,7 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio Block Body Type uint8 - Set to value 1 to denote a Basic Block Body. + Set to value 1 to denote a Validation Block Body. Strong Parents Count From 19a09544fa41c0954e27ad6ce11cabf13cb54bc0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 11:58:59 +0100 Subject: [PATCH 081/110] Remove erroneously added `Payload Length` --- tips/TIP-0046/tip-0046.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 578716041..0712eb7fd 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -508,11 +508,6 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio
    - - Payload Length - uint32 - The length of the following payload in bytes. A length of 0 means no payload will be attached. - Highest Supported Version uint8 From 4ec11fa37241d92c102793b2e3794f9cddcd42cb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 12:27:45 +0100 Subject: [PATCH 082/110] Reference TIP-53 Tagged Data instead --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 0712eb7fd..022ed8cef 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -373,7 +373,7 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Tagged Data -
    Data with an optional tag. It is defined in TIP-23 (Specification) with the exception of the type value, which must be set to value 0 to be compatible with this TIP.
    +
    Data with an optional tag. Defined in TIP-53 (Tagged Data).
    From afabbc20a95f6f8c0f794d4564063f6ce176cc98 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 10:06:45 +0100 Subject: [PATCH 083/110] Inline `Parent`s --- tips/TIP-0046/tip-0046.md | 120 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 022ed8cef..a7d7ae8d9 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -327,7 +327,25 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    @@ -341,7 +359,25 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    @@ -355,7 +391,25 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    @@ -476,7 +530,25 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    @@ -490,7 +562,25 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    @@ -504,7 +594,25 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio
    Parent -
    A reference to a block. Defined in TIP-46 (Parent).
    +
    A reference to a block.
    + + + + + + + + + + + +
    + Name + + Type + + Description +
    Block IDByteArray[36]The Block ID of the parent.
    From 7e18acf62440a3a82b512c8e0cfae6bfd8130ea8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 20 Nov 2023 12:53:07 +0100 Subject: [PATCH 084/110] Update Tagged Data description --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index a7d7ae8d9..401b229a7 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -427,7 +427,7 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Tagged Data -
    Data with an optional tag. Defined in TIP-53 (Tagged Data).
    +
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    From 97405b8fa9cfc474f58d535b0f4f665a66da06b6 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 27 Nov 2023 13:42:33 +0100 Subject: [PATCH 085/110] Update Block ID test vectors --- tips/TIP-0046/tip-0046.md | 220 +++++++++++++++++++++----------------- 1 file changed, 121 insertions(+), 99 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 401b229a7..ed153e7a6 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -711,7 +711,7 @@ Slot Commitment (json-encoded): } ``` -Slot Commitment (binary-encoded): +Slot Commitment (hex-encoded binary serialization): ``` 0x03120000005f400a6621684e7b260f353b3937113c153c387c5c2f7110463a2f1b2f1c392a581e192d533543553e75065c0c115c220624400b02693c6177284b4f1b7748610c51596859000000000000009000000000000000 @@ -729,42 +729,51 @@ Block (json-encoded): ```json { - "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1695275834000000000", - "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", - "latestFinalizedSlot": 0, - "issuerId": "0x7d534a464b76373157466e412a643733787626623a3a556f4333606b6471034b", - "block": { + "header": { + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1701088670011833888", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", + "latestFinalizedSlot": 500, + "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" + }, + "body": { "type": 0, - "strongParents": ["0x14385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e3173"], + "strongParents": [ + "0x2674252933745d134c1369621e366b0e63171c3e0b0c7b654009640b1316236469711226", + "0x382854566f5e26533c391e2e4962434d13363a037e07563c522527566d536e165d0b0371", + "0x523950126960352d2c5e35081d3f2128125f2b77502f4b1415440e3b260371216c1c645a", + "0x525e5a4d011d6359253e3e6e32717a2f0b354478154e1f4426345608234e044e5b62187c", + "0x6d1859664875241d0c6a4c55146f1d491c0a1f5a090e785c4a7b691977730e75622a5d41", + "0x742c2e2d080a42165c52732b4e48245e795e61240b7832625d1c0f037c5937191f510f07" + ], "weakParents": [], "shallowLikeParents": [], "payload": { "type": 0, "tag": "0x746167", - "data": "0x6f354e0077473c7c730974575172383d17721a013103477159793576283c31027e38703a2e1a1e3d50703c1a4e60405f6d7d5c564727012d2b1e585c083d721a533a20774a36417a6d1563291a714c4a66100a712e793428315324705a45673f276f62263b0848264a2409646c182b67565f2c6a6c543d40645108461d3e630f1a611c5a2e6433" + "data": "0x6c754128356c071e5549764a48427b" }, - "maxBurnedMana": "100" + "maxBurnedMana": "864" }, "signature": { "type": 0, - "publicKey": "0x1d7237456c3508712f7c5c4a471b544b43285e571b2b23631a3331164e2f1479", - "signature": "0x4f216c783a290e3e5f5e6a13226d603046376c083d0f4a4737644e311d0f234338537555582f3151361060566d371d30083d25503d03620c316a6e42205f3321" + "publicKey": "0xc7d2b4a2547167184522cfd5ef31ebb3fe50982430b40f869bfe1a43bf1211c8", + "signature": "0xe302f90891f71f5966878edbba0072f661c1fdc24f2afc207e20b7c9aa5ba3e2df1754f510cc6fe083a3bff1dd5c11aa6e851710e32b4db69ba2f6748e59db09" } } ``` -Block (binary-encoded): +Block (hex-encoded binary serialization): ``` -0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000000000007d534a464b76373157466e412a643733787626623a3a556f4333606b6471034b000114385d6b66073665247c4e0f17075e5a28015f61454e5b725e11686c2d6d6071382e31730000900000000003746167870000006f354e0077473c7c730974575172383d17721a013103477159793576283c31027e38703a2e1a1e3d50703c1a4e60405f6d7d5c564727012d2b1e585c083d721a533a20774a36417a6d1563291a714c4a66100a712e793428315324705a45673f276f62263b0848264a2409646c182b67565f2c6a6c543d40645108461d3e630f1a611c5a2e64336400000000000000001d7237456c3508712f7c5c4a471b544b43285e571b2b23631a3331164e2f14794f216c783a290e3e5f5e6a13226d603046376c083d0f4a4737644e311d0f234338537555582f3151361060566d371d30083d25503d03620c316a6e42205f3321 +0x030000000000000000203e7ff3217b9b173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a00062674252933745d134c1369621e366b0e63171c3e0b0c7b654009640b1316236469711226382854566f5e26533c391e2e4962434d13363a037e07563c522527566d536e165d0b0371523950126960352d2c5e35081d3f2128125f2b77502f4b1415440e3b260371216c1c645a525e5a4d011d6359253e3e6e32717a2f0b354478154e1f4426345608234e044e5b62187c6d1859664875241d0c6a4c55146f1d491c0a1f5a090e785c4a7b691977730e75622a5d41742c2e2d080a42165c52732b4e48245e795e61240b7832625d1c0f037c5937191f510f0700001800000000037461670f0000006c754128356c071e5549764a48427b600300000000000000c7d2b4a2547167184522cfd5ef31ebb3fe50982430b40f869bfe1a43bf1211c8e302f90891f71f5966878edbba0072f661c1fdc24f2afc207e20b7c9aa5ba3e2df1754f510cc6fe083a3bff1dd5c11aa6e851710e32b4db69ba2f6748e59db09 ``` Block ID: ``` -0x90854936ca5fda332065d882ebb38580d14cd8429ada34c92401051d291a180702000000 +0x87b538efe6aaebf9b26e1c5a787df73a486e3c714e83fb018f3f5cd562e9facda5de0800 ``` ## Basic Block ID (Transaction payload) @@ -773,18 +782,23 @@ Block (json-encoded): ```json { - "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1695275834000000000", - "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", - "latestFinalizedSlot": 0, - "issuerId": "0x554813020e6324372e4b2018284c1403321457351a620a227a2e68201d325471", - "block": { + "header": { + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1701088600401978103", + "slotCommitmentId": "0x01771954516b4c066163025c2671145a57041368613a434a0c445d2f1e06732f2bab32c3", + "latestFinalizedSlot": 500, + "issuerId": "0x267d4c21194e1d775a2f355f296c4c057e7e3907143a467c415d57244261311f" + }, + "body": { "type": 0, "strongParents": [ - "0x580b62530a1a4f2f6a25442448043a0d324c7579291a5c144742314c3a481e667035040e", - "0x5a29685d615d331e38684c0d1c7a2b7875243c77322048215c5c6740562c146155747479", - "0x7c602d30626b1056351c464b03672f260c50730f344b1152491451445e18653f3a515567" + "0x081446226d2158064559542c47511c344741405b58030109120552017967337522210a3e", + "0x0b2836550a6328063d21626b522c22151e1b232a5004155a727b237b6c063f5e51122e40", + "0x113e261616674f1634040b493f39146c0527670a0d5a381c1c254a2e0b5b343d19781008", + "0x1a4a01006e1b744839280411415b5a0c4e655d3927051c26782b41285003730657192262", + "0x37663d0977340229137d5b5140680766434b7b0b243c084025015d46671f3136275e6e26", + "0x4d7c4b734b5b70434a3709390415174a502c692f43723c7b360a20064b101028555c0548" ], "weakParents": [], "shallowLikeParents": [], @@ -792,57 +806,89 @@ Block (json-encoded): "type": 1, "transaction": { "networkId": "14147312347886322761", - "creationSlot": 0, - "contextInputs": [], + "creationSlot": 1048576, + "contextInputs": [ + { + "type": 1, + "commitmentId": "0x0c196b3742624d707905684465112e09592a1e290d1a547c401d6f731650504355000000" + }, + { + "type": 2, + "accountId": "0x0b35717008475819485056503a6d4a332a103037284538745c302d5f6f02300f" + }, + { + "type": 3, + "index": 0 + } + ], "inputs": [ { "type": 0, - "transactionId": "0x3b27570e163e3c283e744d305a57473c51624e3e4c093865592576054025411920390b7c", - "transactionOutputIndex": 57 + "transactionId": "0xf09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000", + "transactionOutputIndex": 0 }, { "type": 0, - "transactionId": "0x1c0c0c3e6740486b175a333c4a414b295036795b1e67045f6b405b790968750d6352770a", - "transactionOutputIndex": 114 + "transactionId": "0xd2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000", + "transactionOutputIndex": 0 } ], "allotments": [ { - "accountID": "0x470b7b276e6c644b7b3577213c7b3874183d677831596e667702386952432e68", - "value": "8343" + "accountId": "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507", + "mana": "2285" + }, + { + "accountId": "0x476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b6915", + "mana": "2189" } ], - "capabilities": "", + "capabilities": "0x01", "outputs": [ { "type": 0, - "amount": "5892", + "amount": "100000", "mana": "0", "unlockConditions": [ { "type": 0, "address": { "type": 0, - "pubKeyHash": "0x286a580f29774c5b7b7d0e6a7610303a277b124e6427363f1635161c753f3e53" + "pubKeyHash": "0x6cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f80" } } ], - "features": [] + "features": [ + { + "type": 5, + "id": "0x086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00", + "amount": "0x14be8149371263f4" + } + ] }, { - "type": 0, - "amount": "9003", - "mana": "0", + "type": 1, + "amount": "100000", + "mana": "5000", + "accountId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "foundryCounter": 0, "unlockConditions": [ { "type": 0, "address": { "type": 0, - "pubKeyHash": "0x7a0d271a7b347e7e614c5463683b405b357a2b0c594a22340b6a1d1a2d667a26" + "pubKeyHash": "0x6cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f80" } } ], - "features": [] + "features": [ + { + "type": 3, + "entries": { + "hello": "0x776f726c64" + } + } + ] } ] }, @@ -851,40 +897,36 @@ Block (json-encoded): "type": 0, "signature": { "type": 0, - "publicKey": "0x0d2128337477155d5e48225e6c500b2538124611456c7739447031592f1d4d1d", - "signature": "0x55414109320a16182c162c1022713126396c4330505352550608266d3c5a364274525914514475730030295e0e0b1a7e6b367a236348382a6e625147512b3813" + "publicKey": "0xe1274a4c7390f7d8e6cc830bf233b321a3357e633cf05d42d6af1afb22d6c09f", + "signature": "0x2573975a837005b08886be98b60c10a67ada55bbe20d813f35b53c4fb45762e3a2cde0fb4e1ab2f270075d807f29dffb813582cc03a50c1f1859c2bb4c4ad809" } }, { - "type": 0, - "signature": { - "type": 0, - "publicKey": "0x4459093a134a3b285d3c720c4d5c415204700d0c5c09525b340905233e1a7d61", - "signature": "0x446e174632766b145020080225044d545423625d6a12440e58791f122f3b150e266c4a1429774857602b7c5d3e015313330020025833610e541d74770a047a4d" - } + "type": 1, + "reference": 0 } ] }, - "maxBurnedMana": "100" + "maxBurnedMana": "119" }, "signature": { "type": 0, - "publicKey": "0x20306836691b10254f3e3e5e6c315b4963433152054d452d1b582f785b3b3864", - "signature": "0x5263165b422d662427447346404c7d634c49301c0505231e624b481331544f271c4f7e6c33044a06432b655c607a6e056f2e0d1a122004334258020e7d2a3d42" + "publicKey": "0xb63209ab6f30d38eaadc1b72ae3193bc53c5d751de7ecbd80aa4375db9068e38", + "signature": "0x4f4a6ec504fd414d3842b4dddf9ace4ceca077e826a0e37182b85df41a4c9048637baa01c9e2685d54398f3bec0fe88bf2928c6509664a7a0326b60afdd7410e" } } ``` -Block (binary-encoded): +Block (hex-encoded binary serialization): ``` -0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000554813020e6324372e4b2018284c1403321457351a620a227a2e68201d3254710003580b62530a1a4f2f6a25442448043a0d324c7579291a5c144742314c3a481e667035040e5a29685d615d331e38684c0d1c7a2b7875243c77322048215c5c6740562c1461557474797c602d30626b1056351c464b03672f260c50730f344b1152491451445e18653f3a5155670000c001000001490443ee9f5955c40000000000000200003b27570e163e3c283e744d305a57473c51624e3e4c093865592576054025411920390b7c3900001c0c0c3e6740486b175a333c4a414b295036795b1e67045f6b405b790968750d6352770a72000100470b7b276e6c644b7b3577213c7b3874183d677831596e667702386952432e689720000000000000000000000002000004170000000000000000000000000000010000286a580f29774c5b7b7d0e6a7610303a277b124e6427363f1635161c753f3e5300002b2300000000000000000000000000000100007a0d271a7b347e7e614c5463683b405b357a2b0c594a22340b6a1d1a2d667a2600020000000d2128337477155d5e48225e6c500b2538124611456c7739447031592f1d4d1d55414109320a16182c162c1022713126396c4330505352550608266d3c5a364274525914514475730030295e0e0b1a7e6b367a236348382a6e625147512b381300004459093a134a3b285d3c720c4d5c415204700d0c5c09525b340905233e1a7d61446e174632766b145020080225044d545423625d6a12440e58791f122f3b150e266c4a1429774857602b7c5d3e015313330020025833610e541d74770a047a4d64000000000000000020306836691b10254f3e3e5e6c315b4963433152054d452d1b582f785b3b38645263165b422d662427447346404c7d634c49301c0505231e624b481331544f271c4f7e6c33044a06432b655c607a6e056f2e0d1a122004334258020e7d2a3d42 +0x030000000000000000f7226dbe117b9b1701771954516b4c066163025c2671145a57041368613a434a0c445d2f1e06732f2bab32c3f4010000267d4c21194e1d775a2f355f296c4c057e7e3907143a467c415d57244261311f0006081446226d2158064559542c47511c344741405b58030109120552017967337522210a3e0b2836550a6328063d21626b522c22151e1b232a5004155a727b237b6c063f5e51122e40113e261616674f1634040b493f39146c0527670a0d5a381c1c254a2e0b5b343d197810081a4a01006e1b744839280411415b5a0c4e655d3927051c26782b4128500373065719226237663d0977340229137d5b5140680766434b7b0b243c084025015d46671f3136275e6e264d7c4b734b5b70434a3709390415174a502c692f43723c7b360a20064b101028555c054800004e02000001490443ee9f5955c4000010000300010c196b3742624d707905684465112e09592a1e290d1a547c401d6f731650504355000000020b35717008475819485056503a6d4a332a103037284538745c302d5f6f02300f030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a08601000000000000000000000000000100006cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f800105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a08601000000000088130000000000000000000000000000000000000000000000000000000000000000000000000000000000000100006cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f800103010568656c6c6f0500776f726c640002000000e1274a4c7390f7d8e6cc830bf233b321a3357e633cf05d42d6af1afb22d6c09f2573975a837005b08886be98b60c10a67ada55bbe20d813f35b53c4fb45762e3a2cde0fb4e1ab2f270075d807f29dffb813582cc03a50c1f1859c2bb4c4ad809010000770000000000000000b63209ab6f30d38eaadc1b72ae3193bc53c5d751de7ecbd80aa4375db9068e384f4a6ec504fd414d3842b4dddf9ace4ceca077e826a0e37182b85df41a4c9048637baa01c9e2685d54398f3bec0fe88bf2928c6509664a7a0326b60afdd7410e ``` Block ID: ``` -0x209b69c1c332fc3649d941847b549ed97e0d2eae6a5fa45237854affbb2c8c9302000000 +0x4ece1018c2387eb5925ac208ad4a530177335c7e0a894afae04014ddd5239eac9ede0800 ``` ## Validation Block ID @@ -893,67 +935,47 @@ Block (json-encoded): ```json { - "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1695275834000000000", - "slotCommitmentId": "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000", - "latestFinalizedSlot": 0, - "issuerId": "0x154a1767047449742d2063001f3105661562281d523476623c505f142b111455", - "block": { + "header": { + "protocolVersion": 3, + "networkId": "0", + "issuingTime": "1701088918228895564", + "slotCommitmentId": "0x74417d2341033d5d1753505e7a3d3a4c335f4d1b4c36211d0d0a6d6c704458128c80b790", + "latestFinalizedSlot": 500, + "issuerId": "0x71416c591b29526318047e053f714f18410b117e291f397105246d365d15765b" + }, + "body": { "type": 1, "strongParents": [ - "0x06532d24754f512011512f6b3d522e451c1f65457036383f5f7c3f297342403557411d73", - "0x085a4f1c5028673403193c2f6c630b18340e1a3a191612011418780b211c250c79204a20", - "0x0d44571c59600f553755491e2d71325e2f1c252772517b4b6d3d78452e1f7e0f663d2603", - "0x104b6d354f00073677382e553d1c78230820095a2702700b6f466a59520445176d0b1f2b", - "0x141c2d2c4e1c7d6b3c621c7852331c7d005d541c596d0c4d7c163621471d234a4a6d5075", - "0x14645b184b485f60393f2a216309490a411d17454f604d31570d77725030716019430152", - "0x1801471a315c75100068344b4f277c0f6776766d16140a6908470c432339615266363319", - "0x1a66261f7323385f326d1b47780a74561473161e496f672b233161200c112d5976745846", - "0x1b1a687a4b40184f7d26234441672d11084646452b603f767b43757d032f4f6a32721721", - "0x1b6e2a68476a303f2814222b604b4c253f0c005817215f1c5f7021263948756f4e37066c", - "0x230752313b2e5c296972110e78457c6117274a1d2f475f5e1932111115546930017c1f1b", - "0x2b03440a5e016c4d6b41060f6d3f101f423b2c256b3969755d395e2a7d266c1d7a607b54", - "0x2b2b3929396c42657b1e2a6f7925367937674567645b5318731a5b162f153a655a12542c", - "0x2c1b4023067c182533573c4f102d0230683d384b4c382c4f4b530974215065122a5c6360", - "0x300b01792b715a44625c17451c296a36165f331f282b40573f71146116632c5201410a68", - "0x304e482a4029224275364039686d70180c1a084474354c5845432663502d2e4f355c6f6a", - "0x375c75465c0e50343c483c4205504457305f65066e6c741b1b347d374b342770151f6745", - "0x3f19694a000f3247651a7b3c0c05101b5e5b3c3768581d4a0e0e20212e017a6640123950", - "0x425c6b69220e5e0f365b7d43694e7129254f223442670c771b677e2723475f0e5f154e11", - "0x4a276f4f39592c2f255c0631146e0445684c6e732d6d774045071e2d44787c497d3d5d49", - "0x4b20275230617d5377705d64671a7b6a63114f2a54106f1d016d5353734112394a465604", - "0x592e4e781b41466d556e526a5f654200351e782763452c732d2f4a7336783e27274b5e4e", - "0x607e06657a433d2e0417461c78185732567c78531b5b670226781b26526813364b72675b", - "0x62202d1d2d66522e07703d3d767a6b3a330829542b6d454b690c5a4364516c302d435625", - "0x62797960364210310a0f01223b504a1436553c44765570503514051034062e48310d6a26", - "0x70094d783979401a4b4f117372101f2f27196649382e113f4671194c27080c2b3e712d28", - "0x7371635333410a7500102e1240131a7a3b1b3a5b7131195706056907214a334f573e6906", - "0x7419161176184c42345c2722236b131d6940061373243b533e5f10712a473a2748195c15" + "0x17527a5e253b1f6148184d487a0a3e4b72262d57346b11145e15683e120e594b586b351a", + "0x2266702e3646573b7c2e354e5429587b04682d280d774934677a1a53085603584e454b3e", + "0x24471d2913705f70302f4c3d792639285a0a2928600b3b4376601e2a57367421050d4f65", + "0x430056600a3059133b550e24306657293170264a2a33310a405a143f071e1b563e4e4301", + "0x457512631e0f182b0515754b3a2f25254740114b73742800273d3e5f42163b1079411b2d", + "0x5d423a4f1c133d133d634221733c2106474377600647653f1e093b61244c78781f365341" ], "weakParents": [], "shallowLikeParents": [], - "highestSupportedVersion": 4, - "protocolParametersHash": "0xa19d3fef401f40efc739569dbef84627db1b8af59ee3ef82f9028d00c4d77413" + "highestSupportedVersion": 3, + "protocolParametersHash": "0x8f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b" }, "signature": { "type": 0, - "publicKey": "0x7026712f3170262410010e037e6f454243567c7d3a4827060e617b6b0f757064", - "signature": "0x092d0c2e2374337e060819320c3a5b39686334564a560c0b007b2c041f76455677576e310e16683a367c690c2a425c3f1f3d525b201f4c7c41675b443804383c" + "publicKey": "0x9b0f351551381fcc18a8dd92cf04fa0833a0d07d85b191f04f0c7adc05ba2e7c", + "signature": "0x16788f8eef82a1c3c6851dac0ed41433fadeb6bfb45ac06a0d14245fb400bb68f497ff1619ef3c94160f0aefa6b9cdad065747ec41613f2819002d4b61299504" } } ``` -Block (binary-encoded): +Block (hex-encoded binary serialization): ``` -0x03000000000000000000c4df9963d486178633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000154a1767047449742d2063001f3105661562281d523476623c505f142b111455011c06532d24754f512011512f6b3d522e451c1f65457036383f5f7c3f297342403557411d73085a4f1c5028673403193c2f6c630b18340e1a3a191612011418780b211c250c79204a200d44571c59600f553755491e2d71325e2f1c252772517b4b6d3d78452e1f7e0f663d2603104b6d354f00073677382e553d1c78230820095a2702700b6f466a59520445176d0b1f2b141c2d2c4e1c7d6b3c621c7852331c7d005d541c596d0c4d7c163621471d234a4a6d507514645b184b485f60393f2a216309490a411d17454f604d31570d777250307160194301521801471a315c75100068344b4f277c0f6776766d16140a6908470c4323396152663633191a66261f7323385f326d1b47780a74561473161e496f672b233161200c112d59767458461b1a687a4b40184f7d26234441672d11084646452b603f767b43757d032f4f6a327217211b6e2a68476a303f2814222b604b4c253f0c005817215f1c5f7021263948756f4e37066c230752313b2e5c296972110e78457c6117274a1d2f475f5e1932111115546930017c1f1b2b03440a5e016c4d6b41060f6d3f101f423b2c256b3969755d395e2a7d266c1d7a607b542b2b3929396c42657b1e2a6f7925367937674567645b5318731a5b162f153a655a12542c2c1b4023067c182533573c4f102d0230683d384b4c382c4f4b530974215065122a5c6360300b01792b715a44625c17451c296a36165f331f282b40573f71146116632c5201410a68304e482a4029224275364039686d70180c1a084474354c5845432663502d2e4f355c6f6a375c75465c0e50343c483c4205504457305f65066e6c741b1b347d374b342770151f67453f19694a000f3247651a7b3c0c05101b5e5b3c3768581d4a0e0e20212e017a6640123950425c6b69220e5e0f365b7d43694e7129254f223442670c771b677e2723475f0e5f154e114a276f4f39592c2f255c0631146e0445684c6e732d6d774045071e2d44787c497d3d5d494b20275230617d5377705d64671a7b6a63114f2a54106f1d016d5353734112394a465604592e4e781b41466d556e526a5f654200351e782763452c732d2f4a7336783e27274b5e4e607e06657a433d2e0417461c78185732567c78531b5b670226781b26526813364b72675b62202d1d2d66522e07703d3d767a6b3a330829542b6d454b690c5a4364516c302d43562562797960364210310a0f01223b504a1436553c44765570503514051034062e48310d6a2670094d783979401a4b4f117372101f2f27196649382e113f4671194c27080c2b3e712d287371635333410a7500102e1240131a7a3b1b3a5b7131195706056907214a334f573e69067419161176184c42345c2722236b131d6940061373243b533e5f10712a473a2748195c15000004a19d3fef401f40efc739569dbef84627db1b8af59ee3ef82f9028d00c4d77413007026712f3170262410010e037e6f454243567c7d3a4827060e617b6b0f757064092d0c2e2374337e060819320c3a5b39686334564a560c0b007b2c041f76455677576e310e16683a367c690c2a425c3f1f3d525b201f4c7c41675b443804383c +0x0300000000000000004c0763be5b7b9b1774417d2341033d5d1753505e7a3d3a4c335f4d1b4c36211d0d0a6d6c704458128c80b790f401000071416c591b29526318047e053f714f18410b117e291f397105246d365d15765b010617527a5e253b1f6148184d487a0a3e4b72262d57346b11145e15683e120e594b586b351a2266702e3646573b7c2e354e5429587b04682d280d774934677a1a53085603584e454b3e24471d2913705f70302f4c3d792639285a0a2928600b3b4376601e2a57367421050d4f65430056600a3059133b550e24306657293170264a2a33310a405a143f071e1b563e4e4301457512631e0f182b0515754b3a2f25254740114b73742800273d3e5f42163b1079411b2d5d423a4f1c133d133d634221733c2106474377600647653f1e093b61244c78781f3653410000038f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b009b0f351551381fcc18a8dd92cf04fa0833a0d07d85b191f04f0c7adc05ba2e7c16788f8eef82a1c3c6851dac0ed41433fadeb6bfb45ac06a0d14245fb400bb68f497ff1619ef3c94160f0aefa6b9cdad065747ec41613f2819002d4b61299504 ``` Block ID: ``` -0x566efb97c267bee5195b03c2e42bfb665f82e0535b72005f3cdbb50f3ad0da2702000000 +0xa9f315b22f7a73e47becabb543fa0b295d912955e996f999f946fadb9bcf8683bede0800 ``` # Copyright From 65a3cc54f00a1f8bdc8db8ed96040df45c96e08e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 29 Nov 2023 15:57:22 +0100 Subject: [PATCH 086/110] Add Genesis Slot to timestamp-slot conversion --- tips/TIP-0046/tip-0046.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ed153e7a6..f563e8b18 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -67,14 +67,14 @@ slots and each slot is `Slot Duration In Seconds` seconds in length. ### Slot Index Each slot has a corresponding slot index, which is a `uint32`. To calculate the slot index of a timestamp, the protocol -parameters `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix timestamp -`Unix Timestamp` (in seconds) is calculated as follows: +parameters `Genesis Slot`, `Genesis Unix Timestamp` and `Slot Duration In Seconds` are used. The slot index of a Unix +timestamp `Unix Timestamp` (in seconds) is calculated as follows: - Compute `Elapsed Time` as `Unix Timestamp - Genesis Unix Timestamp`. -- If `Elapsed Time < 0`, the slot index is `0`. -- Otherwise the slot index is `Elapsed Time/Slot Duration In Seconds + 1`. - - Note: The `+ 1` is required because slots are counted starting from `1` with `0` being reserved for times before the - genesis, which has to be addressable as its own slot. +- If `Elapsed Time < 0`, the slot index is `Genesis Slot`. +- Otherwise the slot index is `Genesis Slot + Elapsed Time/Slot Duration In Seconds + 1`. + - Note: The `+ 1` is required because slots are counted starting from `1`. `0` is reserved for times before the + genesis (if `Genesis Slot = 0`), which has to be addressable as its own slot. ### Epoch Index From f0a11df6f48823f4b2fa8449ca64811ab5f655e4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 30 Nov 2023 13:52:44 +0100 Subject: [PATCH 087/110] Add Candidacy Announcement Payload --- tips/TIP-0046/tip-0046.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f563e8b18..1171161a2 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -429,6 +429,10 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo Tagged Data
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    +
    + Candidacy Announcement +
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    +
    From 427010b585d83d404b4bba384dc07f8770b9fcd4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 11 Dec 2023 13:16:01 +0100 Subject: [PATCH 088/110] Use testnet parameters for test vectors --- tips/TIP-0046/tip-0046.md | 98 +++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 1171161a2..7a4445911 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -735,8 +735,8 @@ Block (json-encoded): { "header": { "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1701088670011833888", + "networkId": "8342982141227064571", + "issuingTime": "1702296928622173761", "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" @@ -744,12 +744,12 @@ Block (json-encoded): "body": { "type": 0, "strongParents": [ - "0x2674252933745d134c1369621e366b0e63171c3e0b0c7b654009640b1316236469711226", - "0x382854566f5e26533c391e2e4962434d13363a037e07563c522527566d536e165d0b0371", - "0x523950126960352d2c5e35081d3f2128125f2b77502f4b1415440e3b260371216c1c645a", - "0x525e5a4d011d6359253e3e6e32717a2f0b354478154e1f4426345608234e044e5b62187c", - "0x6d1859664875241d0c6a4c55146f1d491c0a1f5a090e785c4a7b691977730e75622a5d41", - "0x742c2e2d080a42165c52732b4e48245e795e61240b7832625d1c0f037c5937191f510f07" + "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a", + "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948", + "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce", + "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936", + "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", + "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "weakParents": [], "shallowLikeParents": [], @@ -762,8 +762,8 @@ Block (json-encoded): }, "signature": { "type": 0, - "publicKey": "0xc7d2b4a2547167184522cfd5ef31ebb3fe50982430b40f869bfe1a43bf1211c8", - "signature": "0xe302f90891f71f5966878edbba0072f661c1fdc24f2afc207e20b7c9aa5ba3e2df1754f510cc6fe083a3bff1dd5c11aa6e851710e32b4db69ba2f6748e59db09" + "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", + "signature": "0xc5a08bedb7c3b828bb700e74256b23ff423150ad62774aa9a373ea219d63438fd736992f73de9afc2c7724e72297c0f7ae6a1e031979fc994b895431b62aa70e" } } ``` @@ -771,13 +771,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x030000000000000000203e7ff3217b9b173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a00062674252933745d134c1369621e366b0e63171c3e0b0c7b654009640b1316236469711226382854566f5e26533c391e2e4962434d13363a037e07563c522527566d536e165d0b0371523950126960352d2c5e35081d3f2128125f2b77502f4b1415440e3b260371216c1c645a525e5a4d011d6359253e3e6e32717a2f0b354478154e1f4426345608234e044e5b62187c6d1859664875241d0c6a4c55146f1d491c0a1f5a090e785c4a7b691977730e75622a5d41742c2e2d080a42165c52732b4e48245e795e61240b7832625d1c0f037c5937191f510f0700001800000000037461670f0000006c754128356c071e5549764a48427b600300000000000000c7d2b4a2547167184522cfd5ef31ebb3fe50982430b40f869bfe1a43bf1211c8e302f90891f71f5966878edbba0072f661c1fdc24f2afc207e20b7c9aa5ba3e2df1754f510cc6fe083a3bff1dd5c11aa6e851710e32b4db69ba2f6748e59db09 +0x03fb5c44ef0d3ac873415ec39409c69f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acc5a08bedb7c3b828bb700e74256b23ff423150ad62774aa9a373ea219d63438fd736992f73de9afc2c7724e72297c0f7ae6a1e031979fc994b895431b62aa70e ``` Block ID: ``` -0x87b538efe6aaebf9b26e1c5a787df73a486e3c714e83fb018f3f5cd562e9facda5de0800 +0xf52472e4df8e3526326592f9aeacb15689d9421d6f0ab261cf000b19e085d10a01000000 ``` ## Basic Block ID (Transaction payload) @@ -788,37 +788,37 @@ Block (json-encoded): { "header": { "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1701088600401978103", - "slotCommitmentId": "0x01771954516b4c066163025c2671145a57041368613a434a0c445d2f1e06732f2bab32c3", + "networkId": "8342982141227064571", + "issuingTime": "1702296814123999060", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, - "issuerId": "0x267d4c21194e1d775a2f355f296c4c057e7e3907143a467c415d57244261311f" + "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, "body": { "type": 0, "strongParents": [ - "0x081446226d2158064559542c47511c344741405b58030109120552017967337522210a3e", - "0x0b2836550a6328063d21626b522c22151e1b232a5004155a727b237b6c063f5e51122e40", - "0x113e261616674f1634040b493f39146c0527670a0d5a381c1c254a2e0b5b343d19781008", - "0x1a4a01006e1b744839280411415b5a0c4e655d3927051c26782b41285003730657192262", - "0x37663d0977340229137d5b5140680766434b7b0b243c084025015d46671f3136275e6e26", - "0x4d7c4b734b5b70434a3709390415174a502c692f43723c7b360a20064b101028555c0548" + "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a", + "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948", + "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce", + "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936", + "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", + "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "weakParents": [], "shallowLikeParents": [], "payload": { "type": 1, "transaction": { - "networkId": "14147312347886322761", + "networkId": "8342982141227064571", "creationSlot": 1048576, "contextInputs": [ { "type": 1, - "commitmentId": "0x0c196b3742624d707905684465112e09592a1e290d1a547c401d6f731650504355000000" + "commitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" }, { "type": 2, - "accountId": "0x0b35717008475819485056503a6d4a332a103037284538745c302d5f6f02300f" + "accountId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, { "type": 3, @@ -858,7 +858,7 @@ Block (json-encoded): "type": 0, "address": { "type": 0, - "pubKeyHash": "0x6cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f80" + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" } } ], @@ -881,7 +881,7 @@ Block (json-encoded): "type": 0, "address": { "type": 0, - "pubKeyHash": "0x6cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f80" + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" } } ], @@ -901,8 +901,8 @@ Block (json-encoded): "type": 0, "signature": { "type": 0, - "publicKey": "0xe1274a4c7390f7d8e6cc830bf233b321a3357e633cf05d42d6af1afb22d6c09f", - "signature": "0x2573975a837005b08886be98b60c10a67ada55bbe20d813f35b53c4fb45762e3a2cde0fb4e1ab2f270075d807f29dffb813582cc03a50c1f1859c2bb4c4ad809" + "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", + "signature": "0x328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab402" } }, { @@ -911,12 +911,12 @@ Block (json-encoded): } ] }, - "maxBurnedMana": "119" + "maxBurnedMana": "864" }, "signature": { "type": 0, - "publicKey": "0xb63209ab6f30d38eaadc1b72ae3193bc53c5d751de7ecbd80aa4375db9068e38", - "signature": "0x4f4a6ec504fd414d3842b4dddf9ace4ceca077e826a0e37182b85df41a4c9048637baa01c9e2685d54398f3bec0fe88bf2928c6509664a7a0326b60afdd7410e" + "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", + "signature": "0x3c4187eee8bf6b324b119132b58d164f01da0b91a115d93540ee71c59fb29dec946b2d83db5820ef08d63b3fc80d63667b6fd319f215d7e637833644b05d310a" } } ``` @@ -924,13 +924,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x030000000000000000f7226dbe117b9b1701771954516b4c066163025c2671145a57041368613a434a0c445d2f1e06732f2bab32c3f4010000267d4c21194e1d775a2f355f296c4c057e7e3907143a467c415d57244261311f0006081446226d2158064559542c47511c344741405b58030109120552017967337522210a3e0b2836550a6328063d21626b522c22151e1b232a5004155a727b237b6c063f5e51122e40113e261616674f1634040b493f39146c0527670a0d5a381c1c254a2e0b5b343d197810081a4a01006e1b744839280411415b5a0c4e655d3927051c26782b4128500373065719226237663d0977340229137d5b5140680766434b7b0b243c084025015d46671f3136275e6e264d7c4b734b5b70434a3709390415174a502c692f43723c7b360a20064b101028555c054800004e02000001490443ee9f5955c4000010000300010c196b3742624d707905684465112e09592a1e290d1a547c401d6f731650504355000000020b35717008475819485056503a6d4a332a103037284538745c302d5f6f02300f030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a08601000000000000000000000000000100006cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f800105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a08601000000000088130000000000000000000000000000000000000000000000000000000000000000000000000000000000000100006cec8d9549441d06f3ab2de30f7c0c6cb67c86de30d427eb5a756ef37f702f800103010568656c6c6f0500776f726c640002000000e1274a4c7390f7d8e6cc830bf233b321a3357e633cf05d42d6af1afb22d6c09f2573975a837005b08886be98b60c10a67ada55bbe20d813f35b53c4fb45762e3a2cde0fb4e1ab2f270075d807f29dffb813582cc03a50c1f1859c2bb4c4ad809010000770000000000000000b63209ab6f30d38eaadc1b72ae3193bc53c5d751de7ecbd80aa4375db9068e384f4a6ec504fd414d3842b4dddf9ace4ceca077e826a0e37182b85df41a4c9048637baa01c9e2685d54398f3bec0fe88bf2928c6509664a7a0326b60afdd7410e +0x03fb5c44ef0d3ac87354df23eceec59f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300013a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0217432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab4020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac3c4187eee8bf6b324b119132b58d164f01da0b91a115d93540ee71c59fb29dec946b2d83db5820ef08d63b3fc80d63667b6fd319f215d7e637833644b05d310a ``` Block ID: ``` -0x4ece1018c2387eb5925ac208ad4a530177335c7e0a894afae04014ddd5239eac9ede0800 +0x87759b3c31d5f20f6988cc23560d5ed487abe326a697ed5dd801fa27123836b901000000 ``` ## Validation Block ID @@ -941,31 +941,31 @@ Block (json-encoded): { "header": { "protocolVersion": 3, - "networkId": "0", - "issuingTime": "1701088918228895564", - "slotCommitmentId": "0x74417d2341033d5d1753505e7a3d3a4c335f4d1b4c36211d0d0a6d6c704458128c80b790", + "networkId": "8342982141227064571", + "issuingTime": "1702296902730775289", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, - "issuerId": "0x71416c591b29526318047e053f714f18410b117e291f397105246d365d15765b" + "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, "body": { "type": 1, "strongParents": [ - "0x17527a5e253b1f6148184d487a0a3e4b72262d57346b11145e15683e120e594b586b351a", - "0x2266702e3646573b7c2e354e5429587b04682d280d774934677a1a53085603584e454b3e", - "0x24471d2913705f70302f4c3d792639285a0a2928600b3b4376601e2a57367421050d4f65", - "0x430056600a3059133b550e24306657293170264a2a33310a405a143f071e1b563e4e4301", - "0x457512631e0f182b0515754b3a2f25254740114b73742800273d3e5f42163b1079411b2d", - "0x5d423a4f1c133d133d634221733c2106474377600647653f1e093b61244c78781f365341" + "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a", + "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948", + "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce", + "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936", + "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", + "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "weakParents": [], "shallowLikeParents": [], "highestSupportedVersion": 3, - "protocolParametersHash": "0x8f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b" + "protocolParametersHash": "0x19ad3c9790609d755a14bc5b11e21e7255e991f7afc750c18f573b972c0e10a6" }, "signature": { "type": 0, - "publicKey": "0x9b0f351551381fcc18a8dd92cf04fa0833a0d07d85b191f04f0c7adc05ba2e7c", - "signature": "0x16788f8eef82a1c3c6851dac0ed41433fadeb6bfb45ac06a0d14245fb400bb68f497ff1619ef3c94160f0aefa6b9cdad065747ec41613f2819002d4b61299504" + "publicKey": "0xeeb2c7adb0ff4872396f256219f9698d44c182b73369d9b69a0171a463334228", + "signature": "0x68f7ea9a65587bc45fa5fd9275c9e328003fc69fe82626f072cdb1d67e354c951856bbd7d3c5e7233e88282c6909b4653b121246d7921e26eb59257fa0ed5a00" } } ``` @@ -973,13 +973,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x0300000000000000004c0763be5b7b9b1774417d2341033d5d1753505e7a3d3a4c335f4d1b4c36211d0d0a6d6c704458128c80b790f401000071416c591b29526318047e053f714f18410b117e291f397105246d365d15765b010617527a5e253b1f6148184d487a0a3e4b72262d57346b11145e15683e120e594b586b351a2266702e3646573b7c2e354e5429587b04682d280d774934677a1a53085603584e454b3e24471d2913705f70302f4c3d792639285a0a2928600b3b4376601e2a57367421050d4f65430056600a3059133b550e24306657293170264a2a33310a405a143f071e1b563e4e4301457512631e0f182b0515754b3a2f25254740114b73742800273d3e5f42163b1079411b2d5d423a4f1c133d133d634221733c2106474377600647653f1e093b61244c78781f3653410000038f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b009b0f351551381fcc18a8dd92cf04fa0833a0d07d85b191f04f0c7adc05ba2e7c16788f8eef82a1c3c6851dac0ed41433fadeb6bfb45ac06a0d14245fb400bb68f497ff1619ef3c94160f0aefa6b9cdad065747ec41613f2819002d4b61299504 +0x03fb5c44ef0d3ac873f9fa838d03c69f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000319ad3c9790609d755a14bc5b11e21e7255e991f7afc750c18f573b972c0e10a600eeb2c7adb0ff4872396f256219f9698d44c182b73369d9b69a0171a46333422868f7ea9a65587bc45fa5fd9275c9e328003fc69fe82626f072cdb1d67e354c951856bbd7d3c5e7233e88282c6909b4653b121246d7921e26eb59257fa0ed5a00 ``` Block ID: ``` -0xa9f315b22f7a73e47becabb543fa0b295d912955e996f999f946fadb9bcf8683bede0800 +0x60be578c68cb16712c7bbd1c7722568aa05af1e77f4a6d545775293ed02a020c01000000 ``` # Copyright From cad51e1fe171cdf666f7cc4770e12c912abe2e01 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 13 Dec 2023 15:42:02 +0100 Subject: [PATCH 089/110] Make test vectors consistent with TIP-49 example --- tips/TIP-0046/tip-0046.md | 41 +++++++++++++++------------------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7a4445911..a47f0810c 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -688,17 +688,8 @@ transaction, the transaction will never result in the locking of the account. # Test Vectors -The containing protocol parameter are used to calculate IDs: - -```json -{ - "genesisUnixTimestamp": "1695275822", - "slotDurationInSeconds": 10, - "slotsPerEpochExponent": 13 -} -``` - -Protocol parameters hash: `0xf6021fae654975db2e82c17444dc8d43573cb4222f506fb46ba46a097cf8c873` +The protocol parameters used in the following test vectors are the same as in +[TIP-49](../TIP-0049/tip-0049.md#protocol-parameters-hash). ## Slot Commitment ID @@ -736,7 +727,7 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1702296928622173761", + "issuingTime": "1695275852000000000", "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" @@ -763,7 +754,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xc5a08bedb7c3b828bb700e74256b23ff423150ad62774aa9a373ea219d63438fd736992f73de9afc2c7724e72297c0f7ae6a1e031979fc994b895431b62aa70e" + "signature": "0xc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d" } } ``` @@ -771,13 +762,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac873415ec39409c69f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acc5a08bedb7c3b828bb700e74256b23ff423150ad62774aa9a373ea219d63438fd736992f73de9afc2c7724e72297c0f7ae6a1e031979fc994b895431b62aa70e +0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d ``` Block ID: ``` -0xf52472e4df8e3526326592f9aeacb15689d9421d6f0ab261cf000b19e085d10a01000000 +0x1d5f495c0f4b883cf2c79cafd382c73484c65651099329e3b0b4c969c35d620004000000 ``` ## Basic Block ID (Transaction payload) @@ -789,7 +780,7 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1702296814123999060", + "issuingTime": "1695275852000000000", "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" @@ -916,7 +907,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x3c4187eee8bf6b324b119132b58d164f01da0b91a115d93540ee71c59fb29dec946b2d83db5820ef08d63b3fc80d63667b6fd319f215d7e637833644b05d310a" + "signature": "0x95830802c10334d917b9b9c82a5144754b4e7955667acd3ce8e502877ff716c5e45bfddf4aa6b83c0432538e317c732edbba8f047919418bbb50a54fbe45810b" } } ``` @@ -924,13 +915,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87354df23eceec59f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300013a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0217432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab4020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac3c4187eee8bf6b324b119132b58d164f01da0b91a115d93540ee71c59fb29dec946b2d83db5820ef08d63b3fc80d63667b6fd319f215d7e637833644b05d310a +0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300013a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0217432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab4020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac95830802c10334d917b9b9c82a5144754b4e7955667acd3ce8e502877ff716c5e45bfddf4aa6b83c0432538e317c732edbba8f047919418bbb50a54fbe45810b ``` Block ID: ``` -0x87759b3c31d5f20f6988cc23560d5ed487abe326a697ed5dd801fa27123836b901000000 +0xedcd454ff664cb13cdebc46fb41f86b072e97f4f545e0989892736e38cf3c3b904000000 ``` ## Validation Block ID @@ -942,7 +933,7 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1702296902730775289", + "issuingTime": "1695275852000000000", "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", "latestFinalizedSlot": 500, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" @@ -960,12 +951,12 @@ Block (json-encoded): "weakParents": [], "shallowLikeParents": [], "highestSupportedVersion": 3, - "protocolParametersHash": "0x19ad3c9790609d755a14bc5b11e21e7255e991f7afc750c18f573b972c0e10a6" + "protocolParametersHash": "0xf07f73636669d9cb4be9faf017b3bfa16101d22ce2989010ca8409f2ea1665b2" }, "signature": { "type": 0, - "publicKey": "0xeeb2c7adb0ff4872396f256219f9698d44c182b73369d9b69a0171a463334228", - "signature": "0x68f7ea9a65587bc45fa5fd9275c9e328003fc69fe82626f072cdb1d67e354c951856bbd7d3c5e7233e88282c6909b4653b121246d7921e26eb59257fa0ed5a00" + "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", + "signature": "0xcf8e6fcd642e20ae68cf6a38d664d84b0e3594ac417c8efe0b08793716f33d59b4be5390524ba19a8b45601b871f4609ba7bca4327c9a74e34e58f8350d10808" } } ``` @@ -973,13 +964,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac873f9fa838d03c69f173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000319ad3c9790609d755a14bc5b11e21e7255e991f7afc750c18f573b972c0e10a600eeb2c7adb0ff4872396f256219f9698d44c182b73369d9b69a0171a46333422868f7ea9a65587bc45fa5fd9275c9e328003fc69fe82626f072cdb1d67e354c951856bbd7d3c5e7233e88282c6909b4653b121246d7921e26eb59257fa0ed5a00 +0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503000003f07f73636669d9cb4be9faf017b3bfa16101d22ce2989010ca8409f2ea1665b2002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257accf8e6fcd642e20ae68cf6a38d664d84b0e3594ac417c8efe0b08793716f33d59b4be5390524ba19a8b45601b871f4609ba7bca4327c9a74e34e58f8350d10808 ``` Block ID: ``` -0x60be578c68cb16712c7bbd1c7722568aa05af1e77f4a6d545775293ed02a020c01000000 +0x53db1037f8885e4e3d77270ab15c6323e0e1317d90d9ce4adc5728b7eccfd73604000000 ``` # Copyright From e18947f698480bb66e0ad2c455858c56d78f5f5d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Dec 2023 11:03:52 +0100 Subject: [PATCH 090/110] Heed `omitempty` in test vectors --- tips/TIP-0046/tip-0046.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index a47f0810c..33a179479 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -742,8 +742,6 @@ Block (json-encoded): "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], - "weakParents": [], - "shallowLikeParents": [], "payload": { "type": 0, "tag": "0x746167", @@ -795,8 +793,6 @@ Block (json-encoded): "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], - "weakParents": [], - "shallowLikeParents": [], "payload": { "type": 1, "transaction": { @@ -948,8 +944,6 @@ Block (json-encoded): "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa", "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], - "weakParents": [], - "shallowLikeParents": [], "highestSupportedVersion": 3, "protocolParametersHash": "0xf07f73636669d9cb4be9faf017b3bfa16101d22ce2989010ca8409f2ea1665b2" }, From 645e78b688783b6429e06bdbc0a26d5e49b8f045 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Dec 2023 16:04:18 +0100 Subject: [PATCH 091/110] Update test vector for split input types --- tips/TIP-0046/tip-0046.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 33a179479..b8f239449 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -800,15 +800,15 @@ Block (json-encoded): "creationSlot": 1048576, "contextInputs": [ { - "type": 1, + "type": 0, "commitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" }, { - "type": 2, + "type": 1, "accountId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, { - "type": 3, + "type": 2, "index": 0 } ], @@ -889,7 +889,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab402" + "signature": "0x469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f00" } }, { @@ -903,7 +903,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x95830802c10334d917b9b9c82a5144754b4e7955667acd3ce8e502877ff716c5e45bfddf4aa6b83c0432538e317c732edbba8f047919418bbb50a54fbe45810b" + "signature": "0x0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002" } } ``` @@ -911,13 +911,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300013a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0217432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a030000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac328034c1701ae304fcf69b542ceeacf7aa2e94df6e2191b0e1e345c62c49d4afa5f4f58ccc8fa3d400e8c01a19719cf26820337d5c35d5cb5fcafe6d97eab4020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac95830802c10334d917b9b9c82a5144754b4e7955667acd3ce8e502877ff716c5e45bfddf4aa6b83c0432538e317c732edbba8f047919418bbb50a54fbe45810b +0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f000100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002 ``` Block ID: ``` -0xedcd454ff664cb13cdebc46fb41f86b072e97f4f545e0989892736e38cf3c3b904000000 +0xb107fdf32d2b6536fc6a3c453077b41e693d20d87fc18fed0524870cc9cc740604000000 ``` ## Validation Block ID From 3f16870bc5a7757fd2cfecec87ea9d18656cc555 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Dec 2023 11:21:52 +0100 Subject: [PATCH 092/110] Inline max block length --- tips/TIP-0046/tip-0046.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b8f239449..b01e8942f 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -448,7 +448,7 @@ The Tangle can only contain syntactically valid blocks. Invalid blocks must be r syntactically valid if all of the following conditions hold: - The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). -- The total length of the serialized block must not exceed `Max Block Length`. +- The total length of the serialized block must not exceed `32768`. - It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. - It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. @@ -638,7 +638,7 @@ The Tangle can only contain syntactically valid blocks. Invalid blocks must be r Block_ is syntactically valid if all of the following conditions hold: - The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). -- The total length of the serialized block must not exceed `Max Block Length`. +- The total length of the serialized block must not exceed `32768`. - It must hold true that 1 ≤ `Strong Parents Count` ≤ 50. - It must hold true that 0 ≤ `Weak Parents Count` ≤ 50. - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 50. From df5640c321f7826097803c5349ee8a0765beb770 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Dec 2023 15:09:15 +0100 Subject: [PATCH 093/110] Fix syntactic correctness, add work score --- tips/TIP-0046/tip-0046.md | 79 ++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b01e8942f..bfd44027c 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -718,7 +718,7 @@ Slot Commitment ID: 0xb4d22598e6ed4a4405c5f3199ab260ac5c718e8c63a93773fabeff155add895312000000 ``` -## Basic Block ID (Tagged Data payload) +## Basic Block ID & Work Score (Tagged Data payload) Block (json-encoded): @@ -727,9 +727,9 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1695275852000000000", - "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", - "latestFinalizedSlot": 500, + "issuingTime": "1695275942000000000", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000", + "latestFinalizedSlot": 0, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, "body": { @@ -752,7 +752,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d" + "signature": "0x5d1301b9ab4c09b8be906028b45cba759caedfb7e7bd510ce12eea25c7aee374c7ac89e90845f650b22a32dda4adc7eb291e28e5149b02c644a8c1a9fcbd9109" } } ``` @@ -760,16 +760,18 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac5d1301b9ab4c09b8be906028b45cba759caedfb7e7bd510ce12eea25c7aee374c7ac89e90845f650b22a32dda4adc7eb291e28e5149b02c644a8c1a9fcbd9109 ``` Block ID: ``` -0x1d5f495c0f4b883cf2c79cafd382c73484c65651099329e3b0b4c969c35d620004000000 +0xc9416c8e21df6d48e03115de785e0d5b2e37080b24b0681a8b79081a413cecd40d000000 ``` -## Basic Block ID (Transaction payload) +Block Work Score: `36`. + +## Basic Block ID & Work Score (Transaction Payload) Block (json-encoded): @@ -778,9 +780,9 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1695275852000000000", - "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", - "latestFinalizedSlot": 500, + "issuingTime": "1695275942000000000", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000", + "latestFinalizedSlot": 0, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, "body": { @@ -797,11 +799,11 @@ Block (json-encoded): "type": 1, "transaction": { "networkId": "8342982141227064571", - "creationSlot": 1048576, + "creationSlot": 11, "contextInputs": [ { "type": 0, - "commitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + "commitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000" }, { "type": 1, @@ -825,13 +827,13 @@ Block (json-encoded): } ], "allotments": [ - { - "accountId": "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507", - "mana": "2285" - }, { "accountId": "0x476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b6915", "mana": "2189" + }, + { + "accountId": "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507", + "mana": "2285" } ], "capabilities": "0x01", @@ -878,6 +880,27 @@ Block (json-encoded): "entries": { "hello": "0x776f726c64" } + }, + { + "type": 6, + "expirySlot": 4294967295, + "blockIssuerKeys": [ + { + "type": 0, + "publicKey": "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + }, + { + "type": 0, + "publicKey": "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + } + ] + }, + { + "type": 7, + "stakedAmount": "10000", + "fixedCost": "400", + "startEpoch": 0, + "endEpoch": 4294967295 } ] } @@ -889,7 +912,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f00" + "signature": "0x6d22cc707780425e3478518e9d0b66c1e9a08204d7e553cf2417a7089f5860c3ccbe2dc188a6c8a1c7bcdf8944da0ed1849ec162bbc45cc56879e32658a1360c" } }, { @@ -903,7 +926,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002" + "signature": "0xd8deadd15dc68d0cbe053b9f977ddf8a01ffa1f51f1490c27766a519afd0c93c37d77b891aee28907a768dfaa752def48913136896ce247451e6684632e2d70b" } } ``` @@ -911,15 +934,17 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300004e02000001fb5c44ef0d3ac873000010000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a0117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000000002007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0103010568656c6c6f0500776f726c6400020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f000100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002 +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0303010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac6d22cc707780425e3478518e9d0b66c1e9a08204d7e553cf2417a7089f5860c3ccbe2dc188a6c8a1c7bcdf8944da0ed1849ec162bbc45cc56879e32658a1360c0100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acd8deadd15dc68d0cbe053b9f977ddf8a01ffa1f51f1490c27766a519afd0c93c37d77b891aee28907a768dfaa752def48913136896ce247451e6684632e2d70b ``` Block ID: ``` -0xb107fdf32d2b6536fc6a3c453077b41e693d20d87fc18fed0524870cc9cc740604000000 +0xbb9d7f92d92d143bd2c19147a85f9b8b67b80210ccdb880d3140b0fc18d316120d000000 ``` +Block Work Score: `776`. + ## Validation Block ID Block (json-encoded): @@ -929,8 +954,8 @@ Block (json-encoded): "header": { "protocolVersion": 3, "networkId": "8342982141227064571", - "issuingTime": "1695275852000000000", - "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a", + "issuingTime": "1695275942000000000", + "slotCommitmentId": "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000", "latestFinalizedSlot": 500, "issuerId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" }, @@ -945,12 +970,12 @@ Block (json-encoded): "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "highestSupportedVersion": 3, - "protocolParametersHash": "0xf07f73636669d9cb4be9faf017b3bfa16101d22ce2989010ca8409f2ea1665b2" + "protocolParametersHash": "0x05fb0737a3407af6be41cc6facedd6f5ab48f8e1ac0d2d65b50cad7a9fd13c7c" }, "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xcf8e6fcd642e20ae68cf6a38d664d84b0e3594ac417c8efe0b08793716f33d59b4be5390524ba19a8b45601b871f4609ba7bca4327c9a74e34e58f8350d10808" + "signature": "0x422c5180aa373ce298d826ae7185619e9b091d5389ebb3fdea71984dcbcc809693467b48355726f95a1895f4a0f63dc58483c7ea8d7bbb4f9b98d0b269f06e0d" } } ``` @@ -958,13 +983,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300f8c1ca67d486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2af401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503000003f07f73636669d9cb4be9faf017b3bfa16101d22ce2989010ca8409f2ea1665b2002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257accf8e6fcd642e20ae68cf6a38d664d84b0e3594ac417c8efe0b08793716f33d59b4be5390524ba19a8b45601b871f4609ba7bca4327c9a74e34e58f8350d10808 +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000f401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000305fb0737a3407af6be41cc6facedd6f5ab48f8e1ac0d2d65b50cad7a9fd13c7c002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac422c5180aa373ce298d826ae7185619e9b091d5389ebb3fdea71984dcbcc809693467b48355726f95a1895f4a0f63dc58483c7ea8d7bbb4f9b98d0b269f06e0d ``` Block ID: ``` -0x53db1037f8885e4e3d77270ab15c6323e0e1317d90d9ce4adc5728b7eccfd73604000000 +0xe3f050097e692abbcb9c61d0c4ec45084297064fce54a219d230ba3e31de6bfa0d000000 ``` # Copyright From 1fc5dc9f944d9b58fd85ac60ec4f8ec8b1141483 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 10 Jan 2024 15:31:39 +0100 Subject: [PATCH 094/110] Fix block id test vectors --- tips/TIP-0046/tip-0046.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index bfd44027c..b60e69b43 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -912,7 +912,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x6d22cc707780425e3478518e9d0b66c1e9a08204d7e553cf2417a7089f5860c3ccbe2dc188a6c8a1c7bcdf8944da0ed1849ec162bbc45cc56879e32658a1360c" + "signature": "0x9ddb1a12cee815e5ff18477e8e59849fd3b8f9c96f35f3af00b1b77f71fc604ffd6c18920831a97825b30497806814c9facd02eee72383e59988a1782deacf07" } }, { @@ -926,7 +926,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xd8deadd15dc68d0cbe053b9f977ddf8a01ffa1f51f1490c27766a519afd0c93c37d77b891aee28907a768dfaa752def48913136896ce247451e6684632e2d70b" + "signature": "0xe071beb8c8f273e07f311d3d911d61de8736972f48f49c4441dc20b24fdcbf85117fd50704f85f1e3a0eabc0c6084dd125d5b5d064b9b928b653245d1bc8b80c" } } ``` @@ -934,13 +934,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0303010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac6d22cc707780425e3478518e9d0b66c1e9a08204d7e553cf2417a7089f5860c3ccbe2dc188a6c8a1c7bcdf8944da0ed1849ec162bbc45cc56879e32658a1360c0100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acd8deadd15dc68d0cbe053b9f977ddf8a01ffa1f51f1490c27766a519afd0c93c37d77b891aee28907a768dfaa752def48913136896ce247451e6684632e2d70b +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0303010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac9ddb1a12cee815e5ff18477e8e59849fd3b8f9c96f35f3af00b1b77f71fc604ffd6c18920831a97825b30497806814c9facd02eee72383e59988a1782deacf070100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ace071beb8c8f273e07f311d3d911d61de8736972f48f49c4441dc20b24fdcbf85117fd50704f85f1e3a0eabc0c6084dd125d5b5d064b9b928b653245d1bc8b80c ``` Block ID: ``` -0xbb9d7f92d92d143bd2c19147a85f9b8b67b80210ccdb880d3140b0fc18d316120d000000 +0x5f6946ef2b2ae073777cab8525401433d443e896033dff590e0d5963ab1648600d000000 ``` Block Work Score: `776`. @@ -970,12 +970,12 @@ Block (json-encoded): "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "highestSupportedVersion": 3, - "protocolParametersHash": "0x05fb0737a3407af6be41cc6facedd6f5ab48f8e1ac0d2d65b50cad7a9fd13c7c" + "protocolParametersHash": "0x28ccbc633e0d22e19752f5e65c0d22055a7d59756bfa754b8839088e18a6a5a6" }, "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x422c5180aa373ce298d826ae7185619e9b091d5389ebb3fdea71984dcbcc809693467b48355726f95a1895f4a0f63dc58483c7ea8d7bbb4f9b98d0b269f06e0d" + "signature": "0x1402b2660fbfbc710db145e85422cd2c0e444fa75d04565794b43258f92d7bc7cab001ed80ded7141b0fc8429997a0bb2e1e5ebf29cbc60e7b652a670efa7e05" } } ``` @@ -983,13 +983,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000f401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000305fb0737a3407af6be41cc6facedd6f5ab48f8e1ac0d2d65b50cad7a9fd13c7c002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac422c5180aa373ce298d826ae7185619e9b091d5389ebb3fdea71984dcbcc809693467b48355726f95a1895f4a0f63dc58483c7ea8d7bbb4f9b98d0b269f06e0d +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000f401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000328ccbc633e0d22e19752f5e65c0d22055a7d59756bfa754b8839088e18a6a5a6002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac1402b2660fbfbc710db145e85422cd2c0e444fa75d04565794b43258f92d7bc7cab001ed80ded7141b0fc8429997a0bb2e1e5ebf29cbc60e7b652a670efa7e05 ``` Block ID: ``` -0xe3f050097e692abbcb9c61d0c4ec45084297064fce54a219d230ba3e31de6bfa0d000000 +0xe7f9f06c51f2e89e0a41c5b4acdea11fa31367f1e9aebb2f3aed7f24db87dbfc0d000000 ``` # Copyright From af619c4eb2a3afefe17349e32773ac82d97a520c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 19 Jan 2024 14:31:47 +0100 Subject: [PATCH 095/110] Fix metadata feature in account in test vector --- tips/TIP-0046/tip-0046.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index b60e69b43..f47c32c1d 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -876,7 +876,7 @@ Block (json-encoded): ], "features": [ { - "type": 3, + "type": 2, "entries": { "hello": "0x776f726c64" } @@ -912,7 +912,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x9ddb1a12cee815e5ff18477e8e59849fd3b8f9c96f35f3af00b1b77f71fc604ffd6c18920831a97825b30497806814c9facd02eee72383e59988a1782deacf07" + "signature": "0x8e5601da2696080082cdfe9b1d0f8ee6eaa68b1777f4b830c649ec805ff2e33173776bb5f7da35866fbb3da243fdb2e27992dbfe59227635ab0304160ec09f02" } }, { @@ -926,7 +926,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xe071beb8c8f273e07f311d3d911d61de8736972f48f49c4441dc20b24fdcbf85117fd50704f85f1e3a0eabc0c6084dd125d5b5d064b9b928b653245d1bc8b80c" + "signature": "0x37c23f7ceaad1edb9782522e96c72ea00d4a8580779c638de3327e674e24dc3cc6f10ed6e08bdcd90273e2f5a87a13e173eeda18afbbb7b14792c54da3e92d0f" } } ``` @@ -934,13 +934,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0303010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac9ddb1a12cee815e5ff18477e8e59849fd3b8f9c96f35f3af00b1b77f71fc604ffd6c18920831a97825b30497806814c9facd02eee72383e59988a1782deacf070100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ace071beb8c8f273e07f311d3d911d61de8736972f48f49c4441dc20b24fdcbf85117fd50704f85f1e3a0eabc0c6084dd125d5b5d064b9b928b653245d1bc8b80c +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0302010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac8e5601da2696080082cdfe9b1d0f8ee6eaa68b1777f4b830c649ec805ff2e33173776bb5f7da35866fbb3da243fdb2e27992dbfe59227635ab0304160ec09f020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac37c23f7ceaad1edb9782522e96c72ea00d4a8580779c638de3327e674e24dc3cc6f10ed6e08bdcd90273e2f5a87a13e173eeda18afbbb7b14792c54da3e92d0f ``` Block ID: ``` -0x5f6946ef2b2ae073777cab8525401433d443e896033dff590e0d5963ab1648600d000000 +0x995dc5391d268306959846045e30e02dc0b1a0c78f659b96272db5c4bc5bc9e70d000000 ``` Block Work Score: `776`. From 5625e7f41383ec8d3db7d9d410d99f21c6ac861c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 19 Jan 2024 15:57:11 +0100 Subject: [PATCH 096/110] Fix Tagged Data TIP reference --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f47c32c1d..f0f85076e 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -480,7 +480,7 @@ specification: | Payload Name | Type Value | TIP | | ------------ | ---------- | --------------------------------- | | No Payload | - | - | -| Tagged Data | 0 | [TIP-23](../TIP-0023/tip-0023.md) | +| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | | Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | ### Work Score From 474511f0df11065ea90c8d6f1c80ecb03d9ce057 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 22 Jan 2024 12:10:25 +0100 Subject: [PATCH 097/110] Add Candidacy Announcement work score --- tips/TIP-0046/tip-0046.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index f0f85076e..ebb320578 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -477,11 +477,12 @@ information. As such, blocks usually contain a payload. The detailed specificati of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: -| Payload Name | Type Value | TIP | -| ------------ | ---------- | --------------------------------- | -| No Payload | - | - | -| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | -| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | +| Payload Name | Type Value | TIP | +| ---------------------- | ---------- | --------------------------------------------------------------------------------- | +| No Payload | - | - | +| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | +| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | +| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](../TIP-0040/tip-0040.md#candidacy-announcement) | ### Work Score @@ -490,8 +491,12 @@ Let the work score of a _Basic Block_ be defined as follows. - Let `Payload Score` be the work score of the contained `Payload` if it exists, or `0` if it does not exist. - If the type is _Tagged Data_ the work score is `Work Score Parameters::Data Byte * Tagged Data Size` where: - `Tagged Data Size` is the size of the serialized _Tagged Data_. - - If the type is _Transaction_ the work score is defined in TIP-45. -- Return `Work Score Parameters::Block + Payload Score`. + - If the type is _Candidacy Announcement_ the work score is + `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: + - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. + - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](../TIP-0045/tip-0045.md#work-score). +- Let `Signature Score` be the work score of the `Signature`. +- Return `Work Score Parameters::Block + Payload Score + Signature Score`. ## Validation Block From d4663c54895bcdf1b9e85df5b8ffab9a20afa190 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 Jan 2024 11:57:27 +0100 Subject: [PATCH 098/110] Clarify work score for `Max Burned Mana` --- tips/TIP-0046/tip-0046.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ebb320578..ff92f5394 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -438,7 +438,7 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo Max Burned Mana uint64 - The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit may be lower than the value of this field which is the product of the block's work score and the RMC (Reference Mana Cost) from the block's slot commitment, identified by the Slot Commitment ID. Therefore, for the calculation of this field, the block issuer should also use the RMC value from the same commitment. + The amount of Mana the Account identified by Issuer ID is at most willing to burn for this block. The actual Mana deducted from this Account's Block Issuance Credit may be lower than the value of this field which is the product of the basic block's work score and the RMC (Reference Mana Cost) from the block's slot commitment, identified by the Slot Commitment ID. Therefore, for the calculation of this field, the block issuer should use the RMC value from the same commitment. From fc9c51f810f2f2fa08d96f587dbc86edc90cef69 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 12:04:49 +0100 Subject: [PATCH 099/110] Update test vector with pub key hash block iss key --- tips/TIP-0046/tip-0046.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index ff92f5394..7733014b7 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -892,11 +892,11 @@ Block (json-encoded): "blockIssuerKeys": [ { "type": 0, - "publicKey": "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + "pubKeyHash": "0x295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c" }, { "type": 0, - "publicKey": "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + "pubKeyHash": "0x868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f" } ] }, @@ -917,7 +917,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x8e5601da2696080082cdfe9b1d0f8ee6eaa68b1777f4b830c649ec805ff2e33173776bb5f7da35866fbb3da243fdb2e27992dbfe59227635ab0304160ec09f02" + "signature": "0x5bb409d59e01d2ea9f1a1fb67feb681d0d3ecb05787cadad2f89fdf13ef7ff03ad5cebf28df5dddd8510992596d98b133f86e14f76824e6ccc369a8f5df44806" } }, { @@ -931,7 +931,7 @@ Block (json-encoded): "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x37c23f7ceaad1edb9782522e96c72ea00d4a8580779c638de3327e674e24dc3cc6f10ed6e08bdcd90273e2f5a87a13e173eeda18afbbb7b14792c54da3e92d0f" + "signature": "0xb4300837bafda6e0e590124b367a1beb87abd9afbde50bc2afe5e335c7118c13ba59ba58d082eb329c84f527a536bf2c1943b3bcf0444d770dcf7b05f135f50a" } } ``` @@ -939,13 +939,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0302010568656c6c6f0500776f726c6406ffffffff02009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac8e5601da2696080082cdfe9b1d0f8ee6eaa68b1777f4b830c649ec805ff2e33173776bb5f7da35866fbb3da243fdb2e27992dbfe59227635ab0304160ec09f020100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac37c23f7ceaad1edb9782522e96c72ea00d4a8580779c638de3327e674e24dc3cc6f10ed6e08bdcd90273e2f5a87a13e173eeda18afbbb7b14792c54da3e92d0f +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0302010568656c6c6f0500776f726c6406ffffffff0200295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c00868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac5bb409d59e01d2ea9f1a1fb67feb681d0d3ecb05787cadad2f89fdf13ef7ff03ad5cebf28df5dddd8510992596d98b133f86e14f76824e6ccc369a8f5df448060100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acb4300837bafda6e0e590124b367a1beb87abd9afbde50bc2afe5e335c7118c13ba59ba58d082eb329c84f527a536bf2c1943b3bcf0444d770dcf7b05f135f50a ``` Block ID: ``` -0x995dc5391d268306959846045e30e02dc0b1a0c78f659b96272db5c4bc5bc9e70d000000 +0xd4f66be3a8e0b980a6eb10ad969f7aca33313946833112c6b96cc3d7287ca01c0d000000 ``` Block Work Score: `776`. From 4e8a204fd49ece4b326813db60f483cfb178630b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 15:03:46 +0100 Subject: [PATCH 100/110] Remove signature from block work score --- tips/TIP-0046/tip-0046.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 7733014b7..c8e2bfae3 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -495,8 +495,7 @@ Let the work score of a _Basic Block_ be defined as follows. `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](../TIP-0045/tip-0045.md#work-score). -- Let `Signature Score` be the work score of the `Signature`. -- Return `Work Score Parameters::Block + Payload Score + Signature Score`. +- Return `Work Score Parameters::Block + Payload Score`. ## Validation Block From 334f5d73eda4509e60ea7df8cb14a3d52c9831ba Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 15:26:43 +0100 Subject: [PATCH 101/110] Move Signature Work Score to TIP-38 --- tips/TIP-0046/tip-0046.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index c8e2bfae3..d7eb4ac7b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -170,12 +170,6 @@ In order for the signature to be valid all of the following conditions must hold - The `Public Key` must be included as a _Block Issuer Key_ in the Account identified by the block's `Issuer ID` field. This check is executed against the account state at the slot index corresponding to the slot commitment of the block. -### Work Score - -Let the Work Score of a Signature be defined as follows. - -- If the type is _Ed25519 Signature_ the work score is `Work Score Parameters::Signature Ed25519`. - # Block A block consists of a header, body and a signature. The body defines the concrete flavor of a block. From 80fc2172a769ca2370661c0443a7800281ff8b66 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 Jan 2024 11:54:16 +0100 Subject: [PATCH 102/110] Fix work score in test vectors --- tips/TIP-0046/tip-0046.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index d7eb4ac7b..4112b5ed1 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -767,7 +767,7 @@ Block ID: 0xc9416c8e21df6d48e03115de785e0d5b2e37080b24b0681a8b79081a413cecd40d000000 ``` -Block Work Score: `36`. +Block Work Score: `26`. ## Basic Block ID & Work Score (Transaction Payload) @@ -941,7 +941,7 @@ Block ID: 0xd4f66be3a8e0b980a6eb10ad969f7aca33313946833112c6b96cc3d7287ca01c0d000000 ``` -Block Work Score: `776`. +Block Work Score: `766`. ## Validation Block ID From fcb2adf27d2b11dc84d1b6680c9a386f1e5b51bb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 2 Feb 2024 12:04:52 +0100 Subject: [PATCH 103/110] Point links to TIPs on GitHub --- tips/TIP-0046/tip-0046.md | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 4112b5ed1..1bdfa452b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -151,7 +151,8 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ## Block Signature -The [_Ed25519 Signature_](../TIP-0038/tip-0038.md#ed25519-signature) is supported. +The [_Ed25519 Signature_](https://github.com/iotaledger/tips/blob/tip38/tips/TIP-0038/tip-0038.md#ed25519-signature) is +supported. ### Signature Creation @@ -249,11 +250,11 @@ The schema of a block is as follows:
    Basic Block Body -
    The basic block body. Defined in TIP-46 (Basic Block).
    +
    The basic block body. Defined in TIP-46 (Basic Block).
    Validation Block Body -
    The validation block body. Defined in TIP-46 (Validation Block).
    +
    The validation block body. Defined in TIP-46 (Validation Block).
    @@ -262,7 +263,7 @@ The schema of a block is as follows:
    Ed25519 Signature -
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    +
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    @@ -417,15 +418,15 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Signed Transaction -
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    +
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    Tagged Data -
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    +
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    Candidacy Announcement -
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    +
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    @@ -471,12 +472,12 @@ information. As such, blocks usually contain a payload. The detailed specificati of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: -| Payload Name | Type Value | TIP | -| ---------------------- | ---------- | --------------------------------------------------------------------------------- | -| No Payload | - | - | -| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | -| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | -| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](../TIP-0040/tip-0040.md#candidacy-announcement) | +| Payload Name | Type Value | TIP | +| ---------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | +| No Payload | - | - | +| Tagged Data | 0 | [TIP-53](https://github.com/iotaledger/tips/blob/tip53/tips/TIP-0053/tip-0053.md) | +| Transaction | 1 | [TIP-45](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md) | +| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](https://github.com/iotaledger/tips/blob/tip40/tips/TIP-0040/tip-0040.md#candidacy-announcement) | ### Work Score @@ -488,7 +489,8 @@ Let the work score of a _Basic Block_ be defined as follows. - If the type is _Candidacy Announcement_ the work score is `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. - - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](../TIP-0045/tip-0045.md#work-score). + - If the type is _Transaction_ the work score is defined in + [TIP-45 (Work Score)](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md#work-score). - Return `Work Score Parameters::Block + Payload Score`. ## Validation Block @@ -687,7 +689,7 @@ transaction, the transaction will never result in the locking of the account. # Test Vectors The protocol parameters used in the following test vectors are the same as in -[TIP-49](../TIP-0049/tip-0049.md#protocol-parameters-hash). +[TIP-49](https://github.com/iotaledger/tips/blob/tip49/tips/TIP-0049/tip-0049.md#protocol-parameters-hash). ## Slot Commitment ID From 398edf9929cdaf177eb5ac1a3d73ddbad52467a3 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 2 Feb 2024 12:15:28 +0100 Subject: [PATCH 104/110] Revert "Point links to TIPs on GitHub" This reverts commit fcb2adf27d2b11dc84d1b6680c9a386f1e5b51bb. --- tips/TIP-0046/tip-0046.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 1bdfa452b..4112b5ed1 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -151,8 +151,7 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ## Block Signature -The [_Ed25519 Signature_](https://github.com/iotaledger/tips/blob/tip38/tips/TIP-0038/tip-0038.md#ed25519-signature) is -supported. +The [_Ed25519 Signature_](../TIP-0038/tip-0038.md#ed25519-signature) is supported. ### Signature Creation @@ -250,11 +249,11 @@ The schema of a block is as follows:
    Basic Block Body -
    The basic block body. Defined in TIP-46 (Basic Block).
    +
    The basic block body. Defined in TIP-46 (Basic Block).
    Validation Block Body -
    The validation block body. Defined in TIP-46 (Validation Block).
    +
    The validation block body. Defined in TIP-46 (Validation Block).
    @@ -263,7 +262,7 @@ The schema of a block is as follows:
    Ed25519 Signature -
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    +
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    @@ -418,15 +417,15 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Signed Transaction -
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    +
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    Tagged Data -
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    +
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    Candidacy Announcement -
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    +
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    @@ -472,12 +471,12 @@ information. As such, blocks usually contain a payload. The detailed specificati of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: -| Payload Name | Type Value | TIP | -| ---------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | -| No Payload | - | - | -| Tagged Data | 0 | [TIP-53](https://github.com/iotaledger/tips/blob/tip53/tips/TIP-0053/tip-0053.md) | -| Transaction | 1 | [TIP-45](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md) | -| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](https://github.com/iotaledger/tips/blob/tip40/tips/TIP-0040/tip-0040.md#candidacy-announcement) | +| Payload Name | Type Value | TIP | +| ---------------------- | ---------- | --------------------------------------------------------------------------------- | +| No Payload | - | - | +| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | +| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | +| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](../TIP-0040/tip-0040.md#candidacy-announcement) | ### Work Score @@ -489,8 +488,7 @@ Let the work score of a _Basic Block_ be defined as follows. - If the type is _Candidacy Announcement_ the work score is `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. - - If the type is _Transaction_ the work score is defined in - [TIP-45 (Work Score)](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md#work-score). + - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](../TIP-0045/tip-0045.md#work-score). - Return `Work Score Parameters::Block + Payload Score`. ## Validation Block @@ -689,7 +687,7 @@ transaction, the transaction will never result in the locking of the account. # Test Vectors The protocol parameters used in the following test vectors are the same as in -[TIP-49](https://github.com/iotaledger/tips/blob/tip49/tips/TIP-0049/tip-0049.md#protocol-parameters-hash). +[TIP-49](../TIP-0049/tip-0049.md#protocol-parameters-hash). ## Slot Commitment ID From 6607da5a9c3988d87d4d54f57464dddbd992dfc4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 2 Feb 2024 12:17:30 +0100 Subject: [PATCH 105/110] Point links to GitHub tips --- tips/TIP-0046/tip-0046.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 4112b5ed1..a6ef3d42b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -151,7 +151,7 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ## Block Signature -The [_Ed25519 Signature_](../TIP-0038/tip-0038.md#ed25519-signature) is supported. +The [_Ed25519 Signature_](https://github.com/iotaledger/tips/blob/tip38/tips/TIP-0038/tip-0038.md#ed25519-signature) is supported. ### Signature Creation @@ -262,7 +262,7 @@ The schema of a block is as follows:
    Ed25519 Signature -
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    +
    An Ed25519 Signature with the public key that verifies it. Defined in TIP-38 (Ed25519 Signature).
    @@ -417,15 +417,15 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo
    Signed Transaction -
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    +
    A transaction with its unlocks. Defined in TIP-45 (Signed Transaction).
    Tagged Data -
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    +
    Optional Data with an optional Tag. Defined in TIP-53 (Tagged Data).
    Candidacy Announcement -
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    +
    Signals candidacy for committee selection for the epoch after the one in which it is issued. Defined in TIP-40 (Candidacy Announcement).
    @@ -474,9 +474,9 @@ specification: | Payload Name | Type Value | TIP | | ---------------------- | ---------- | --------------------------------------------------------------------------------- | | No Payload | - | - | -| Tagged Data | 0 | [TIP-53](../TIP-0053/tip-0053.md) | -| Transaction | 1 | [TIP-45](../TIP-0045/tip-0045.md) | -| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](../TIP-0040/tip-0040.md#candidacy-announcement) | +| Tagged Data | 0 | [TIP-53](https://github.com/iotaledger/tips/blob/tip53/tips/TIP-0053/tip-0053.md) | +| Transaction | 1 | [TIP-45](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md) | +| Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](https://github.com/iotaledger/tips/blob/tip40/tips/TIP-0040/tip-0040.md#candidacy-announcement) | ### Work Score @@ -488,7 +488,7 @@ Let the work score of a _Basic Block_ be defined as follows. - If the type is _Candidacy Announcement_ the work score is `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. - - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](../TIP-0045/tip-0045.md#work-score). + - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md#work-score). - Return `Work Score Parameters::Block + Payload Score`. ## Validation Block @@ -687,7 +687,7 @@ transaction, the transaction will never result in the locking of the account. # Test Vectors The protocol parameters used in the following test vectors are the same as in -[TIP-49](../TIP-0049/tip-0049.md#protocol-parameters-hash). +[TIP-49](https://github.com/iotaledger/tips/blob/tip49/tips/TIP-0049/tip-0049.md#protocol-parameters-hash). ## Slot Commitment ID From 688788a5ef5e711b103042070a6c02a6aaba297a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 15 Feb 2024 09:11:17 +0800 Subject: [PATCH 106/110] Add Commitment Input to header commitment rule --- tips/TIP-0046/tip-0046.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index a6ef3d42b..cb4a8a033 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -151,7 +151,8 @@ The string format of a Slot Commitment ID is the hexadecimal encoding of the Slo ## Block Signature -The [_Ed25519 Signature_](https://github.com/iotaledger/tips/blob/tip38/tips/TIP-0038/tip-0038.md#ed25519-signature) is supported. +The [_Ed25519 Signature_](https://github.com/iotaledger/tips/blob/tip38/tips/TIP-0038/tip-0038.md#ed25519-signature) is +supported. ### Signature Creation @@ -455,8 +456,9 @@ syntactically valid if all of the following conditions hold: - If a _Basic Block_ contains a transaction payload, the block is valid only if all of the following conditions hold: - The Slot Index `Block Slot` corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. - - If the transaction includes a `Commitment Input`, the `Slot Index` field of the commitment to which the input - resolves must be in the closed interval `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`. + - If the transaction includes a `Commitment Input`, then the `Slot Index` from the contained `Commitment ID`: + - must be in the closed interval `[Block Slot - Max Committable Age, Block Slot - Min Committable Age]`. + - must not exceed the `Slot Index` field of the `Slot Commitment ID` from the block's `Header`. ### Semantic Validation @@ -471,9 +473,9 @@ information. As such, blocks usually contain a payload. The detailed specificati of this TIP. The following table lists all currently specified payloads that can be part of a block and links to their specification: -| Payload Name | Type Value | TIP | -| ---------------------- | ---------- | --------------------------------------------------------------------------------- | -| No Payload | - | - | +| Payload Name | Type Value | TIP | +| ---------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | +| No Payload | - | - | | Tagged Data | 0 | [TIP-53](https://github.com/iotaledger/tips/blob/tip53/tips/TIP-0053/tip-0053.md) | | Transaction | 1 | [TIP-45](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md) | | Candidacy Announcement | 2 | [TIP-40 (Candidacy Announcement)](https://github.com/iotaledger/tips/blob/tip40/tips/TIP-0040/tip-0040.md#candidacy-announcement) | @@ -488,7 +490,8 @@ Let the work score of a _Basic Block_ be defined as follows. - If the type is _Candidacy Announcement_ the work score is `Work Score Parameters::Data Byte * Candidacy Announcement Size` where: - `Candidacy Announcement Size` is the size of the serialized _Candidacy Announcement_. - - If the type is _Transaction_ the work score is defined in [TIP-45 (Work Score)](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md#work-score). + - If the type is _Transaction_ the work score is defined in + [TIP-45 (Work Score)](https://github.com/iotaledger/tips/blob/tip45/tips/TIP-0045/tip-0045.md#work-score). - Return `Work Score Parameters::Block + Payload Score`. ## Validation Block From a2661d2cb71aaf221beeca64a5eda3ebefe33fdd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 16 Feb 2024 08:44:44 +0800 Subject: [PATCH 107/110] Account for Genesis Slot in Epoch index calc --- tips/TIP-0046/tip-0046.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index cb4a8a033..34f3d381b 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -80,8 +80,11 @@ timestamp `Unix Timestamp` (in seconds) is calculated as follows: Each epoch has a corresponding epoch index, which is a `uint32`. To calculate the epoch index of a slot index, that is, the index of the epoch to which the slot belongs, the protocol parameter `Slots Per Epoch Exponent` is used. The epoch -index of a slot index `Slot Index` is `Slot Index >> Slots Per Epoch Exponent`, where `>>` is the _zero-fill -right-shift_ or _logical shift_ operation. +index of a slot index `Slot Index` is calculated as follows: + +- If `Slot Index <= Genesis Slot` then the epoch index is `0`. +- Otherwise the epoch index is `(Slot Index - Genesis Slot) >> Slots Per Epoch Exponent)`, where `>>` is the _zero-fill + right-shift_ or _logical shift_ operation. ## Slot Commitment From cd5bdfb611b5127299060b23b09d7f996adac089 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Mar 2024 11:22:07 +0800 Subject: [PATCH 108/110] Set Max Burned Mana realistically in test vectors --- tips/TIP-0046/tip-0046.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 34f3d381b..79bc02618 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -751,12 +751,12 @@ Block (json-encoded): "tag": "0x746167", "data": "0x6c754128356c071e5549764a48427b" }, - "maxBurnedMana": "864" + "maxBurnedMana": "26" }, "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x5d1301b9ab4c09b8be906028b45cba759caedfb7e7bd510ce12eea25c7aee374c7ac89e90845f650b22a32dda4adc7eb291e28e5149b02c644a8c1a9fcbd9109" + "signature": "0xdf2d3b9e1dcd59030eb816fabef7c4368e83b49bae384393370ace84df2b57533c79c5c374acb5ca64c413d4bf396fbebe67ab3c6e0909b1c5878cd79672b80c" } } ``` @@ -764,13 +764,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b6003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac5d1301b9ab4c09b8be906028b45cba759caedfb7e7bd510ce12eea25c7aee374c7ac89e90845f650b22a32dda4adc7eb291e28e5149b02c644a8c1a9fcbd9109 +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300001800000000037461670f0000006c754128356c071e5549764a48427b1a00000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acdf2d3b9e1dcd59030eb816fabef7c4368e83b49bae384393370ace84df2b57533c79c5c374acb5ca64c413d4bf396fbebe67ab3c6e0909b1c5878cd79672b80c ``` Block ID: ``` -0xc9416c8e21df6d48e03115de785e0d5b2e37080b24b0681a8b79081a413cecd40d000000 +0xc7f9a14e1b5bbbb31810e2cb064ab2dbd87cab22696c5ee1297f333e0635e91e0d000000 ``` Block Work Score: `26`. @@ -925,12 +925,12 @@ Block (json-encoded): } ] }, - "maxBurnedMana": "864" + "maxBurnedMana": "766" }, "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0xb4300837bafda6e0e590124b367a1beb87abd9afbde50bc2afe5e335c7118c13ba59ba58d082eb329c84f527a536bf2c1943b3bcf0444d770dcf7b05f135f50a" + "signature": "0x3b70bc23b955b710bc131b57696e4a16ca0d4d8601ca2de126e68eeeefa310ef0d7a8668365dddee2a1376630f8564f2190bd89ed2b2ffd061a20ad2bc47ea0b" } } ``` @@ -938,13 +938,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0302010568656c6c6f0500776f726c6406ffffffff0200295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c00868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac5bb409d59e01d2ea9f1a1fb67feb681d0d3ecb05787cadad2f89fdf13ef7ff03ad5cebf28df5dddd8510992596d98b133f86e14f76824e6ccc369a8f5df448060100006003000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257acb4300837bafda6e0e590124b367a1beb87abd9afbde50bc2afe5e335c7118c13ba59ba58d082eb329c84f527a536bf2c1943b3bcf0444d770dcf7b05f135f50a +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000000000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b5030000af02000001fb5c44ef0d3ac8730b0000000300003a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d7076010000000117432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a020000020000f09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000000000d2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa82610000000000000200476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b69158d080000000000007e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507ed08000000000000010100000000020000a0860100000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0105086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00f46312374981be1400000000000000000000000000000000000000000000000001a0860100000000008813000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a0302010568656c6c6f0500776f726c6406ffffffff0200295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c00868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f071027000000000000900100000000000000000000ffffffff00020000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac5bb409d59e01d2ea9f1a1fb67feb681d0d3ecb05787cadad2f89fdf13ef7ff03ad5cebf28df5dddd8510992596d98b133f86e14f76824e6ccc369a8f5df44806010000fe02000000000000002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac3b70bc23b955b710bc131b57696e4a16ca0d4d8601ca2de126e68eeeefa310ef0d7a8668365dddee2a1376630f8564f2190bd89ed2b2ffd061a20ad2bc47ea0b ``` Block ID: ``` -0xd4f66be3a8e0b980a6eb10ad969f7aca33313946833112c6b96cc3d7287ca01c0d000000 +0xf396312ff9dd4abaa08273df8cebc13da25c577df84d3b8979e032595fb6b6a40d000000 ``` Block Work Score: `766`. From 4875e8b35f5a7c0457cd498e5b97adcf63f9331e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Mar 2024 11:24:54 +0800 Subject: [PATCH 109/110] Validation Block test vector update --- tips/TIP-0046/tip-0046.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index 79bc02618..dc224e8ae 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -974,12 +974,12 @@ Block (json-encoded): "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" ], "highestSupportedVersion": 3, - "protocolParametersHash": "0x28ccbc633e0d22e19752f5e65c0d22055a7d59756bfa754b8839088e18a6a5a6" + "protocolParametersHash": "0x21e0f6e8607b04fa34d54a8a776adfe7e0e5a8931005ce8a66c5990fa1c2f960" }, "signature": { "type": 0, "publicKey": "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac", - "signature": "0x1402b2660fbfbc710db145e85422cd2c0e444fa75d04565794b43258f92d7bc7cab001ed80ded7141b0fc8429997a0bb2e1e5ebf29cbc60e7b652a670efa7e05" + "signature": "0x0223a6a21104a8bb14c2afd82c088deab2bfe321b26c555a6b4f097d35e7705edeec575a040829833a8461f2bcfd7a7ef568d59e206111ee5e3b12b43bf61a00" } } ``` @@ -987,13 +987,13 @@ Block (json-encoded): Block (hex-encoded binary serialization): ``` -0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000f401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000328ccbc633e0d22e19752f5e65c0d22055a7d59756bfa754b8839088e18a6a5a6002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac1402b2660fbfbc710db145e85422cd2c0e444fa75d04565794b43258f92d7bc7cab001ed80ded7141b0fc8429997a0bb2e1e5ebf29cbc60e7b652a670efa7e05 +0x03fb5c44ef0d3ac87300fc2cbf7cd486173a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000f401000017432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010627e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b769489951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ceaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936ba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aaea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b50300000321e0f6e8607b04fa34d54a8a776adfe7e0e5a8931005ce8a66c5990fa1c2f960002daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac0223a6a21104a8bb14c2afd82c088deab2bfe321b26c555a6b4f097d35e7705edeec575a040829833a8461f2bcfd7a7ef568d59e206111ee5e3b12b43bf61a00 ``` Block ID: ``` -0xe7f9f06c51f2e89e0a41c5b4acdea11fa31367f1e9aebb2f3aed7f24db87dbfc0d000000 +0x8d32f94efc05b9df445607714ec97873683c54ee7388725ecd9ca782e64b65ed0d000000 ``` # Copyright From 61af444ec50c242350fb3cdb32d47af155151e87 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 12 Mar 2024 14:59:50 +0800 Subject: [PATCH 110/110] Add missing top-level Block syntactic validation --- tips/TIP-0046/tip-0046.md | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/tips/TIP-0046/tip-0046.md b/tips/TIP-0046/tip-0046.md index dc224e8ae..9ff773d50 100644 --- a/tips/TIP-0046/tip-0046.md +++ b/tips/TIP-0046/tip-0046.md @@ -288,6 +288,29 @@ steps: The string format of the Block ID is the hexadecimal encoding of the `Block ID` with a `0x` prefix. +## Syntactic validation + +The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. A Block is +syntactically valid only if all of the following conditions hold: + +- The serialized size of the block does not exceed `32768`. +- The `Protocol Version` in the `Header` matches the `Version` in the used protocol parameters. +- The `Network ID` in the `Header` matches the `Network ID` from the protocol parameters, which is computed as described + in [TIP-45 (Network ID)](../TIP-0045/tip-0045.md#network-id). +- Let `Commitment Slot` be the slot index to which the block commits, which can be extracted from the header's + `Slot Commitment ID`. +- Let `Block Slot` be the slot index corresponding to the block header's `Issuing Time`. +- If `Commitment Slot > Genesis Slot`, then it must hold that `Commitment Slot + Min Committable Age <= Block Slot`. + - Note: This ensures that the commitment is not too recent, except when committing to genesis. +- It must hold that `Commitment Slot + Max Committable Age >= Block Slot`. + - Note: This ensures that the commitment is not too old. +- The contained `Body` is syntactically valid. +- There must be no trailing bytes after all block fields have been parsed. + +## Semantic Validation + +A _Block_ is semantically valid if the `Body`'s semantic validation passes. + ## Basic Block ### Schema @@ -442,11 +465,9 @@ A _Basic Block_ is the name for a _Block_ with its body set to a _Basic Block Bo ### Syntactic validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. A _Basic Block_ is -syntactically valid if all of the following conditions hold: +A _Basic Block Body_ is only syntactically valid if all of the following conditions hold: - The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). -- The total length of the serialized block must not exceed `32768`. - It must hold true that 1 ≤ `Strong Parents Count` ≤ 8. - It must hold true that 0 ≤ `Weak Parents Count` ≤ 8. - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 8. @@ -455,7 +476,6 @@ syntactically valid if all of the following conditions hold: - must not have duplicates in each list. - `Weak Parents` must be disjoint from the rest of the parents: No weak parent should be in either `Strong Parents` or `Shallow Like Parents`. -- There must be no trailing bytes after all block fields have been parsed. - If a _Basic Block_ contains a transaction payload, the block is valid only if all of the following conditions hold: - The Slot Index `Block Slot` corresponding to the `Issuing Time` of a block must be greater or equal than the `Creation Slot` of the contained transaction. @@ -465,7 +485,7 @@ syntactically valid if all of the following conditions hold: ### Semantic Validation -A _Basic Block_ is semantically valid if the following condition holds: +A _Basic Block Body_ is semantically valid if the following condition holds: - The `Signature` must pass semantic validation. @@ -638,11 +658,9 @@ A _Validation Block_ is the name for a _Block_ with its body set to a _Validatio ### Syntactic Validation -The Tangle can only contain syntactically valid blocks. Invalid blocks must be rejected by the node. A _Validation -Block_ is syntactically valid if all of the following conditions hold: +A _Validation Block Body_ is only syntactically valid if all of the following conditions hold: - The block adheres to its schema with the rules defined in [TIP-21](../TIP-0021/tip-0021.md). -- The total length of the serialized block must not exceed `32768`. - It must hold true that 1 ≤ `Strong Parents Count` ≤ 50. - It must hold true that 0 ≤ `Weak Parents Count` ≤ 50. - It must hold true that 0 ≤ `Shallow Like Parents Count` ≤ 50. @@ -652,11 +670,10 @@ Block_ is syntactically valid if all of the following conditions hold: - `Weak Parents` must be disjoint from the rest of the parents: No weak parent should be in either `Strong Parents` or `Shallow Like Parents`. - `Highest Supported Version` must be greater or equal to `Protocol Version`. -- There must be no trailing bytes after all block fields have been parsed. ### Semantic Validation -A _Validation Block_ is semantically valid if the following condition holds: +A _Validation Block Body_ is semantically valid if the following condition holds: - The `Signature` must pass semantic validation.
    Slot Commitment
    - Slot Commitment is an object that contains a summary of a slot. More descriptions are in Slot Commitment section. + A Slot Commitment contains a summary of a slot. More details in the Slot Commitment section.