From a84380a40ff4b0e44e79fe33afa1498319436ede Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sat, 15 May 2021 14:56:19 +1200 Subject: [PATCH 01/11] started a more detailed specification of the product requirements --- .../docs/CoordinatorRequirements.md | 71 ++++++++++++++++++ phase1-coordinator/docs/PowersofTau.jpg | Bin 0 -> 148884 bytes 2 files changed, 71 insertions(+) create mode 100644 phase1-coordinator/docs/CoordinatorRequirements.md create mode 100644 phase1-coordinator/docs/PowersofTau.jpg diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md new file mode 100644 index 00000000..70bf24ed --- /dev/null +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -0,0 +1,71 @@ +# Aleo Setup Coordinator Requirements + +Vaguely following the format outlined here: . + +This document contains documentation of the required functionality for the [`phase1-coordinator`](../) module. + +Related overall setup requirements document here [Aleo Setup PRD][Aleo Setup PRD] + +## Definitions + +Definitions of various terms which are relevant to the purpose and implementation of the coordinator. + +### Setup + +A **Setup** is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#Parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#Contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. + +Extra useful references: + ++ [Zcash Parameter Generation](https://z.cash/technology/paramgen/) ++ [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] + +### Parameters + +TODO: specifically what are the parameters? + +### Participant + +A participant is an actor who performs a role during the ceremony, the coordinator provides them with tasks to perform. There are currently two type of participants: [contributor](#Contributor)s and [verifiers](#Verifier)s. + +### Contributor + +TODO: description + +### Verifier + +TODO: description + +### Optimistic Pipelining + +The marketing logic is that by making it easy for more people to contribute, it will increase the public's perceived trustworthiness of the system in question. **Optimistic Pipelining** is a new technique implemented for this project to allow [contributor](#Contributor)s to make contributions in parallel for a given round. + +![Powers of Tau Diagram](./PowersofTau.jpg) + +With optimistic pipelining: + ++ For a given [round](#Round) the [parameters](#Parameters) are divided into chunks. **TODO**: is this the correct terminology?. ++ A [chunk](#Chunk) will be contributed to once by every contributor in the round, each [contribution](#Contribution) is based on the previous. ++ After a contribution has been made to a chunk, it needs to be verified before another contributor can make the next contribution. ++ A chunk can only have one contributor at a given time. + +See [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] for a more detailed explanation and background for this technique. + +### Round + +A round of the [setup ceremony](#Setup). Each round ideally consists of a new set of [contributor](#Contributor)s. + +### Chunk + +TODO + +### Contribution + +As part of the design for [Optimistic Pipelining](#Optimistic-Pipelining), at the end of a round, each [chunk](#Chunk) will contain one contribution for each [contributor](#Contributor) participating in the round. + +## Purpose + +The purpose of this module is to provide logic to coordinate a + + +[Aleo Setup PRD]: https://docs.google.com/document/d/1Vyg2J60zRU6023KXBjZx8CP3V-Nz6hPOUCMplbCxVB4/ +[Setup Ceremonies ZKProof]: https://docs.google.com/document/d/189hwHm5UFxT2jOFeCzL_YUvRfXEpTyQ1dsWEtuimR94/ diff --git a/phase1-coordinator/docs/PowersofTau.jpg b/phase1-coordinator/docs/PowersofTau.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cc18be80c92bfedbcdb5e29fdf5e1a7bcc03693 GIT binary patch literal 148884 zcmeFZbx>U0w>AjDg9LYXcMTF88VwNK-61sY1lPu05-fz^E{z0t_lAZbO&~xc!2%(f zet-A7U)}lRzVEMUX1=dxY7SL!y4KTcJ$s+Mp0(J0`uth{^A!nSO&Oq!gp7=YgpBw> z`m>1?jfC>-8RoxzJpT)cg@uKQiH-Xl6BlugiHw4ZijIbkiH`nXz5EM^`5(VA|L5QT ziuj-Bf4(3QV4}LC08x+`k)9DCqYxnf8AhT(5PbFwBOXhx_Z`Lr3)nT z?=s4oE|`RDfZmzS1B)1B!U}J8FGXx4%Ljd;{y>m$P!J;~Kp{YSg><7yfRCyuOF)36 zsEGXk#Z!Ilvhd1@MkDT66U_1w6I*0d-7aCfD@Y{9*4I7r)$FOp9=FM^nd_TjBj-;! z;Z#Xdp_^?-*;`6ef+P~|q~mx&cU(r{#7A}sH~S?BQk zf(ZEamn)~!*{_RvUHsoSi+ruu+WabxpGPSf`1k6R_Hw_~%|0EP>=1tF5irOMn>fgI zcEgNM)TDDIe5Ra)?Va>l#eouNQcuQ>TtuSgG&(#$C7C~hohvAd?g(TcBv`mH8yd-0 zbFRV7dp=@?#Vxy}{6mg98AdTfMS35p?C8ZrVB-*qPm%Sy5AQgWAU#Kw-R{V|fYm>P zv;Av{9I2lp8+me)L;Xzu1a#x`FUKI~p%t5835^gcw`_T5_b+&>5w=XVr{5Z6_;Z-p zdzvVap)v8ViF{tmupF;ptBt+s$QfN}+o%gBb5#)Xa94Q?piet@bO+~mxNdZ5ekhJN zidm1&F9H-7Clt3iI(m#bdio;YDq-w-6kaUX;;QGnxtl6=sNM3e#d`cfO0NZ~vTi=X z>$dO2IPVsGk7C^L#MOEe1rB(P>P*VbvM9wz10yBsse|_gBU?R`Rl3RvH+ov(X=IC> z{bf`gl_ObmxuwMghDFEQbx8UZ!74cdWCjJBT4( zh|pyK2laA9lEVZvdHdN1xpKI)uiRK2wi+#BEQ%fHY(cKsqb16f`7RcpB=bwt^H>r_ zDuB`%YdMV2&gi7DnDvP6bbT76>t0dw7CvE}kzG(Q4hm;=w@(l zanjA8G|!A*Wv+0-G{qTY3&HwHUMehv1P56Vv zBouyh{0Aw18PJPo98z?h8ZY#At4ev=(01(g7%sa*oB2(|=^RTEkvg?!H4wwi?)NKZ z{e?w36`!l+s<8ux6XH{T;RSD&q+rx{?Dwi#5-I>B^={j}rID_z?0n=J8iI=%(<0N6 zZ|SkvVy-2E&&#czIYyED6v(>lGZCQzCv}OzRK0B3n=oAo4;*OheqNKQ$w%y0w1)Tt z)p90Kqy~Q`TrZC=AU28!oA_v34s1CZ=-Je<}#qnOHY})rZPjZzm<+X`WYE6{PAO!_P6Au5zFh2V@J)Ycl z#whD#N#W&v05{qHKCGk{cO|aYCh7tYSV(!2B6T?B8Oy#}4=y+RgCuS^Rv7{U>{0YNC ziF43W;q07nMs~{BG|!9TJ{kBRO?d~~P$-G*XWJ+OG}S^%{32W}&86Xs@q;TBHt7Qn zqpgXl0!3KYjjXH4D}@rE>o4g5>s_-D@+1LOLYwCoQ!+BLPF0_I^4|PzF)9iu@}5tT*k3q) z*opJH{n}-a5PhSXSpT?onAk)lDLG)_DyTqb{VJ0-s=;B!_M$;0>u3U~)_4VaDg(R! z%y|ED0!dldnIUcL6H@zlJBDNCzN|}}YA>b9Zp*B_I#uExH_b_oU>CXj7(T4JweaPa zA)bhWw#n=~)%^xGUb!ob9Rd#w90!{gliqmgvH*qx+L^xRMx&~aeRrLj&^r>q`)i7~ zutFlElH}N1Zkp=dlMVE0k*IW-gx$y0*d~c_xS~{XH2fjKrT$Z?wF7~JHK_xs1LAO} z$S)k89>b@8!Ff6R-i}WXNkGu?iikQNB@TAh=Q!eRl3)>OA^8+Jkm{BL`X= zc3g{}U7}x@UEV4`({?6jGR(j3w*aEqrMY_JNE*M!OfoNOcMo%WEDG0Z0J|IEATft` z;xcr@YN%7$2MN-%1TX})cCyJOa-Ai3#lMxi7_)v}v-;-Cm1g<*jJb(e^rTBl2zk(} zq`d2~UJI>0nmM9E8l5znb?cA#87dcTxxU&*lqrO838%9I8@kNYqZXf|(rsIk55*0UBEsIr0t! zfh>Yz1f)2HQ&IalYTe(;Y_v)~UZdOrYeou-NN#LWutT7QgERUi{JwR6Q)QiE3 zjR*?0tQR_#TofC5`6I)81extzf0SXuJ03}*Yklr0|=l=O#d!abL zKY{v8hLpqW9dU*c%ZjYHuo6yH_MP)6( zy_y+Gz^U%E#wt=p_lnwPFPES%#aNBe_sdZ{p`t$gM59rj^49o|Z^YBI69v4Wqc{}K z;z0)^QpQ+piLIJ`$Qd6-CSoP2=G=O%Vg+eLubwX6HLAAprk2z3xwI?8U&UI?m?;&m zzyYkfoabyh5@I*>L5tJ}D-em)w`1+{0SZM5T_IN`DN{orJo=~Uc0|4&&-9_y(0SN_pUb{+OIV4`{~Huc(;eV0tPhWx)|WstZ_9N zeovOFmWbVF6Hj`3+~FLkKzTH^Ad){FZP?T!O?;nlMoq9GHH^RIR9^g5Qg?}SR-jQl zy*I2;_snBvGg=il7cnz>QHbIw(b*uT)U;ArrQt6x{ZTAIvW$C_oN400GO8bhK;fB#)l?(|Y0 z_tU(nJBiSOCqPO87+~=S>4j2Cxv)Kx#!sVD<0x>goU~3IU6{G44uuq%2YkW&50aw4 zR?5(_bST(#U8YdtXiex9^@U%!DQl+gHP$K{H5 zC+n!;l-3G|X&ej5CFmHXNQ4(j?gb~{HtpT89^UU059FM3sDsIN1$)!+TEch8%v?+vJn;Z|Y1UNJl$t zhN3H*0d#h9)QVT)?*oFt5gq3{AbJiK{zQI9CLsnSWKRkLqQ;gmLrWtELI*EDR#wM< z9cPY?o>XD_pL)5jzZ-jy?LYUc&XMFusOBa+?%B0NtBQfuNs*#5Ia{?*N#Gsr3(V(_ zO)%z)+I+CT=cI7XYCjx4u&5htVb*+YTdH}AvPv3odh^bU#*P8zwk7#~0>v&D@5GS5 zFR^D9eiOQ14&)|jLL;R{hzU3$WnC%!^*$P2q@xQ@1<3os0@-U0$LV$(%fLD zctTifXDfBOYclG)y5$O1xYM;1atxzZAs-UiV{P7t#C$a&WZaMLCH-R51Kldd^1AH| z0x*s*P?Wbmjtb{M6q6Q@iSa79DWUmr?_{hP$srXjx z2UGKs8o=$%>yiLcyTLcn<)EM7%Ld`)HO;o-LmaWTOqDqwwv_afiy>`&jmzhTNrqtu zu=dqah`?=&SU?&TbA0?WMtaQn2u4Pv|AnWksVZDjByR%^S4xMySUJy{7shQreq(Vy zVD%*34)A~a{@?>nZAsaCNv)2{Wz4A({~p)xCDN_C;j?D4n$5&dcOR3J)g&xim%kWH}J&3py6MfK1*hGu3OrY4F(o5cV-WE+bfO2P?Oxb37 z=5|c+5u%uMR+VGlOBte!U!NY(#hoet6!*H!?%H=1VM%mmh?o4Kg4zuB$C$7VI|&qJ zeN`Ns)MTuBybVgfSXtjT6=7?b%sOA=kM&E#$driaN@i=9$Ge4+PB5Yv_u_>xxZu&v z$cdQZ&+w|m+kq&oGbC8BzU6=AMZ)Vc<0IC{#Z8vH{21p9-q(x_u5wM-X0kC#Y(sUO@Z7=ZHUy01 z@f}CQkHMc)_r~Q-=S_D*=m>Ycmv-t6pQ(vD?Xe^rI=23F@Xw@Swx=4m<#AtB4F<%& zciB0Rby=23xTLnvDG2dX3(AMATU7(ICF%yKmq$&ml$=U!zCX2iLRlBchZ7!&$r4^- zPuK~V`Rh_HDmkp-x1D+$C6|G|uDJQ8!H9brb0oIA1_j|T&#*;!2J~81&zv-fafd}p zUmL5WTyj*&3cha_S?rAD%f7t~V&J`7DPxb-vN|${PGbE*g5cU%4b8v2^gexoZ#{`= z7ES3~Fx2DaDf9IQZk`yKkMGLrJm<;B`uI&DG;s_6h7~~{pk#q)X8!WW!`7Fcsjlh= z=jZOfbY)*d87?*Z*n5YrKkxn^wjMjIJ_H(EWoc!-#*?mKs3A}_F)9gs;n0>SM=*bf zPk_H4@EBVwPs5?j6Id3xDnnQ!oKCJ}UH*j{NK8nCskSh&C6=7z>~GoT5t(pZ{pBok z)J|ZIX>jd$kx-^(UNPr$$kdTp(^a|hxp=allC&O8< zLHDgSECA1pP=E{g)M-g) zd!o2`{M1fWxNU5hb(B`VB;>V&7B<~3ER|a?zxk;(i38GF{oN;l0Pakq^gLf++ITEK zvNfiPn@*|~CY(n$=YMSl`TwK+pX>H>f!t%-nBdoo1zQBB#qW0O9cH+b?Y`nM?1zpr z^ZYbkj-5TL?3jc+hHDkS|D7H4mA`e_S!8d=_p_m^Y%RUZWsD6hVll96o+(m<4xaIqy!?QCFWcwnEu`hc+ zRcix#3=RVzoQH0U<3H$lMe#5De!x>C*g!}_0Q)1CU zrY+BTy$e;e7Wk9oK$OD%o9d-XV~A&;+*{9Cdv--s%YVSw&HCi0);Uo6@yg-WQ1>YX z;>H>WE=uW~(ovnKnNj`7|7$k>2@@tBSBc}RPVlA$h{-+ui6PoD5GHqf@d=xXek|n?2r)%Nw@Xw!$#oY|9CsXeEY zy78DD|Gjx)gof4jSe;lDE@xqUeK5wI%)(mP(ml6-E-9E*_KfFm%w8&p1*kiM3r;i4 z36&6-V!{GcyTM!TA7`g4*&~wv#@w|B&$zsPP7ek?9}$JWo_2e|y5hHu`5W>e_T?jVYh>DnT*8cqvR_pWM_BI%u0|1{@v0SX-+=QLxaN~iYmwhuB3SHfZLA}} z_35M5-_ft`OMU6mC&Ag;ur*@G(3aekkr9Ls(ABUtbZMwOI_M3N5b}+5s)S;B#6MPS zwoeDVSm2TWbz=qMy10!0Oh)2IHx?B50&i5DM z!?!0!pe*}GI4XVzB$4icN&=0-g+}JL;QMPEy1VAeZvSh26@!l&PAUN(D}{Zg7>P^V ze8>`w6l@a>50YL%-OU)2}hb$8LLisyEvhVw!v)?gA5;Y#`&M|ux zIdaKaP{5pGRewe^N{$r8%g%ZIl}acC&@MEqLJJ)YH(b_Lve5e9(&UI#EBd?1VeeP$ zarRR;=5|o5nen9b)vPm!J{fVSTUS$M4!Y8`-pyi89A;$_jxcKy-JD(*jeN%UcSHO; z9*C4rzI0T*W=92Xb)Y%HLK!7e-lbeaKY;HaduuKc8nl0`M7)ZSD30rc3693(0ucP9 zKeh8z?LWk=Ftw6c&$J6IplT_T`QxCVizK-Ix6FPMLKgo!)Bg}u51A|-O@!X=A@nw* z5Od-a9FB+y8ZOdV{O?TvL)$tZbd*F8(w7)2A*klY#99vSKHrB+5+Y>pzcV59ly6v? zW&gVzZlM@`WY1%uAfki;J@Kqg*)HLDKf)CEXb~lhK6VCC!Yo32^6k=NCB)+R{fO@G zFarA-vl##1|Ng>bAv%**F>cdH%65s6By=}{shJd5l6AoQ5SznS1rz^Z|4ZQeJS(O{ zUFNr%JTP6>VOQJ~jbnVGVmUl9d!d&}dB0s*|G~~7PtW+XFH_*AMgcg|$xvgPJKpFp zMBTH#ZPZSda5u_p`?EIxAMAe>slx}2vDG@0-gJKh-*&n_;tZ zI1Rg$DNd41o*a>~78X`hj?OW~Islcs z?YXAEMdu2aNUs^q!;%7>(aPS1=dS4T_+@jlVZr|W1UC>HkWjs zqhK1BaYpIbo8+x=*Gc>_$L!4yBT`E^wosbdK_)8vE-@v{-JoU#?kX9xdgMnl!5GX~ zyxZQzIviaxNB_a}fIiygf3UAmH)Jy8dn-bTnPR?A;4~Ng1a@May`3axB$tHTskI8I zniuapSK7M|*82zh8}6Ti61l>f3-aO?wP{lvbGcj*VQV<0@(fYE4L&sr#4#JtiwXXeau$=#_)+@qAmnFhiMNDwe0BW50M=5D=Tq!n9z3N5Cfh}po#BC>1}P| zJ-?g|Mj7Z31&GkDZ9T!BF;^0cVS#db6F{Rzr=!8``UNiqaHtaE{fhWU1l;ky{?KS6 zTe*7`7;^8|nyxL}Vn4a8>j7I!V^^W3EV*5Ot3W;0D48;op{de_K*=8f`!os}qc6^! z845k6c@5|@ z^QWp2B-zErN2!=&$-l|G78>5#u-oG6>>!N>n@JAc$`7}cXa(!T4uPMugk#CYREMd% ztRp1}f$vHf4rf?*{Ta7R0m=uIu7TW2WCL$kKGn_$cTt?mu?gkss&b4GQ&rgDW++%l zVoah36c%z9#@vza&F7AhMK_`4S2bl7xLir4kQkR%62F!hAH^XYLG^ymPO(Sp*6cwB zW5~r8c zbGh&V)39a4g(9XputfyN`Ik$Nzg%vaCdum_nym$}j+csaA~sH)E2pyKnGb>ARf(Ar zajyhoCm3QS=CW`u#YBz8u;Dx-rL50e(~S$9fiN2^iK6ZdG|auIkYwv-Rcnwp3`I(F zCP#DdG0Dpbkne5&6*0Ga-zR9Q*)n;(WrJ^Z=|2!Cb>@$`HOZ5z+X^Llv+_XhI$qlR zGsNLPDBg2RJ-Ha~aPZ_|`$5b;YZ6N)y=+|&ouT5_K!3j49FAuvBu*K~+y=S_KJW0DXaxQ>_32kAFetX8qJSDt6N1Eml zGwz&GN76$L)3$RDpOK4|4{gj>c2xx^JI(2G8jNvXLZA(s`u|G*Z++$RyDY#V?@^Gw)W!iHvlvB&j9W+jg3{C*s+{H9Z9>Hlu%&!YX?5G?i>?hS=V0Xgj zC^$ha&J_cg8=-wN*CYF9TUjpSqO-uMtn4X22s1G{`HjO8Ad;Z@F(mXjX>7Agc`hBh z-fn}KHN_ZxW7Zg$(dDtJ7#T4{TMKdKmlw74Ozjm2c=TtXY{qRVYKE}@q3sE1$g$GK zt&3LCZhbp+K{l7SaCI4tSo;|wyZ?)1{)gnHD|(5W(m0(4Idk8<_r~Sb=T-DLg$QX= zquAdDJpLd{?EpUM?*`kxttHhOSo3Fd;j_q;e+f#S;a_vrZhAbcg*NPOK@(8{HgP_^ zgSvJC5^DHqIBQ;OpA~hxa1>Yy76;Lo;wc)js3gSSkwSe4FZmiONaZ(7q>7-19rsuY zs#dsi?|LK+sVpp`&$VGPJ8a$EjVtN(Bym&e2BAJ5cI8TG6kMH!=#vkkcZGC_BF6ygm(<)ty7_+13`sGP?7OQ0${7 znqRd)98k%~q+GuDE&iI5zs@B=5u4n3&s>7#Izoa^&L*M7Ue(rZjutOx!vFX2mt$*F z-qy;PCAOSYVm!yi{7z*GC?IWrpbPJPmA$bCuUtS>COC%&$q|(VP5`x64!2h)_N5W% zZOH<(%L21b0g3vBuDI(s!MgjSW1c<#N+KydD{)OWmk!I8a?#-1)G%7M?G7JTO+OLH zIU*^u|NRO^Zby#X9Q=G^S3eckm~z)Bq>IFHO%0Ejl3-c1JyV#+{aWS^QcyTo%Lr7} zWqj@V5Ny0gru+5V5A&eXw$}VoSI^SB$EBaH`MxEiXMMcJXkNnQ(!8a$p3W<_go(AJ@f~g+5 zrpyu&DM~~+o=JSoaI#PxPL#2w!YTA415!4N3^x7*a?aIfQL_s(eR6kabu!sJ3jKZk z+t4woyDx43BiD>LEV-ty|KJdmH2fRG({AR4+0`GU=-}{d=#^wOkiwGHs+;wzY2(I( zT{EANhaIT#CJ3l5Me=zmy1aqNsDSdyD18=iC?SClI`-oSt8~`hkll#5*5AC>sQTXL zd7yU?Y{<9y&~JJ>hkN$h(0?3WRb6B5U;AMHO8-YV<9jAZSJ=+V!%lmEr{@*8PsLa9 z9lH{CMpj+mw~($jKYzzDDIXJ3zoeYgAHbk*|3W?Xsd#yW>IE5uwifVH5xkKa~8cADduAnn27Y;}*0vA2JaxWEVgdVg;fJOmGj zC_Vqa=)2u=+;w9qc3L`qTUW9(aT2z%+uJ`0|4FklykZv|W!-!rQmE;~|2jZj7VevZsnh}X3Tp%D3>$M4XG?8jY23+AmpT;#lKyUE`TcCWsBZ28wpfX@v1 zm3&=y%i1??U5%2{+~q-WJrP<%Anvs$euW~|N}@9ywUXGxgQ^wb$gYZV=3^`6b5ATM zDof)M@TR-=pr7{s>7~E!KLOszaVU`%#-2$JG;VN=wm8?JM-~p6ps%eu*57XGT@+{D zKT4S||04jwMQaUvlPk&!==TgP4qkA%E+L%v@e51@L)_1ILRnA4NmoxTYqmt3>Z12E zN?z`F_!30sE3hU%oCvIO@qovmc_HS7uL&!3O#cC+dxvYnWi5VC1?oJ5Dq4MfJy9;x zJ?%R=<#BoEKu6}Vj9N`>@K2cDA%nzqEeVeOdP#pBa*ixPr@8tT8esEgPv}P6$VMA7 zrxM9OVffyzl(iFq)B;XG&}HT4_BaJXC$(c{we9D0e%6N`g`XZfDWEnI)Wi zyWMF6s%7bMla2*yF#E0&_(Ys%S6f(fk%-foic}!SZiJ|31;3v7M~D`z+t{@@eS3EB zS67@zF|m)n4-!M0C1`)LHn2n-Mzv~B=17-q#yPtHig#;tjbojfh1Mcv zECnmx>Sb`;jvoXc6!hev6yPnq;xxKV@}Q}#rf0z{`?*co#**id#3UWS1pC3Mf+oTE z-VLPE2dJ5_lK5~&bXA$^)V>Qb$#DEPqpM=cv-kPO)&U$S%Esp`Fn@+jrVnVTR&6q+ zpJ%vS8R0oeD*mdrh46IxGb^l5!I9%Mn4^lHm7pKZ-P<1Yu>kyewO`_D z>6`zrQDqoVcZVTKnpyKM!$ZB&h9$VByVlBdO^F&S$9g6c{gL3pyanl zOr2RnW!(z2me1)SLa=?YGyikIoKV=#s37AnXs{$HpR+X!4vn*>-eTdEO+#=nNuNv| z&c~UN(SUAFyh^CiPu)P^&Q0-e+For^LJ=A+-xFk^{(NoBKyiSUj9|b*rx> zMiWqwtkA5SFn+S;6-X=NFbWCkTV3*UXShrv2;N}s5yKJ%(Ueg1lskHaq;P{~=V~NW zr%mH}Ui!IPYOC5TY1W_h=R=g?-&%6JpgV@4#XI*st|YszQSa%BeuJcXPa(9E@5$%e z-wR5fHOzbin@@Q4?yWmkGRd>4(P!wSTnErEKvW&FG+Tl5*fryl>V3>JpFn3*KX8^4 zrql>dtz(9}MB386i6z@wuQlCxvbU$&W~MbJ5J%GD)-w(=y3Mq>{`k1fjpO!=&|7Tu z*{BUYGgE6Sc$;PXBF2xV7Ipdyayfv@Nq|mJ%>6~_=9HbJ-McT^_^oMPpk%oFF0Te$U)67A`pNs}{uiwsAcK zN0cEkKwErsuYf;;$zj-jBCk9>9$Vglb!%JH-rKlH)+|0x(HJ^joS)xE=6~w&216an zY6~|VG_3Ng>$08^&>*P-`NzB`$g_4XVPuG(*tm_3W;P*e%voF#YOmOj7@m+6k*|5= zJ|On3rgM3mJV6^0AF4Y}zUO9N%8Gs2sFYgkZzti7W)f*nuYxq;pg;;EU5JiXgz+@v z{}v>Ad*BBDC4ti8Wl}QVE=E$vUacx%%!PM_Njo!WBa%3v`l1tE*&w%$g@%pRY?>77 zAcMEd_XEXq>z3IDj8~ZkUX3XHGZx}n62ANlKsLTl*TyQ@%zW5s>J~G`{xepysvdNL zQ`B(`s*W7sbPc7MdmO`@-};q4u$N~JD;(kw(uKgF*89t))s&=~kn;P7=lvw9g8+KP zUjoJzIWR~%zs_)8rcTjr!2nU-)jlcB0bA?S5l-sVp-q5dVRqN2*j)DF?eAuA*hUYRkt1Q$LIR3Ek1iN^zdK~N7e_9%o}wVn4fgAWk+fAq zLO(y$&$-{4Zx_sIa%ZlYwinE&>VpwIKboV93|(0D_%6gdyYq4>z75CD4&Sa|X;AU1 zvn9`0Vf&fIy)fgs`;!?j6*6NOUF{zH$#{$+g{_;%4=0eu!Ew#XsLi}bd{BwH)=E&Y z@$w1N*2czZH_sgMsmXV$!fQ+w#+hy?Rs?E&Ep>I8_$*m;+-6Thk*f1?6-xoZ+Mpv@9db>1n)4KP4 zhyAxqRNYbFfSe^){`2L%GBj;$4ueE-Mys?Zp{-GoqS8PrWkPx;!llN9_U?7IH)D$Z zu|LAMF8c3bB-1BLG*q9yyKM;KZ^(=iX+GUMVToOOsmh~t z*_zspFb(b}z_@h@#_R}aa}NwX>sPya?T}fV8sRr(hcwz2njsQ6DP3N3zSESK^fo>x zt}3%lgMOEC4}%KjRNSNsdx9YV{m?z7cuvRqkQ@XBE8TWvNQQ-#owzcc`XB!A7nT;v5G*D`8T1@WT1O|)TIB8v8L!4h$TWT%!_I14SDCt!_YaELn zA*;L)A6=4azT)B^ogcAqO(sqFzd~B@b%TvOP~Uj)vY{ ztz+6`wx;^+E_r+gyg*;0!zTi#XLhLzboE3C6jG(9tD+)3lMRmQhHig<)Y)}n^70~F zei4v9!5uxkkj1l|HUW(lVjy6Iyu8Khg$WL5-Fa1HhPf;RfhC{%FPTOMA!>DtKT4Vp zA5DAT|LEL~NGzqLT}O&Xg4GLQCSfK4Pi}?8Yy~&;>uKN74T!xm-TH%6W$YGQPt;0i z^m!r(@N{}kCEXEIw*C7v-C$zsf)nIo+Y#zf$@ZJOr$3bdSzSm(%^KI+Dh-71%?4B9 z5O2X-u*Slegm&it%7G{yzbYq6b{UDBFvu8Ya2Sy=c|J$qb9J4q76#%I$fjfu6V3qB9|3%7P)2iC+eLlA0{Sz}@ z|M1gC%$gyBjp(|UhBK2(H!`Ari??m#V0HEG?Of20fZMT^6M?iz!f^~pFgezT%t;0Y z`ZEGcfj0G?-?>pyxc-h#t}ZGLTCc}CEXIfs+eYwPx?nj%4kcd7Sm}Dkho}VXtPHA_ zcmR2e1cl517H+gu`j!daCn*6GNlBFUqQ03cr(gMj3t-R_&7jt8<@Q}4@Au^%Ua}oY z=O6E-1Fp7w8#2BNgNcdO4pnj;54~65TXn+;nj$))j-}YKQz}fj0TStLwh`t#{Y~p8 z^3cZk_&mQC`+m)F^5P)nO02VQE!c7>9zkCf%^TLIHTYWlca0x=*eq0*Bib&y&oXpY zs=NXf+w;y*-qL(Ajcb`On;X<0kB_I>f++hP0$KnlxvcN{Z6)G-;#Ge1xOhH~b2L5< zft;^tF~4V7F>W4uQCAnhBWxI^BDvvGeDA?uNkYm~sVuOtj@d=BC9jh3(J4uuZKr9o zhf%I;-QT65UpDJ?KfYlO<(YZqsHLBWnNIo(!K4HtWhMA4AIqMXIc1!swB&JqPZh8Y z$d%eDd|+x@{#z+v3hu3{dV9PLPweSMCm9w`?8J6rO6p^THk1ozQ4|`UU2>O94s+}s zS9}}&S@CNlXrtDr=Gn1ZtpUKViGI~RNd^dh3ckQRO(On=l^Jmz6}-A@mkWs9v_ zU22+C=C^g@tO_VA&J|c}^f_~eVcN!7YN5$9{oRrw4efr()+xh-dbM@B_34@IZs%Mx z`NsB(8@ig7dUoaLyJSvqOE294Ud&O9)R?b35({3jYUJ?;-#3t(_0Pnj>DSE-bYRr! zv&_<^bXnaLQ{)B_j!|(=@kM%5L`Ea8fkj-KW2=HGWobpG_s0ATl51@@XA{S{mhZoLJW*Xj^%wnq_NRWR ztEd^WS(V76^a2>Porp3>d59duJK-9$rfiF4u%+#HSr~Nz@$qxr())cw%EoqSjdyPZ z-W-57^rLOd6BwHp45)-OaCDUyqGdHZ?HL#k<#{>}=t1GxM+#I@X8G26??%6<8uxY5OT%AKxRVna++?;MEF4vM>)p?g9;aQM)I(ZX$MMc6o!F!%5I5_ z!M$*zL6Xxnx74g{d`2!zO(u->sphsgvwO+|vbfeAHoSSpX7E$x@|xIFb-jqBNXzbM z*ConuWJ27MlGr8%6hvTFKVRtHG6OS4S+*fab^R{?tIy#^a0On_Y0+zj?o~4?Ae{Gz zs=;e&zW+hQ7Q*|0jYG1FYz2{?@%yf*)QSUEk@e#2rB+BPOe`Yyo|v>y>!M&Eq>eu5H9_1L6w^7T7^xLHqLjU# zyENvbqeUw~y^TSa)4b1K=mMB{7(oC$d60qtK|QZY?w9w&&fz`{h_9xRRrJ!>Y8kPC znZ)NZ!-BEI-1OVsDzQ5{chNVPX(U^w1eboj_|TDH6-oYT+-wgt!`ByVEtlYp6>FVq0WX{!w%UQ1Lql>L=#^Nzq>(eVDA@YOpVru8i)r6o z#MsmNj_?=xtBQuF$?BnsVA1DLf6`wGm+n9Nnrk1#T0fpIU#L&Tq2?BU=kzT++PRn| zx~ZVMQmZN%g0tN7hXX7hvjxK9e)S3d7KB}m2*0)f$;DPqwR=DWu!JM)yhmjh$4%hp zn$%uN1o@Z=`1`l-Ro{vc#})5+ z1^uFCQWZxTIe*D{U@~Er#+Hb(m!n%_?ms_7dN#9X?O;uyKM3hpBr7!)N}o3BS8Yl~ zy;wnaHK>zg&qDfYk}Up6e`<1Png4sT;VJr;`X8i&aMhj1eDC6_W-t9qp=vF%B$wIC zgRYhZ8p>mf=>azgdC*PsaIQNzE!M18{M%x~poHij? z2yBf8E$seDHG5VQ@Lod#uly%w;Z@zl(W~-rBi5JeKb%ZVvQCC1*BqTHO2i`^(#!{i zcn)Vxr%|WO0c|VpU{Z{UsX|tBJ!ml8Gk@}>ZwG&{-arrG$B<%&u<3HwgO051 zJLzGr%Iyf2Jrg3G=}CNp{FuQydMq_8iW{uNt;_R_fVR-0Pc_3Vu#|``mUnxg_{;m3 zTOy!QgXeA5GvB{RS2*0e^&Ni{3%!~S5zag+oyZ5oLrZ>_XsdPR&fN2TJpY4q3_H{&xSe|lf6DrU^l3drFtr#S zj?y(+_QJp~J^tO8COS5$ufLx))S@A-KpH-5g(?{pR>9L5D?OhAC?AW^Vr5?1+U%CF za!jt9){*k9y121g*WfqEir-6!5SwV#Xs$}$GdR2M$JqFT^v(Yd()HEo#YzcdhehwF zrh6^(JjN2~jha2Pu5xD-@1PPMYE_iUww3-=#-{ifQ7AG;oI)^egtNYw6T z;C9EvmW%Z)KfiMP9N==XK-p;%KGft>TTC{6a&2 z#4d@$oxzva^u3~oXG5UkrXMQk%As7ZIk;|0gMr@{S`=nu-fLoRO(%*g;^~2`lFNBe z_dqdcyEX$VnT2)sa127|q=|Q+MX;dBz$o909}z$0$kL*d;?JrYJZTns{c#5FtocYbPV!rd37wlmPDm8|I`_-qjWh!mQkEeYn#hxh@LX7 zIrDCdqFtt;^BVqm&ejWdndKr%c*3Dp(Ct~Zr{)?%b>ui5-vL5!YZ_a2M~V^O_an)? zrStmFXrD8VX=ikSCvDDrj3ImvGR-wd+l%9+%SV-Lu%VQG^<{m`x>W1)|EwpCTbf61 zvr8!zMUC#Ac}&Sb3JTT&l}ja5rf3ei8rte@Vawo{x{^PBUm zYSe)Px%`n7XX`r*fhM9GeoLslI!CzOwa@5Has>f-i3}T@K9K_W$%;r6(XwdK zipH(h1RkRfo?f{Gqsu88O2z}*f<*_tDeWNWyXflOV|kawWCpS`0IRd~d$|=Eirrb3 zmbpTPj9%Ol2j$JI9Lo2SCM!lWcO5La5AJs6e$V%O&wZ*+ z)v5Y^oqxS+X7BFZyL+u(YhCMF%eMt>i*PZ8_YeezbuVtEyJ!m{%XFx~8`vI~EznXx z^3o)_eDfNaH9s}Htmj;j{J$T<{I52r-iEky-ks}pre3da)MMTgz(iwLp#57^M4BUh z7sJ{iVeAk#$IxNpvM$xBQeN!ol@r2YVVRY#w!$@FZN|JgLlQaRD z#5N4`lzsvnhj-cdVjDCtc&%MK=%%JF7pTmmZ#(&D&tiUuAy&bXqpUhbm9Fve z_Sp;3T{$v^-sBmC)J%tFHAOl`OIOyAOVFlu4nWsA2O73o)P<|WOTfQ=^aV|UVWOYD zUk)yu8_EzT!%5SGDmS;!E;DA{)q^TaYMYU+2UAV#<@NuP#i1Iz|L~3We$&p2QUc>9 z($tuHnZucZb-t`qYr1IDEn}ZREOLtd8Cnfa@fljPLQ|C(x3$Gj3v;b}P9h(qMxK4? zkjb*EJJfS9aP1@EIL#Q(0ai1ejPPnGXq05UoX0E}wF`BPkvgkOVQx}8?$zaIJ9b#d z&$5fCZ`U`e`^k;vh3S%b26jd7fSd;NR?O9`(<`tDM%!BAlBUhqeH+2Wi=>arLt9DF zGGl3?-Oe);WjnEIHwF54F=+?A>~X>N%TJbXH5NY}jcEn5G7XrNa}7eQGUOHWI_6P$ zEX{qZ`bK|5Ss4*^wK@NJ5b}QlXmIm8WrZ9XtBc_oCSr8B1J`c**b5ibNA!*a$@PD^ z25Ki2abYH~Wy4tUtSh$xirbXGXDIDWNIXngjdc5@j$f8h)DLQdZt{T>?Vp{AiARC{l&NM=WgNA4o*kVc9K@hkR8Z;9@9Pf zRb<``++W1V#1CgCY%?PN5!x7Eqv`)IEw=G*^`_fKf0%v#1h`{;0%!^aYo4`^{xz4t zlltODQw;JSi*@`|>a_bR55dqbze)1rTUhB#TDw3s$%e7`=Zpz9}= z40;VQ6%{}zaSjEZr=|^Eu9E&X?^#)?|AmK#r?81(hbYS~6T#yCGbdJu0Ti{9iM zozib#IAhcK0`ppTB}uDjS6_YtO!n_bb(z|CJcxNCKL;!M8!=zplf_0h6QC`9DG$6| zOVJ{uM4sPU=JN~jQt`G8eN~yh->O`75_V*N0`(<=b0GfVwlmAmrybsv% z6eXFC`j@pGo}9Y~%l(GLum1h^(!p6ln+k8cmMV*OiNjxvr(DEUCU7k`NfY@C(U|lX zi}|TAXe}XbWGs079o}iACbMq=hv4m&LeYy(l0@hi*MDxd3C^RWR#@_v*RTp&GU)=m z?*HCjgx$(#AH~mZzuGR*n0WgH@G0!)(r8E)_bfXj>k!x0RUOe1KKKm=7vXR)MMe!Y zFTj2uSS&R?LnuoP|HFe*os|CBDDscyx+KHMt#cS|zg7UDm@ZmG6KPJ((vN*+Vhl4rbH#Rnha4qG-I-b}oCztGJr%?ybN8RiJ=q|`JmW(d|;!v!RSMx0`ZS|>9vDj-os{b_Wp z=&-kHgxXRQZCv@~SS5+CCo%XFbh-3`buFCamPHr{fJ}#=k!h?oGdcB_ZDW|3?AkP+ zWDGZDp#FDC%I2lU{*s<~G~b|MGJIQMQw&$ki$+asVn1N1EIQd#7^9R)d2Iw#pOR>K zA{`8EL^cxEgKI1{L^H$asaM?HR|?pKyq#UKnM!aTt!3EtRnt!#SGIcjFQsgC$QM*@ z=7V&o!_=`>TQXsUUN@8+E^F0)fVS(ciZZ{z4AthtaMRf&FLz5iu5*}gL0LFivcR%J zaW?a!W2Z~$erx@Yy$Y$DM089=ecl?uW{9%>L$a`D7mFROU}YvK7;eW z{-AO)&$1QC82&Da^#x3Xo>zDS)k*eucb_79W@f0#{Jfl4TtjW^Tc{pJV#u00d$B6H z5yW9SH0o=9^;?%`>6HY}2=nQ-4j7EwXKmx}W;Gf4(Y`;nHE4*hwZ#^CZT{>_y1=ijub#*=0_3q|WzxsLY+Q6`*e{(|-QuXp)LGn0$veyZQRh7HZo3fFr> zTbGLcbU%(FJp{)MFyanP@iH#f-~?^`SM48EIToPx!W807N9ar}D`vz?5?%YW+gvA> zcCqgtd|k3UyM1Z3ulo1*1J6d-cVB0>saH{hkBFJkDkuedbwEdZP_~85!!36Q+|j|6 zX5gb{($bv@=!o6UZlh_mXtEJdT*mFM>e$936(LupT4Z}m30%nOt$q}M_1oMV4*h-t z^aO^8^!jLhw7?4_H%h|#UWCyW32qi^%*rf%4(NVcfRM)?UZ%xAICg#=CH#_@FJUoU zXP$Iuq~SO=)qRX5mJ;pokFqOv{{6l{*LB;yS-f%KMTK={(+P;v*_CydJ{xaKKcL5 z#HpYtmDE;F2%djBhpU@|8llf5?v~<-q7$WeC{(Eivku4GHr9Jqdw`5|6D5unRdKlX zS!Cev-c@`O2;{z`R(pIrqhqVVh+SU1jpc_&URJgHZNBmCqykSU+JLOWo3FBTbh5_7 zWVPdp4PyDmR?}>gj;)vwwo(uK-e*?!axwK-9zAciGTip1Q31{`@Z94_j+D$=$wd1+ z2V3;(s>S`l%I>a}QN_G%{RKj_1!@n=K6!`nIMKh}H<=M%l`#&PjFA4t4N#~S4+8J< zhZ&{@g#xnmf@_=>OJ6-?_^yp-$)q&zV+HRzhwS$tB}->Fp;HY###Gn)wwJ)<)#)dI z$kGz@Uu$7TX2fKzYn7NLq@l31Z`m;EQ!N3(w|-OG?Pza)v2Pi&Y7GY6=d-3W20Hqde--GMVo46XntlXNYAckOy#V*N(7wH!Ap_Uav7rww-P zLY(93K40KyhlF9Htf7-<-pS9O^^LeroChr?Q`9TUv1H;pbn)~o&0+2~#KmMnQH4z) zfxwXZ&#noRu&k-?+}-*r5(htU*SQ@QrsW?LdDm~Kf6g;kEDJu8aeloY*EVbw`b3Wh z7+eFqNDY*Jpv428@MEau32j&lDuI2w8j-R+hC1XYwNiP@4e0>4Do5Yv6Sr#lRo1K5 zMqld|D^+UdUUU7R4B-ArJfR1~2w|U&$}Pooksm?)!9~M}zwSRjN%dYw3Z1B#A70q5 z`drkYH?!PfG^+epPI^d^IBh2usA!5e6f`_>`3RnCH_M>Os+3Zkd^oj2N^t((v?FFi zrf{tNvu|fJ%)8|NZ3ftsyE0^8^^dAi6k3Pi&DnZWPrK5}Nu>6bQbOwH-3c}C%e|d!?ln~h z(~jt;2jdaIE!#8}?*CVboF+bwU1sWlusS5fYV!QgnSd1@4rO$8@Twf3V~P16nk3Y? zA%9koUvBr~N~%@?(Z4S8kxaj&?J|0Qk^Th}SCZ>TCBwa+=K_9M*%z~T{?QwWW&fuv zO9AHvR{1avAFFjP*=1B(s0HjhY`>bn-ZSj`3@$IHyf5C%C`d5colf@7=%b#g zh6|UVP=VSq57evn-hvBpAA5MJSK{ex{~xSc81v(^kjTDZ^rjNGhIm-sR9{|XSY5-{ zAzq~C$BcfZ^a+rw70GO$^kQ+m$n?t?daYlN;&NKcYtPxET)1}2n?&eRb@KwVaeWSOz zXr85t3nWVzRGy4ieFdYig-w__rsz#}PYXX6>Ze%We zcE9=YIpwpzKWn@U9*K+6g}>J;rFC0on*L^$&sAl5lda6&oX*}%x-isct^3>-XfOY^ zlXtpq^TbTET+V-I!Qe5{4zT3{dqek__8#6bbnBR0U8&c~thJ;Q@i}Ucr9VZjJM5;i z+Ie!od=?Tk-`uihB&Q)PeIu99*~hCSg023FG?v&D%KmKl)0gr~Y&%o%= zryL^`rdX^woVIv$%zh9#NEDppDK;~hJntN~I}oycs}w*+-QvX9969u$mG`zPLMrZz zAf{6XL&LF};f?7<{~fW=)QI$v)BJ4$&ZCXAw4I{2H^;_XbZ;Xy>6BTx+Tq#jq))=2 z*ReGpb6{xmi*@pt92-dOoLOkSPS4q;0pC#hlJ!M=^<1fD;sooo5tFy?SQ8S8wQc)n zRU%glSD{HwyiNZQA5p2;*;3rm+k5?W?Ml|0;&HFGm86Qml~}2}mZ?atyN$$_VZ430 zwyBWoSx;ip(a7fl`joH%>6q_amL%TQc8%DhOj3-2kTRp1znkI3@Hm6NHM6>{zZRl3 z&Ve;{2PJGe>w>#F8Px`MWUX+qR$tR4O>xK1{^KDJ<4=Ho39jf{o+m())D4UH&Avb` zG6O-{p4-YK&)l|;k~E~pXnid8ZV9o!XM#9_hFuqa5TiwZS=p%=qPy717@>d%8ov?) z&v^^^LEH34Uln&iHMW616Pv?%w)*!1_rj34!^|Z&&R^4`$4Dte^rOmzl=RjAMtuz~W8@E=DUphQP+skisI4)#u}QbQ zGm}_>jI!H)m7Jv`+9SzvZ@>NzN({VnU~Fy5xx8fd1TbA%fQdci^s8rK+w(@i_Uj#uHG5VyM#!>Mjw)` zwflpL<3_C6HbOF{**}O1So7JEw{)_qfraOS@)JtFO1nYBX@hw!qCG+3ZPJGr;xeF; zlNX|mjvpkXgYrGQPEuHaHkqS7-VQ0Jl;ZIgZregGKBXGZv=w;e9*PXCbuBT0zGb2v?#44*Q!ei@2{yt-xc&eQ%Hdh|b(VWcZ(;zb z@rsDe!K4-TIP5V!bNXPrPi(z-dN^zo>bMD$?TNOHEJud5TU#r8=4#ejDxRRvB04ex z>9}|(_8v~p4T93O2E=xT=hxj`H^3-_HXMO}DBo!*THT@nFkaNF2^Y`Hx>v|l!`>_*Y%LyZ*o#+O{ zONH10FpY4!u!k(V;1|mjPM`gu$j!N2cBRv+)ILC|um^hc&>WmpJ^`5->{>t`qB|eK zl9Tm&!20gLH!M$pQ#0Xfuj0DW7f{g5bY9egt}j(fw%5VhFUhC|NS1t$`tb4gN>NJv zv$qq(HLK-<2`?L*@q$J6P8~sb)SjxKO}gLb3aRZnyj{9ve8P0WhdG^JEZAqFq39GcsDid z9P#H=^Wo!la>%a;5pkmV)Xb%2;rZ0`9t2`3vPkqn2=1k?M6KU6yhlbs{OZ%*sdf%S z*#XUPjjq0a??bX?ndsU<{2Hj!t4r6H_wRk18eH`7nQqqW3&3jBT>r+Gv?svlf<^D# zrDi3;C{@Y+Zk-}>&@Y36>=82+LKqyrkY^NamVLYG-DFRH_Fp}Q` z&U?Qe+Sfidm1sOdW1pcy{C%+{GB}V+QGiiGiZDTF?5LCIrZGYT)7fS+LbC?Jaf=qNIy~#`LG$6>5M~iu34UN2ufllaxWRYj>A>4 zO6{PVZg$X(l&-;nAGXkKJ0TL{JZ3U)Ka!lgB9A0A_er<698&SA(Fm~r8v6(}BW}`# z{n_3zmFEWOVrGC{*P2t|%80PMtn`ZpZePi9flol8@o##*%XifdPG-Wl(usTUj10gxGQ&l+JX=1E=iP`KwILMq2MWD+$G)gIO8yC7}G!Y~b>7{3XI1-cE{n5EWBt1kV!# zD-AK(*!9^@KVnf_2L@%QSv{=1M1U4(6>u;L(%6ev#IuyQ8M3QR9E`lj^hM{bZhQ0j zZ!{82n)9=gulRibd-l@(k;C>g8gCX(C%O(s!f%}kYs9_SXd-s~(Q>$M1RT_;mk{GS z$NEs_mj`Z~FX|-^bC=Sg#QS$+dG~pxxAlxq0NsGj^Kb0G*YLw(#>ERIX5%eGpM8}q zD~|Y+9FOMb<8Gl8#|_41B-mo9o6L&tfU5aqS`vSCJ}3Cl(GTO~Rek9k3h&=n5m%|pM9$GTg z;z!2bWKuE@-i$gkDF!c>de5aupxqliGdqAGAtyV={~g80I-77{E6p8w+D!tF8aI?CW|S(y{F2v9~E+nj~$UngNBHEe}>Y}D0sH=M&s69SQc{%5&#%Qy+aSP zY`&z4gPYzfItSP4)VGcs>!erN{qLNcI02UiC(J#rD+)9V+VeJD*<`)Gl>ScdoNxbs z@C*A6bX+98I<l{`_>o zHc`Uq7f>>xO{1?eW2<{7Jdqz{D9}YB6mXxR#~jiV6H}pmYtq=nz0xD`0JTKbDIcd) zwxp{gjl%w=zH`W=r&x3RjjZ}@X~-q+X3IA0CNsO{XF1+2`H^0HF-$qJ*o(hbw8nAR zQsIO!YNm&6Jh?S#DyAEWK(8MqgIHIssGAtoFWUNXI;m`}kCy1&4g6|jdoyX}8vL!Y z?n~X*vSteT11#?apUlCNT}ldL5ne|ZvgUTxKzhTss#~F+A z>N{fxR$M+i`5R!TP=A)!AYCAiwCFKMLgy3$) z#V66crb*#zd2q3MMwZ?CZV1ho*}-zu`cDfxoeW+5VP%ur^K_5Uh#0ECv-olA`@%kd z2+~tAA)qFNsk^M@?je*eMs}LFtg4p7OPtnB09An|)NB91krp^8)a{YRnEr>Ta7e z%ao8FOT7erURiCAc*sNy6VlI-B%T#YZ9)7dYOr#uDnGgkuxXuI-|GH_T~&zcRaK-* z;e>S6?P*0k0XSRA`Mt!zz`9I;Kk2h8WAP;DW?NdwC5AlWMk1m}J9ximgw_;bG2S1{ z(w%JwqB2OYx4Q~CQE91z{$c_ES1B`*2Nt!b;DZ39h7~~DyWuez6mG0B~{--Nc_rfOv$z+`uf2UUi zNR4Zj214nE{zyyXm^*QmF_EsBVYHY=@1r-qCHXkgDxW!GT25nFiUl)j zOFP*5>a>&xTG+I0cJ8Q!^idhM^@n1A*yyd(j-*2ydB2b!jMs^aLcE3-E(q%Db=H{T z#`AH&I1^iO()iFKcT&PVbmUv>Iop-lm?%HUc4|4xQMq2&2G-c&ZzEAShB54{Q|p?p zj}=}nbuSN2e?0)bvU#;F>?VW}+K_}m%-m}lpf!LRYAmK#&BL{`Xl?V%!!5Ut(gcCW z;A~No3D^XeV_I?`=iK&R5Z&bU49OO>4PI%?9J+>)=wJjJp_HEXa0FzEH3!;6GU9P^ z6WG(Kj@E=i8JY;{Hj=C|o29aDMNX-aLkVN#A}Xfn(wqt43*ZYzMYALcCUA8NX9ms) z5C2B{A{d7IGH;1!y!YHSI{42*c$9EypRASvtOn&%-^H>V%a=ZcSKAuhqUqlD6!U+k zK>vR0nV2CNa~cAdE|hX8EAz33_==+39`VS8cZ4U#4~gRnJRJU*R5{2!$TbDs^g=Wo zH%SGWyDX|O7-Y11HA(Czx|~c~IQ=1BQO)w!sz3kub*{hlJ{r?hB*@H%xf4&jjA(7v z76hg9Rae5y*i4hYni!-dEHu3io3d z%B+u?@b0p*x4yMP$@rl4S;cW8PYM#fRjiJyZ0vrSqCBCM9=C`DZndUMqsm*+0Y+qH z59sKIi(?5c`S~HuOt}{B?k0381()(zMcv)Bv)MO;^n@S5Yl>Vk6d6w zc67iq`xALcSvr4^qA@hI-BRV#N~3OD`^exXBoy<b`Az9oK?DYI&n*B;#W1cIAlLBnfy{T)i<30l6za30k!T`Yt3TKaq-BeIST7lqB+rh1u|!| zI3_wiPuvy-@iy0$y0L4jdtrP}{tIBAglzRHTCC`MBQ zN&eiTLQjIFM;s~N!ojQT*2PKa$gAqJbS6KvjIF(`(xeHO8;;jH4r*#R-+#BY0* z%!AogPvT)E;gf4X;lr%^e$Kr(rPh;;Cxe$jz(Akeuu0f%dee4&1t*r7LjZq{J&*aB zD|K{134J>#@`Afs>@Ka{m{SVz^Ydo6OZ##76shn0uc=Ci-~$S^v{>}xup9|;L>u`B z@by`T!ED;q&;Dpt4y&u^3@H|o)(MvAjJU*c@1mg`s`K?RFVE%}Wa%5vPs1#PZSo?0 z>G*$0XUfFu@|7BrqRp@9S$KRgSukBHI7-kU>mnml%X6$l70K>?k!C=iMDqklt_72| z-`X25Vs)8Obli_zE$Bq#P&hG_lyWq-b2KAMkiqwpL+B*QkW%C-XQ6-avAO;UApfhL zOm7L>g(@5uPNCJwF;h0|7~VkXDkLZ@V;dPlTNh1n-PdCO$24lb###nlKH>hSRv_bH zq!#dH-mr*3cOrLg=Z#3p<2LgnT@4LuaIowATg@Tz>cfQRy}BoofnD%N@HwKY%X615$=LC;aDf3$`Pf1bBCRzQ^P8g+cX zE&QtX=ql}%62z35LX@wQ(>&{R*uiwB-u0b!XD4+OrDpK>90!2DMqt*`cIj)mw+1tK z55B7WqY_r@X8R{E`ZI4cfZz5v=HU{R*jwtoxomS{qY;mzf7FUM8hF{Q*JorDuDf%q zR!v?FTB-JbrfNbCw_7rN0@Rq{e-$@Y?-`{8P1p_Dpg<(Zg6ius4@-uYj=YB0zjez# z3a>-A-nPAKJ~K#7Gb5?P;77|&tW7m+k=ZdFoQl1_>QKDoyeN&~rH*2^m|Lm8@(Q`hW{dr`fGb=K3bJ6PU#8ue73A#ZPOSu|RR& z51~VjrqSy>4Fm4Kx>@9}4u7<9f-b9p$ruU7KlfiHiu8c+J)jHuOI`v(o=CJLL@ zc%AP5rpQpN>n26GFuj3}HybOZ%s=c3wh7c3o9$5bX+SQ1R_SzzL7j|n<4U$Z%`ma* zQwF<|xGoho>vI41MAJCJZn?H?nE$<*KRr1aB&3iFF;f*(!=$E8v=h?GWRW(D2aU3+ zkF1zhr1L4Xp`ENL&upf{~;^t0-r)#oxWv98KL7Rx{sg%H%>LGxVBb%_OW#)(%bI zjHKqa&|A9IWOfUYxqs|gKeW{5f7k<5zZAI93>anqtn{zn(kYS#4$5)kn{KL5rt>sZ zNE(D4a*ug>s|Gs=bp|e2Qd!jkjAENRt2DPY{<&R z*L2Vg!x8F89a=B-Y-f8_~k?ZKr2|kRCzimAJx?rgYWQ%r521o zHH+QWc^FKB9xUD_|H+lfCB}%^wiy!&QKVLi?re;~T)`REUl#dhSIsNNi?TCv3uytV zjus2YAQl;y+{bOr{`wP_=SfAVxj&FY6V3=GR0Y0gp|Ow9va1x{Sr}#6pXx#?I(2!o zcr3QMC@eSoMvNjL;{&cV>OXi?@jBnQMYxJ5QR{tT&C)KNr}Y0L@mKFEce_Yw=$&4* z%XufR>ic}K=Zl|vCizR>${xgmmKP9yE{MI^??6?+OL_U<9dw8zTFC&+VfdED65eTI zb^N(B-en*Gdi8(|>%vyw3kFXVr-Hs{`LH7d%2gf)HsW&ie%%)rhm_yl?zNt%0z%+{X!byEp`@BNff{DRhYjm-c6l(LTZC&zh1RmccmhDgf)0-xdruVrTqMZN`E83c7v;0 zjBrMzc}{MGWclMp`1>TqjMtj9aeOgI`bRj+>%-mbH4;mQHNT!~e}!%CKOKkbHqInb znJs?YcZ25FA%*rKFOo2r+deRTBB)TK;34j#6|w8lHP2jeEO039H`8Vra9Y|yVEpK1 zh0Iw3;u&VK)mG`>I$59xvp)YGCvBV7@P$%KUWPggTRuAJoerL*75J0w@Nj>iTwq2< z*f}0>QV;CU;Cp&Q1hyIPO1*HMRG2mEo?N}3hHQ#L!wF))qjQL48i)j0sDHSyDKy88 ztPNHo=PIrM(v~x1Owf~2^Tt#Xd3nA;vn1U%54K~N-Y&DDSJcg195KYF5mRBrQ)Zyk ztXtM^bbJ0fGtY0i_u%AFeM!s@dm7%m#*n1H8cCU-5D4&o(HEH_SL<7{kU0k>aaVI$ zVtvjT2Q2a05bYE?j)O!p!#uhew&dvNHpTCHOvVRfC8}&?+2l0F37uHg82BkJs%yA} zC>cnXyCA6P>3^7NU)iC^)yS*qrzh9jpvH_~do zAnWCXCh8@vvpMR6%^6=?S5iMc0p@|aSflb!fY+TKCzt$h_vf+7SM$wF-l_dW)>Ct5 z#UYs9sa2&18P>h5C$hn$(&YN~{7hfb=|AnEZ^-k|a5elTNB3uL0o zwLDe4xum6e9+Kb=@h*1|Jm)L7&w~`F=b5381HS8@3hN5p*Qu7`~8i^rCi~51eGaFW2j>Wc>lqC*;)SAN2LLjUTg0Tg@vZB**9 ztl)y!3;We8VOnp@8OHf0F3o1yiB~*OikOI)Z?G-%D<9wKxq?5M%5-?Dd?JS7)R6uc z>G}nHKoSW|ftQC667FHA7xKbOMVz9;Q0JhdfrX={`-Zvj;xK~HzoA@1nHAq`4vdW_~*mc&cH{&c!L=Tjn1GF8OdLgfkl+M}PlbujkO zi+x7Z26P=WtJP`c?BRsftszV&TN%FY9a!^Pw?b}tgW`7$iqxbCvC zi5;|Fw|-vtwB6jh@KM|C8rme3)hHtTB>S*D>uQ6BExDM)&u*4uGLf< zvYP)YtNq+4-;`c-S}_Oc%}=WPlN;U*1aEdBRzk6lII<%MfuKhyCmBw-t0$!(Jid5i2wV3uV%6)RF&`2oSdou61 z`8d*c2@79_zNJS2p@NH*`~`TcfHa?=^Cu;$j`OzZ3>a(WJ2v>c8P4 z@z*2Le)n-CZTxg}S0*ULKG^a{PK`}LP-HBufW9@}IiUOD#rkYD@_t(Xvs5x=4`@*F zWOSk-ZlC}df-*jo-2*h$i6gj-O^+pM+UNPF_8eVfTg1twMyh}?HE0F<&A7gkkC%Rg zRp;YS1l7LtTeEIHXb$j1P9*5MU8c1nZuVip;)m^*0QZt1NgW+-4DTJQw7@1mMQaCF zg2!~;Dk(Owwm5~9os)uPY*_Rk0*YM0bXt8~3uoDyv zgej0XQxKqwMbtMj=2eaSJi->C7I=oW#K*m1MS18&f4lYUQIpm^_@Z?42|&;u zQ+)hNe?R6CX8Mj386pkMyHEc>Q1d}8^{0pvKqER`<50*f9GNs?fyX_3l6Riw z>QB*Y#csDAL+dauwQ2Jm0yMwhH4kx)x~%s^po?BhO3O9FqzPP&IKQ*g-**wZ$&!|4eeO@(dP$Jpwe$@vW)$|&Bxo=~vr8P5J8!z_ zX$9&HwI)t6`^#d|^TEIG9h>r(5OY!00Hv2L>x}HybJL~O@?bHK+m^`97lrq=oAIX= zMd3YL6}SeGIhBNNU8XwVFDdQ6Zwc&*y`$Hy@%(U_HR@?>(h2-iHn5dY(oY%ilGcB=j6(TD_ibHNGbDw_7^dnQ@0&wZT1wfyFmE^(t6Q;IxE0B;9lG1ba-S&t z4i69ITJXSsY>#9NnMDxm@&x#Gg8VA7g(EpsFa4f(KK|-`?0=2wQk;_nGu+EPFYzwe3)PX=V4B7+2+opX!2#h~wO$2lbyjlZ#A#!!o)sJZ>(} zXUmc4RvsK2A3wp+QUh4t2O9mw15MERlabhwC3}SRW!J=z$&s!tiv<_XEy29Cs$0EW z_^DDauNUPOW$CGmd?pfH6^pdyF$WHuXOrKnkfcA)5ETorZj% z$<(eKGut=4tA94qoR~82E;&d<5Bn*)I6B1VGu#n+<74*dKeD+=5&Y}Sa8c4%< zJ7H0azuq0@h3PY!drwBxHRt06@SW04c^2>v0awe()GYM>hEixJX_KxKUn@p+8OS_H z_8UF28{2jua~6fV2f)t3BuUrb>_dE)n(1J42NS*+;0J|qOVtBU z)=@gc>KZ0aECA%hDfjt%rf4`LNJR^~Jf|uv_t`oj2S*3T5ZzD*5>_}goX3xpf~mf- z|HNrNS9zrTcm=b~OA{Lc66F;E~aDR;Q=m-l4^7wj|#y_nq( z<*e%CC}_o#)FS->Dpa}(2ewBFoaj`KC=}*6yib5}gvCkSmNpBs1&|g(3z^O^$;@mc zhMbfS|H`%aYr(_-7mnw}sQ-QN0L!U97mBt42jl01ZX3sv?723NW2S}k;!n?{<+-6c z&o>DPreMl6Yc~ps={GG=`ahhchzfq4=Q|(vk8p>8y?zeJ+*^_hzG$(DuBQwJ^CAUqc%~q(ju>)HN!eTGg*xNmG;uG}xLXs- zNQ{@@_g&I?vM%@v)P6`~)zD!4L4qGVhO=f6ZhkHJopGmldyOMXaxn4s9P1G(&9@x^ zxg3oK)B6pJoo`ggsz0I%YGqNa{hH}aH?-Y)2_ z_XXO}BYCf1>EPpJu(tcZF5an);{lAhGy!ram7o4a<%NWv9L){oFi&*xHAkWS=%;{y ze$h?KJpn||yQvf=>s`7zCN8}Vp!&$1HzB+eU&Bwm_8#ByeV?T`a#>$jMkmuge&QwB z&@5N1N@|ZZgavBc_eeBW?>w$9Ra0lj|JFf5vz2_}DBH0=L)D8~Dy2t71VeyYB8L<{ zuYfjjHlSI=nc!txz?Uwsrbe5pAap^g@EI9*;m_C7&0kI8&nbzzYMmHP>n0!GdZDqO zFg6KRLw{u0*L>qt4wx#|k6H>Brg6y3(oavtqY7gDS=o`nmWp2V7h|bWTBUsHOyDp=L$X=yUY>;(aKP!F5$rey zWm8F(j6NEyaZ~U=0q(u&O4UoG!le+_y8n;h@;g~!n_M4j5vxi)8Z8QbJSBne0fM#S z!H5mFdDrbBE5vO^6&|+`(pP|V5>9eHGTM24Zz*rT2R;GzRqL-4^PhJHcz`m-^u-9k zLjv%{YYP`@)rq&IlqCudpK~aUQ_wUz{9IxN99$4A>ia#8YJinsN%w(~?z)8gh&MQ- ziOESlzeC>~Nxyr!VHBie`=#FPo+2m^iC@_!iK~&R+k6QoW2l&2W%t2gKyp}7{(e%$!O93uBTgU7M+hre8|qtD$>4)>_3;Nr>`dDYre` z{!vuyO{R7GPRufw2UE@B{_0Y>@U^E`lqc>LQ>7aXC7;5~i~P)$&zXOsTXYIYw`u){ zX~_j}iJ28hz0{`*D^B7sX3&FG1lG`stA8J8nCfn+PaLHni5GhZ7T0qR4F6_$_VCMm z0(cS^B$09HdeRBz@_h_6fb*w}Z1bQ=ODudQ!ShG^nD&ON?^*@(WDz%mtj8etYeB8a zh((EYKTmctg$!0{XG5Q|MBZT<@%26;ro#P`uwl{BvoETt+rgfID+1xZiz@|+OI|e0 zIH*b3C1NvD6PJKG;MEf#^xFUKaP(Nb=^R>&vle}q>e)Lcbs8V?1ZYFjNIe@YSNwo` zEy~h^RoynlCb3JEQI>(%?=;{1+^|1PmG>Jznk>^F(o3}P=`4nO{w^e&+Yw-gFmWm`KQ$z)kJh+j@# z)?a5GC=jpIgVG(Qa4G1GLEIYQmx#sRtA$Owh0)i|_1>GYApY2`EDN;$1MGQ}xvtMs zD)O!|R-iFw|K%h5wzdj!g=2F+PjAEq=!SsdGyw z2Nx~K^x}HW-A℘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 literal 0 HcmV?d00001 From 9c9875ff7ec008d48d4c31629b9339272d3e4003 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sat, 15 May 2021 22:40:27 +1200 Subject: [PATCH 02/11] more work on the requirements definitions --- .../docs/CoordinatorRequirements.md | 60 ++++++++++++------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 70bf24ed..80075f5b 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -1,4 +1,4 @@ -# Aleo Setup Coordinator Requirements +# Aleo Setup `phase1-coordinator` Requirements Vaguely following the format outlined here: . @@ -8,32 +8,29 @@ Related overall setup requirements document here [Aleo Setup PRD][Aleo Setup PRD ## Definitions -Definitions of various terms which are relevant to the purpose and implementation of the coordinator. +Definitions of various terms which are relevant to the purpose and implementation of the coordinator. This list is sorted in alphabetical order, however a good place to start with general reading is at the [Setup Ceremony](#Setup-Ceremony) -### Setup - -A **Setup** is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#Parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#Contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. +### Chunk -Extra useful references: +The parameters are broken into chunks so that multiple [contributor](#Contributor)s can make contributions in parallel. See [Optimistic Pipelining](#Optimistic-Pipelining) for an overview of the process. -+ [Zcash Parameter Generation](https://z.cash/technology/paramgen/) -+ [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] +### Contribution -### Parameters +As part of the design for [Optimistic Pipelining](#Optimistic-Pipelining), at the end of a round, each [chunk](#Chunk) will contain one contribution for each [contributor](#Contributor) participating in the round. -TODO: specifically what are the parameters? +### Contributor -### Participant +A contributor is a type of [participant](#Participant), typically run by a member of the public who wishes to participate in the [ceremony](#Setup-Ceremony) by making [contributions](#Contribution). There are currently two contributor software implementations: [cli contributor](../../setup1-contributor) (in this repository) and the [web contributor](https://github.com/AleoHQ/aleo-setup-frontend). A contributor runs this software to participate in the ceremony. If a contributor is [dropped](#Drop) during a [round](#Round) they can be replaced by a [Replacement Contributor](#Replacement-Contributor). -A participant is an actor who performs a role during the ceremony, the coordinator provides them with tasks to perform. There are currently two type of participants: [contributor](#Contributor)s and [verifiers](#Verifier)s. +A contributor's contributions are verified by a [Verifier](#Verifier) participant before they are accepted and can have other contributions made based on them. -### Contributor +### Coordinator -TODO: description +The coordinator directs [participants](#Participant) to perform the [Setup Ceremony](#Setup-Ceremony), and collates/checks the all chunks/contributions before continuing to the next [round](#Round) of the ceremony. The core logic for the coordinator is contained within this [`phase1-coordinator`](../) module, and the web server interface to this logic resides in the [`aleo-setup-coordinator` repository](https://github.com/AleoHQ/aleo-setup-coordinator/). -### Verifier +### Drop -TODO: description +A participant may be "dropped" from a [round](#Round) in progress by the [Coordinator](#Coordinator) for a variety of reasons. In the case of a dropped [Contributor](#Contributor) this involves removing their contributions, and, replacing them with a [Replacement Contributor](#Replacement-Contributor). ### Optimistic Pipelining @@ -43,28 +40,45 @@ The marketing logic is that by making it easy for more people to contribute, it With optimistic pipelining: -+ For a given [round](#Round) the [parameters](#Parameters) are divided into chunks. **TODO**: is this the correct terminology?. ++ For a given [round](#Round) the [parameters](#Parameters) are divided into [chunk](#Chunk)s. **TODO**: is this the correct terminology?. + A [chunk](#Chunk) will be contributed to once by every contributor in the round, each [contribution](#Contribution) is based on the previous. + After a contribution has been made to a chunk, it needs to be verified before another contributor can make the next contribution. + A chunk can only have one contributor at a given time. See [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] for a more detailed explanation and background for this technique. +### Parameters + +TODO: specifically what are the parameters? + +### Participant + +A participant is an actor who performs a role during the [Setup Ceremony](#Setup-Ceremony): the [coordinator](#Coordinator) provides them with tasks to perform. There are currently two type of participants: [contributor](#Contributor)s and [verifiers](#Verifier)s. + +### Replacement Contributor + +A [contributor](#Contributor) run by `aleo` which waits idle for a contributor to be [dropped](#Drop) from a [round](#Round) in progress, at which point the [coordinator](#Coordinator) will assign it to take over the dropped contributor's tasks to allow the round to be completed. + ### Round -A round of the [setup ceremony](#Setup). Each round ideally consists of a new set of [contributor](#Contributor)s. +A round of the [setup ceremony](#Setup-Ceremony). Each round ideally consists of a new set of [contributor](#Contributor)s. A ceremony will consist of many rounds in order to involve more contributors across a larger time scale. The number of contributors in a single round is limited, so this also provides a mechanism to increase capacity for unique contributors in the ceremony. -### Chunk +### Setup Ceremony -TODO +A **Setup Ceremony** (or **Setup** for short) is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#Parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#Contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. -### Contribution +Extra useful references: -As part of the design for [Optimistic Pipelining](#Optimistic-Pipelining), at the end of a round, each [chunk](#Chunk) will contain one contribution for each [contributor](#Contributor) participating in the round. ++ [Zcash Parameter Generation](https://z.cash/technology/paramgen/) ++ [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] + +### Verifier + +TODO: description ## Purpose -The purpose of this module is to provide logic to coordinate a +The purpose of the `phase1-contributor` module is to provide the logic for performing a [setup ceremony](#Setup-Ceremony) [Aleo Setup PRD]: https://docs.google.com/document/d/1Vyg2J60zRU6023KXBjZx8CP3V-Nz6hPOUCMplbCxVB4/ From 10b9fd34b18674cff77c4b4ed83369a30dba81b6 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sun, 16 May 2021 19:41:33 +1200 Subject: [PATCH 03/11] updated requirements --- .../docs/CoordinatorRequirements.md | 324 +++++++++++++++++- 1 file changed, 307 insertions(+), 17 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 80075f5b..20ced2a2 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -6,44 +6,89 @@ This document contains documentation of the required functionality for the [`pha Related overall setup requirements document here [Aleo Setup PRD][Aleo Setup PRD] +## Purpose + +The purpose of the `phase1-coordinator` module is to provide the logic for performing a [setup ceremony](#setup-ceremony) in the form of a Rust library that can be consumed by a web server which provides the communication layer between the [coordinator](#coordinator) and [participants](#participant). + ## Definitions -Definitions of various terms which are relevant to the purpose and implementation of the coordinator. This list is sorted in alphabetical order, however a good place to start with general reading is at the [Setup Ceremony](#Setup-Ceremony) +Definitions of various terms which are relevant to the purpose and implementation of the `phase1-coordinator`. This list is sorted in alphabetical order, however a good place to start with general reading is at the [Setup Ceremony](#setup-ceremony) + +### Aggregation + +TODO: what specifically is aggregation doing? + +### Challenge + +A challenge forms the basis for a [contribution](#contribution). + +TODO: what specifically is a challenge? ### Chunk -The parameters are broken into chunks so that multiple [contributor](#Contributor)s can make contributions in parallel. See [Optimistic Pipelining](#Optimistic-Pipelining) for an overview of the process. +The parameters are broken into chunks so that multiple [contributor](#contributor)s can make contributions in parallel. See [Optimistic Pipelining](#optimistic-pipelining) for an overview of the process. ### Contribution -As part of the design for [Optimistic Pipelining](#Optimistic-Pipelining), at the end of a round, each [chunk](#Chunk) will contain one contribution for each [contributor](#Contributor) participating in the round. +A contribution is a subset of the setup parameters generated by a [contributor](#contributor) in the form of a file. A [chunk](#chunk) contains one contribution for each contributor in the round. Contributions are created sequentially, each contribution first needs to be verified by a [verifier](#verifier) before it can be used as a base for a subsequent contribution. + +As part of the design for [Optimistic Pipelining](#optimistic-pipelining), at the end of a round, each [chunk](#chunk) will contain one contribution for each contributor participating in the round. ### Contributor -A contributor is a type of [participant](#Participant), typically run by a member of the public who wishes to participate in the [ceremony](#Setup-Ceremony) by making [contributions](#Contribution). There are currently two contributor software implementations: [cli contributor](../../setup1-contributor) (in this repository) and the [web contributor](https://github.com/AleoHQ/aleo-setup-frontend). A contributor runs this software to participate in the ceremony. If a contributor is [dropped](#Drop) during a [round](#Round) they can be replaced by a [Replacement Contributor](#Replacement-Contributor). +A contributor is a type of [participant](#participant), typically run by a member of the public who wishes to participate in the [ceremony](#setup-ceremony) by making [contributions](#contribution). There are currently two contributor software implementations: [cli contributor](#cli-contributor) (in this repository) and the [web contributor](#web-contributor). A contributor runs this software to participate in the ceremony. If a contributor is [dropped](#drop) during a [round](#round) they can be replaced by a [Replacement Contributor](#replacement-contributor). -A contributor's contributions are verified by a [Verifier](#Verifier) participant before they are accepted and can have other contributions made based on them. +A contributor's contributions are verified by a [Verifier](#verifier) participant before they are accepted and can have other contributions made based on them. + +#### CLI Contributor + +The CLI contributor software allows members of the public to make contributions to the ceremony via a piece of cross-platform (Windows, Mac, Linux) command line interface (CLI) softare written in Rust. It can be found at [`setup1-contributor`](../../setup1-contributor) + +#### Web Contributor + +The web contributor is contributor software that runs in a browser so that members of the public can contribute simply by navigating to the relevant web page. The repository for this project can be found at [`aleo-setup-frontend`](https://github.com/AleoHQ/aleo-setup-frontend). Currently it's only planned to use the web contributor for the [inner setup](#inner-setup). ### Coordinator -The coordinator directs [participants](#Participant) to perform the [Setup Ceremony](#Setup-Ceremony), and collates/checks the all chunks/contributions before continuing to the next [round](#Round) of the ceremony. The core logic for the coordinator is contained within this [`phase1-coordinator`](../) module, and the web server interface to this logic resides in the [`aleo-setup-coordinator` repository](https://github.com/AleoHQ/aleo-setup-coordinator/). +The coordinator directs [participants](#participant) to perform the [Setup Ceremony](#setup-ceremony), and collates/checks the all chunks/contributions before continuing to the next [round](#round) of the ceremony. The core logic for the coordinator is contained within this [`phase1-coordinator`](../) module, and the web server interface to this logic resides in the [`aleo-setup-coordinator` repository](https://github.com/AleoHQ/aleo-setup-coordinator/). ### Drop -A participant may be "dropped" from a [round](#Round) in progress by the [Coordinator](#Coordinator) for a variety of reasons. In the case of a dropped [Contributor](#Contributor) this involves removing their contributions, and, replacing them with a [Replacement Contributor](#Replacement-Contributor). +A participant may be "dropped" from a [round](#round) in progress by the [Coordinator](#coordinator) for a variety of reasons. In the case of a dropped [Contributor](#contributor) this involves removing their contributions, and, replacing them with a [Replacement Contributor](#replacement-contributor). + +### Environment + +Currently aleo is considering running the [setup ceremony](#setup-ceremony) multiple times, with different configurations of curves, proving systems, and size. Currently these are classed as [inner](#inner-setup), [outer](#outer-setup), and [universal](#universal-setup) setups (in order of complexity). + +#### Inner Setup + +The inner setup will be the least computationally expensive setup configuration. In order to encourage more members of the public to contribute, the inner setup will be open to [web contributors](#web-contributor) which can be operated simply from a web browser. + +TODO: specifically what is the inner setup for? + +#### Outer Setup + +TODO: specifically what is the outer setup for? + +#### Universal Setup + +TODO: specifically what is the universal setup for? + +This is the most computationally expensive setup configuration. ### Optimistic Pipelining -The marketing logic is that by making it easy for more people to contribute, it will increase the public's perceived trustworthiness of the system in question. **Optimistic Pipelining** is a new technique implemented for this project to allow [contributor](#Contributor)s to make contributions in parallel for a given round. +The marketing logic is that by making it easy for more people to contribute, it will increase the public's perceived trustworthiness of the system in question. **Optimistic Pipelining** is a new technique implemented for this project to allow [contributor](#contributor)s to make contributions in parallel for a given round. ![Powers of Tau Diagram](./PowersofTau.jpg) With optimistic pipelining: -+ For a given [round](#Round) the [parameters](#Parameters) are divided into [chunk](#Chunk)s. **TODO**: is this the correct terminology?. -+ A [chunk](#Chunk) will be contributed to once by every contributor in the round, each [contribution](#Contribution) is based on the previous. ++ For a given [round](#round) the [parameters](#parameters) are divided into [chunk](#chunk)s. **TODO**: is this the correct terminology?. ++ A [chunk](#chunk) will be contributed to once by every contributor in the round, each [contribution](#contribution) is based on the previous. + After a contribution has been made to a chunk, it needs to be verified before another contributor can make the next contribution. + A chunk can only have one contributor at a given time. ++ At the end of a round, the [coordinator](#coordinator) performs [aggregation](#aggregation) on the contributions. See [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] for a more detailed explanation and background for this technique. @@ -53,19 +98,25 @@ TODO: specifically what are the parameters? ### Participant -A participant is an actor who performs a role during the [Setup Ceremony](#Setup-Ceremony): the [coordinator](#Coordinator) provides them with tasks to perform. There are currently two type of participants: [contributor](#Contributor)s and [verifiers](#Verifier)s. +A participant is an actor (in the form of software) who performs a role during the [Setup Ceremony](#setup-ceremony): the [coordinator](#coordinator) provides them with tasks to perform. There are currently two type of participants: [contributor](#contributor)s and [verifiers](#verifier)s. A participant may be operated by an actual member of the public, or by aleo in the form of a [verifier](#verifier) or [replacement contributor](#replacement-contributor). ### Replacement Contributor -A [contributor](#Contributor) run by `aleo` which waits idle for a contributor to be [dropped](#Drop) from a [round](#Round) in progress, at which point the [coordinator](#Coordinator) will assign it to take over the dropped contributor's tasks to allow the round to be completed. +A [contributor](#contributor) run by `aleo` which waits idle for a contributor to be [dropped](#drop) from a [round](#round) in progress, at which point the [coordinator](#coordinator) will assign it to take over the dropped contributor's tasks to allow the round to be completed. ### Round -A round of the [setup ceremony](#Setup-Ceremony). Each round ideally consists of a new set of [contributor](#Contributor)s. A ceremony will consist of many rounds in order to involve more contributors across a larger time scale. The number of contributors in a single round is limited, so this also provides a mechanism to increase capacity for unique contributors in the ceremony. +A round of the [setup ceremony](#setup-ceremony). Each round ideally consists of a new set of [contributor](#contributor)s. A ceremony will consist of many rounds in order to involve more contributors across a larger time scale. The number of contributors in a single round is limited, so this also provides a mechanism to increase capacity for unique contributors in the ceremony. + +### Round Queue + +A queue where [participants](#participant) wait to join the next [round](#round). If there not enough spaces in the next round available, some participants will remain in the queue until there is an available slot in a round. ### Setup Ceremony -A **Setup Ceremony** (or **Setup** for short) is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#Parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#Contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. +A **Setup Ceremony** (or **Setup** for short) is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. + +In contrast to previous public setup ceremonies, aleo setup will be making use of the [Optimistic Pipelining](#optimistic-pipelining) technique to allow more contributions in a shorter space of time. Extra useful references: @@ -74,12 +125,251 @@ Extra useful references: ### Verifier -TODO: description +A type of [participant](#participant) which verifies a [contributor](#contributor)'s [contributions](#contribution) before it can be used as a base for subsequent contributions or in the next [round](#round). -## Purpose +## System Description + +### User Characteristics + +#### Coordinator Operator (Aleo) + +Aleo is the company developing this software, and ultimately the primary user of the software as it will using the module to operate a central [coordinator](#coordinator) node to perform a [setup ceremony](#setup-ceremony). + +It is expected that the `phase1-coordinator` module will be consumed by [`aleo-setup-coordinator`](https://github.com/AleoHQ/aleo-setup-coordinator/), a web server written in Rust running on top of the Tokio async runtime. + +#### Public Contributors + +Public contributors are members of the public who have decided to contribute to the [setup ceremony](#setup-ceremony) by operating a [contributor](#contributor) node during a [round](#round) of the ceremony. + +These people are expected to have an interest in using the aleo system and want to be able to trust the system by participating themselves. Some of these users may expect sufficient evidence that their contribution was effective. + +It is expected that contributors in the [Inner Setup](#inner-setup) ceremony will be willing to run a node for at least a couple of hours in their web browser, and that contributors in the [Universal Setup](#universal-setup) ceremony will be willing to run a high performance node for around 5-10 hours. + +#### Aleo System Users + +Some members of the public who are using the aleo system which depends upon the parameters generated in the setup ceremony may wish to convince themselves of the soundness of the ceremony with the historical evidence publicly available. + +## Requirements + +Requirements have been denoted with a `REQ-N` notation where `N` is the number referring to a specific requirement to allow easy and consistent referencing. See the references at the end of this document for a complete list of requirements including the latest. + +### Interface Requirements + +#### REQ-8 Concurrency + +Many API endpoints will be expected to be called concurrently with multiple [participant](#participant)s working in parallel, and with this library being consumed by an asynchronous web server. It is expected that the API will provide a threadsafe API, with an effort to reduce the need for exclusive or expensive blocking locks on internal resources with unexpected performance implications for the caller. + +#### REQ-9 Async + +If it is expected that an operation will block on an operating system resource or on a thread synchronization primitive, this should be well documented, and ideally an async API should be provided instead to prevent the caller's event loop from being blocked or the need to spawn unecessarily expensive threads. + +### Functional Requirements + +#### REQ-1 Evidence of Soundness + +As mentioned in [Public Contributors](#public-contributors) and [Aleo System Users](#aleo-system-users), it is expected that some members of the public will want some form of evidence that the [ceremony](#setup-ceremony) conducted was correct, without serious mistakes with security consequences. Making the evidence more accessible and easier to reason about may increase its effectiveness. Without solid evidence that the ceremony was conducted correctly, it may be impossible for some potential users to trust the system. + +Depending on implementation, it's possible that the state persisted to disk ([REQ-18][REQ-18]) may be suitable to use directly for the purpose of a trasncript, these files could be published to a public repository. + +#### REQ-2 Evidence of Successful Contribution + +Secondary to [REQ-1][REQ-1] it is expected that some contributors will need evidence to convince them that indeed their individual [contribution](#contribution) was actually included in the final result. + +#### REQ-3 Number of Contributors Per Round + +It is expected that the [coordinator](#coordinator) should be able to support up to 5 (**TODO** should this be different per environment?) contributors per round. + +#### REQ-16 State Saved to Disk + +The state of the [ceremony](#setup-ceremony) needs to be saved to disk during operation. The state should be updated at least after every [contribution](#contribution)/verification. + +#### REQ-18 History Retained + +The state of the application needs to maintain a complete history of accepted contributions. Dropped contribution contents can be discarded, however a record of the contribution itself needs to be maintained. + +Related to: + ++ [REQ-16][REQ-16] + +#### REQ-15 Restartable + +It should be possible to restart the [coordinator](#coordinator) by loading state that was previously saved to disk during a graceful shutdown. + +Requires: + ++ [ ] [REQ-16][REQ-16] ++ [ ] [REQ-14][REQ-14] + +#### REQ-19 Round Queue + +There needs to be a queue (known as [round queue](#round-queue)) that [participants](#participant) need to enter and wait until a new [round](#round) starts. When the round starts, participants waiting to enter are placed into the round until the maximum number of participants is reached. If there are no available places in the round, some participants will remain in the queue, waiting for an available place in the following round. + +Related to: -The purpose of the `phase1-contributor` module is to provide the logic for performing a [setup ceremony](#Setup-Ceremony) ++ [REQ-3][REQ-3] + +#### REQ-25 Drop Participant + +Provide a method to drop participants. The fact that they have been dropped will need to be published. Contributions and verifications from other participants that depend on the contributions of the dropped participant will also. Any contributions/verifications from other participants which depend on the dropped participant's contributions/verifications will also need to be removed. + +The contents of removed contributions may be removed from the state that will be persisted to disk, however a record will need to be retained as per [REQ-18](#REQ-18-History-Retained). + +Requires: + ++ [ ] [REQ-16][REQ-16] ++ [ ] [REQ-23][REQ-23] + +#### REQ-20 Drop Unresponsive Participant + +If [participants](#participant) fail to communicate (for a configurable amount of time) with the [coordinator](#coordinator), they will be [dropped](#drop) from the [round](#round). + +Requires: + ++ [ ] [REQ-25][REQ-25] + +#### REQ-26 Ban Participant + +Provide a method and API to ban participants from joining the [round queue](#round-queue). + +Requires: + ++ [ ] [REQ-25][REQ-25] ++ [ ] [REQ-19][REQ-19] + +#### REQ-23 Publish Participant Instructions + +Provide an API endpoint where the current instructions for [participants](#participant) can be obtained. *It could also be good to explore the option of using a subscribe model (instead of polling) for this, but that is not a current requirement.* + +#### REQ-24 Assign Replacement Contributors + +When a [contributor](#contributor) is [dropped](#drop), an available [replacement contributor](#replacement-contributor) will need to be assigned to complete that contributor's required contributions in order for the current [round](#round) to successfully complete, as a service for the other contributors, as opposed to the alternative option, which is to restart the round. + +#### REQ-27 Generate Initial Challenges + +Generate the initial [challenges](#challenge) to be used as the basis for the first [round](#round). + +#### REQ-28 Coordinate a Round + +Coordinate a [round](#round) successfully, [aggregate](#aggregation) the results, notify contributors, and proceeed to the next round. + +Requires: + ++ [ ] [REQ-27][REQ-27] ++ [ ] [REQ-29][REQ-29] ++ [ ] [REQ-20][REQ-20] ++ [ ] [REQ-24][REQ-24] + +#### REQ-29 Notify Participants Round Complete + +Notify participants that the round has successfully completed, and in the case of [contributors](#contributors) ensure that the know that they are no longer required for contribution. + +Requires: + ++ [ ] [REQ-23][REQ-23] + +### Performance Requirements + +#### REQ-4 Latency + +Where there is no significant expected computation on the coordinator side (Such as [aggregation](#aggregation)), the time of operations under expected operating conditions should be roughly under 1 second. There should be no unecessary waiting. Because the majority of the time in the [ceremony](#setup-ceremony) is spent performing computations on the side of the participants and performing network transactions of files on the web server, this requirement is not so strict, so long as latency in the API does not represent a significant proportion (>10%) of the total round time. + +#### REQ-5 RAM Usage + +The RAM usage of this module and its dependecies should not exceed 32GB (half of Digital Ocean's largest CPU optimized instance) during normal operation. Obviously less is better. + +#### REQ-6 Disk Space Usage + +The disk space used to store the state of the [coordinator](#coordinator) should not present a significant overhead (>10%) on top of the necessary disk space for storing the contributions and verificiations. + +#### REQ-7 Concurrency Performance + +Wherever possible the [coordinator](#coordinator) logic should try to make effective use of concurrency to reduce latency, especially for computationally expensive tasks. Efforts should be made to reduce the need for expensive exclusive locks on internal data structures. + +Related to: + ++ [REQ-8][REQ-8] ++ [REQ-9][REQ-9] + +### Reliability and Security Requirements + +#### REQ-10 No Expected Panics + +All possible expected points of failure during normal operation of the software should be covered by a `Result::Error` so that the caller can respond appropriately. Unexpected panics should be reduced through thorough testing and careful choice of dependencies. Unexpected can be handled with a high level `catch` on the caller side. + +#### REQ-11 No Aborts + +Aborts and memory segfault errors are unnacceptable, except in the case of when a serious security or reliability fault is detected where continued operation of the module may result in unacceptable consequences. + +#### REQ-14 Safe Shutdown + +If the process is terminated normally, this should not leave the state persisted to disk in an invalid state. If needed, an in-progress round can be discarded. + +Requires: + ++ [ ] [REQ-16][REQ-16]. + +Related to: + ++ [REQ-15][REQ-15]. + +#### REQ-17 Backups + +Backups of the persisted ceremony state should be performed during the ceremony at regular intervals, at least once per round. + +Requires: + ++ [ ] [REQ-16][REQ-16]. + +#### REQ-21 Continuous Integration Testing + +Make use of GitHub actions continous integration testing to ensure that any changes in a pull request need to pass all tests before being merged. + +Requires: + ++ [ ] [REQ-22][REQ-22] + +#### REQ-22 Pull Request Workflow + +Make use of GitHub pull requests to ensure that changes are reviewed before merged to the `master` branch and can enter production. + +#### REQ-12 No Unsafe + +Unsafe code (where memory safety can be accidentally violated) should not be used anywhere in the module implementation, and its use in dependencies should be minimized and carefully. + +#### REQ-13 No Vulnerable Dependencies + +Use [cargo-audit](https://github.com/RustSec/rustsec) to ensure that any publicly published vulnerabilities in dependencies are flagged as issues and updated as soon as possible. [Aleo Setup PRD]: https://docs.google.com/document/d/1Vyg2J60zRU6023KXBjZx8CP3V-Nz6hPOUCMplbCxVB4/ [Setup Ceremonies ZKProof]: https://docs.google.com/document/d/189hwHm5UFxT2jOFeCzL_YUvRfXEpTyQ1dsWEtuimR94/ + +[REQ-1]: #req-1-evidence-of-soundness +[REQ-2]: #req-2-evidence-of-successful-contribution +[REQ-3]: #req-3-number-of-contributors-per-round +[REQ-4]: #req-4-latency +[REQ-5]: #req-5-ram-usage +[REQ-6]: #req-6-disk-space-usage +[REQ-7]: #req-7-concurrency-performance +[REQ-8]: #req-8-concurrency +[REQ-9]: #req-9-async +[REQ-10]: #req-10-no-expected-panics +[REQ-11]: #req-11-no-aborts +[REQ-12]: #req-12-no-unsafe +[REQ-13]: #req-13-no-vulnerable-dependencies +[REQ-14]: #req-14-safe-shutdown +[REQ-15]: #req-15-restartable +[REQ-16]: #req-16-state-saved-to-disk +[REQ-17]: #req-17-backups +[REQ-18]: #req-18-history-retained +[REQ-19]: #req-19-round-queue +[REQ-20]: #req-20-drop-unresponsive-participant +[REQ-21]: #req-21-continuous-integration-testing +[REQ-22]: #req-22-pull-request-workflow +[REQ-23]: #req-23-publish-participant-instructions +[REQ-24]: #req-24-assign-replacement-contributors +[REQ-25]: #req-25-drop-participant +[REQ-26]: #req-26-ban-participant +[REQ-27]: #req-27-generate-initial-challenges +[REQ-28]: #req-28-coordinate-a-round +[REQ-29]: #req-29-notify-participants-round-complete From ce4a7088fb7c7276d52894b8fef8ee18db910a4a Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sun, 16 May 2021 20:38:22 +1200 Subject: [PATCH 04/11] updated requirements --- .../docs/CoordinatorRequirements.md | 152 +++++++++++++----- 1 file changed, 108 insertions(+), 44 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 20ced2a2..7108723d 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -123,6 +123,12 @@ Extra useful references: + [Zcash Parameter Generation](https://z.cash/technology/paramgen/) + [Setup Ceremonies ZKProof][Setup Ceremonies ZKProof] +### Verification + +TODO: what specificially is a verification? + +A verification is calculated from a [contribution](#contribution) by a [verifier](#verifier). + ### Verifier A type of [participant](#participant) which verifies a [contributor](#contributor)'s [contributions](#contribution) before it can be used as a base for subsequent contributions or in the next [round](#round). @@ -179,6 +185,15 @@ Secondary to [REQ-1][REQ-1] it is expected that some contributors will need evid It is expected that the [coordinator](#coordinator) should be able to support up to 5 (**TODO** should this be different per environment?) contributors per round. +#### REQ-15 Restartable + +It should be possible to restart the [coordinator](#coordinator) by loading state that was previously saved to disk during a graceful shutdown. + +Requires: + ++ [REQ-16 State Saved to Disk][REQ-16] ++ [REQ-14 Safe Shutdown][REQ-14] + #### REQ-16 State Saved to Disk The state of the [ceremony](#setup-ceremony) needs to be saved to disk during operation. The state should be updated at least after every [contribution](#contribution)/verification. @@ -189,16 +204,7 @@ The state of the application needs to maintain a complete history of accepted co Related to: -+ [REQ-16][REQ-16] - -#### REQ-15 Restartable - -It should be possible to restart the [coordinator](#coordinator) by loading state that was previously saved to disk during a graceful shutdown. - -Requires: - -+ [ ] [REQ-16][REQ-16] -+ [ ] [REQ-14][REQ-14] ++ [REQ-16 State Saved to Disk][REQ-16] #### REQ-19 Round Queue @@ -206,43 +212,47 @@ There needs to be a queue (known as [round queue](#round-queue)) that [participa Related to: -+ [REQ-3][REQ-3] - -#### REQ-25 Drop Participant ++ [REQ-3 Number of Contributors Per Round][REQ-3] -Provide a method to drop participants. The fact that they have been dropped will need to be published. Contributions and verifications from other participants that depend on the contributions of the dropped participant will also. Any contributions/verifications from other participants which depend on the dropped participant's contributions/verifications will also need to be removed. +#### REQ-20 Drop Unresponsive Participant -The contents of removed contributions may be removed from the state that will be persisted to disk, however a record will need to be retained as per [REQ-18](#REQ-18-History-Retained). +If [participants](#participant) fail to communicate (for a configurable amount of time) with the [coordinator](#coordinator), they will be [dropped](#drop) from the [round](#round). Requires: -+ [ ] [REQ-16][REQ-16] -+ [ ] [REQ-23][REQ-23] ++ [REQ-25 Drop Participant][REQ-25] -#### REQ-20 Drop Unresponsive Participant +#### REQ-23 Publish Participant Instructions -If [participants](#participant) fail to communicate (for a configurable amount of time) with the [coordinator](#coordinator), they will be [dropped](#drop) from the [round](#round). +Provide an API where the current instructions for [participants](#participant) can be obtained. -Requires: +*It could also be good to explore the option of using a subscribe model (instead of polling) for this, but that is not a current requirement.* -+ [ ] [REQ-25][REQ-25] +TODO: why are locks used in the current implementation? What problem do they solve? If the current tasks are published by the coordinator, shouldn't participants only be working on the tasks that they have been asked to work on, there should be no overlap and no need to apply locks. -#### REQ-26 Ban Participant +#### REQ-24 Assign Replacement Contributors -Provide a method and API to ban participants from joining the [round queue](#round-queue). +When a [contributor](#contributor) is [dropped](#drop), an available [replacement contributor](#replacement-contributor) will need to be assigned to complete that contributor's required contributions in order for the current [round](#round) to successfully complete, as a service for the other contributors, as opposed to the alternative option, which is to restart the round. + +#### REQ-25 Drop Participant + +Provide a method to drop participants. The fact that they have been dropped will need to be published. Contributions and verifications from other participants that depend on the contributions of the dropped participant will also. Any contributions/verifications from other participants which depend on the dropped participant's contributions/verifications will also need to be removed. + +The contents of removed contributions may be removed from the state that will be persisted to disk, however a record will need to be retained as per [REQ-18](#REQ-18-History-Retained). Requires: -+ [ ] [REQ-25][REQ-25] -+ [ ] [REQ-19][REQ-19] ++ [REQ-16 State Saved to Disk][REQ-16] ++ [REQ-23 Publish Participant Instructions][REQ-23] -#### REQ-23 Publish Participant Instructions +#### REQ-26 Ban Participant -Provide an API endpoint where the current instructions for [participants](#participant) can be obtained. *It could also be good to explore the option of using a subscribe model (instead of polling) for this, but that is not a current requirement.* +Provide a method and API to ban participants from joining the [round queue](#round-queue). -#### REQ-24 Assign Replacement Contributors +Requires: -When a [contributor](#contributor) is [dropped](#drop), an available [replacement contributor](#replacement-contributor) will need to be assigned to complete that contributor's required contributions in order for the current [round](#round) to successfully complete, as a service for the other contributors, as opposed to the alternative option, which is to restart the round. ++ [REQ-25 Drop Participant][REQ-25] ++ [REQ-19 Round Queue][REQ-19] #### REQ-27 Generate Initial Challenges @@ -254,10 +264,11 @@ Coordinate a [round](#round) successfully, [aggregate](#aggregation) the results Requires: -+ [ ] [REQ-27][REQ-27] -+ [ ] [REQ-29][REQ-29] -+ [ ] [REQ-20][REQ-20] -+ [ ] [REQ-24][REQ-24] ++ [REQ-23 Publish Participant Instructions][REQ-23] ++ [REQ-27 Generate Initial Challenges][REQ-27] ++ [REQ-29 Notify Participants Round Complete][REQ-29] ++ [REQ-30 Contribution API][REQ-30] ++ [REQ-31 Verification API][REQ-31] #### REQ-29 Notify Participants Round Complete @@ -265,7 +276,42 @@ Notify participants that the round has successfully completed, and in the case o Requires: -+ [ ] [REQ-23][REQ-23] ++ [REQ-23 Publish Participant Instructions][REQ-23] + +#### REQ-30 Contribution API + +Provide API methods where a [contributor](#contributor) can obtain a [challenge](#challenge), and then upload the completed [contribution](#contribution). + +#### REQ-31 Verification API + +Provide API methods where a [verifier](#verifier) can obtain unverified [contribution](#contribution)s, and then upload the completed [verifications](#verification). + +#### REQ-32 Handle Verification Failure + +Handle the situation where the [verification](#verification) of a [contribution](#contribution) fails. Delete the invalid contribution and re-assign the deleted contribution tasks the [contributor](#contributor) which made the contribution. + +Requires: + ++ [REQ-23 Publish Participant Instructions][REQ-23] ++ [REQ-30 Contribution API][REQ-30] ++ [REQ-31 Verification API][REQ-31] + +#### REQ-33 Drop Contributor Repeated Verification Failure + +*This is a proposed new requirement.* + +[Drop](#drop) a [contributor](#contributor) after a configurable amount of [verification](#verification) failures on [contributions](#contributions) made by that contributor. + ++ [REQ-25 Drop Participant][REQ-25] ++ [REQ-32 Handle Verification Failure][REQ-32] + +#### REQ-35 Drop Slow Participant + +[Drop](#drop) a [participant](#participant) if they get stuck for too long (configurable) on a single [contribution](#contribution)/[verification](#verification). This should be fairly excessive, perhaps 10 minutes, to ensure this is only triggered during a serious anomaly, and will not trigger if for example the user's antivirus performs a quick scan or Windows update occurs, or there is a monentary problem with their network connection. + +*Also consider a drop if a contributor is taking too long over a longer average, with a lower threshold*. + ++ [REQ-25 Drop Participant][REQ-25] ### Performance Requirements @@ -287,8 +333,8 @@ Wherever possible the [coordinator](#coordinator) logic should try to make effec Related to: -+ [REQ-8][REQ-8] -+ [REQ-9][REQ-9] ++ [REQ-8 Concurrency][REQ-8] ++ [REQ-9 Async][REQ-9] ### Reliability and Security Requirements @@ -300,17 +346,25 @@ All possible expected points of failure during normal operation of the software Aborts and memory segfault errors are unnacceptable, except in the case of when a serious security or reliability fault is detected where continued operation of the module may result in unacceptable consequences. +#### REQ-12 No Unsafe + +Unsafe code (where memory safety can be accidentally violated) should not be used anywhere in the module implementation, and its use in dependencies should be minimized and carefully. + +#### REQ-13 No Vulnerable Dependencies + +Use [cargo-audit](https://github.com/RustSec/rustsec) to ensure that any publicly published vulnerabilities in dependencies are flagged as issues and updated as soon as possible. + #### REQ-14 Safe Shutdown If the process is terminated normally, this should not leave the state persisted to disk in an invalid state. If needed, an in-progress round can be discarded. Requires: -+ [ ] [REQ-16][REQ-16]. ++ [REQ-16 State Saved to Disk][REQ-16] Related to: -+ [REQ-15][REQ-15]. ++ [REQ-15 Restartable][REQ-15] #### REQ-17 Backups @@ -318,7 +372,7 @@ Backups of the persisted ceremony state should be performed during the ceremony Requires: -+ [ ] [REQ-16][REQ-16]. ++ [REQ-16 State Saved to Disk][REQ-16] #### REQ-21 Continuous Integration Testing @@ -326,19 +380,23 @@ Make use of GitHub actions continous integration testing to ensure that any chan Requires: -+ [ ] [REQ-22][REQ-22] ++ [REQ-22 Pull Request Workflow][REQ-22] #### REQ-22 Pull Request Workflow Make use of GitHub pull requests to ensure that changes are reviewed before merged to the `master` branch and can enter production. -#### REQ-12 No Unsafe +#### REQ-34 No Stalls -Unsafe code (where memory safety can be accidentally violated) should not be used anywhere in the module implementation, and its use in dependencies should be minimized and carefully. +The [ceremony](#setup-ceremony) stall permanently at any point. An offending [contributor](#contributor) should be [dropped](#drop) if required. -#### REQ-13 No Vulnerable Dependencies +Requires: -Use [cargo-audit](https://github.com/RustSec/rustsec) to ensure that any publicly published vulnerabilities in dependencies are flagged as issues and updated as soon as possible. ++ [REQ-33 Drop Contributor Repeated Verification Failure][REQ-33] ++ [REQ-20 Drop Unresponsive Participant][REQ-20] ++ [REQ-35 Drop Slow Participant][REQ-35] + +## References [Aleo Setup PRD]: https://docs.google.com/document/d/1Vyg2J60zRU6023KXBjZx8CP3V-Nz6hPOUCMplbCxVB4/ @@ -373,3 +431,9 @@ Use [cargo-audit](https://github.com/RustSec/rustsec) to ensure that any publicl [REQ-27]: #req-27-generate-initial-challenges [REQ-28]: #req-28-coordinate-a-round [REQ-29]: #req-29-notify-participants-round-complete +[REQ-30]: #req-30-contribution-api +[REQ-31]: #req-31-verification-api +[REQ-32]: #req-32-handle-verification-failure +[REQ-33]: #req-33-drop-contributor-repeated-verification-failure +[REQ-34]: #req-34-no-stalls +[REQ-35]: #req-35-drop-slow-participant From 6f8e4ed4a1d96da53bd5c99c7284b133613482c3 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Mon, 17 May 2021 08:51:05 +1200 Subject: [PATCH 05/11] updated requirements --- .../docs/CoordinatorRequirements.md | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 7108723d..f4103435 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -305,6 +305,16 @@ Requires: + [REQ-25 Drop Participant][REQ-25] + [REQ-32 Handle Verification Failure][REQ-32] +#### REQ-34 No Permanent Stalls + +The [ceremony](#setup-ceremony) stall permanently at any point. An offending [contributor](#contributor) should be [dropped](#drop) if required. + +Requires: + ++ [REQ-33 Drop Contributor Repeated Verification Failure][REQ-33] ++ [REQ-20 Drop Unresponsive Participant][REQ-20] ++ [REQ-35 Drop Slow Participant][REQ-35] + #### REQ-35 Drop Slow Participant [Drop](#drop) a [participant](#participant) if they get stuck for too long (configurable) on a single [contribution](#contribution)/[verification](#verification). This should be fairly excessive, perhaps 10 minutes, to ensure this is only triggered during a serious anomaly, and will not trigger if for example the user's antivirus performs a quick scan or Windows update occurs, or there is a monentary problem with their network connection. @@ -313,6 +323,22 @@ Requires: + [REQ-25 Drop Participant][REQ-25] +#### REQ-36 Status API + +Provide an API where the status of the [coordinator](#coordinator) can be queried. Include information such as: + ++ The [round queue](#round-queue). ++ The current [round](#round) including current [participants](#participant), the state of [contributions](#contribution) and [verifications](#verification). ++ [Dropped](#drop) participants. ++ [Replacement contributors](#replacement-contributors). + +Requires: + ++ [REQ-19 Round Queue][REQ-19] ++ [REQ-24 Assign Replacement Contributors][REQ-24] ++ [REQ-25 Drop Participant][REQ-25] ++ [REQ-28 Coordinate a Round][REQ-28] + ### Performance Requirements #### REQ-4 Latency @@ -386,16 +412,6 @@ Requires: Make use of GitHub pull requests to ensure that changes are reviewed before merged to the `master` branch and can enter production. -#### REQ-34 No Stalls - -The [ceremony](#setup-ceremony) stall permanently at any point. An offending [contributor](#contributor) should be [dropped](#drop) if required. - -Requires: - -+ [REQ-33 Drop Contributor Repeated Verification Failure][REQ-33] -+ [REQ-20 Drop Unresponsive Participant][REQ-20] -+ [REQ-35 Drop Slow Participant][REQ-35] - ## References @@ -435,5 +451,6 @@ Requires: [REQ-31]: #req-31-verification-api [REQ-32]: #req-32-handle-verification-failure [REQ-33]: #req-33-drop-contributor-repeated-verification-failure -[REQ-34]: #req-34-no-stalls +[REQ-34]: #req-34-no-permanent-stalls [REQ-35]: #req-35-drop-slow-participant +[REQ-36]: #req-36-status-api From 05c36fefe943588e276104a90315d5cefc2d7f35 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Mon, 17 May 2021 09:31:17 +1200 Subject: [PATCH 06/11] update requirements --- phase1-coordinator/docs/CoordinatorRequirements.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index f4103435..bb6aeb4e 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -331,6 +331,7 @@ Provide an API where the status of the [coordinator](#coordinator) can be querie + The current [round](#round) including current [participants](#participant), the state of [contributions](#contribution) and [verifications](#verification). + [Dropped](#drop) participants. + [Replacement contributors](#replacement-contributors). ++ The current state of the coordinator, is it waiting for participants, currently performing the round, or currently aggregating. It would be good to include some indication of progress. Requires: @@ -338,6 +339,13 @@ Requires: + [REQ-24 Assign Replacement Contributors][REQ-24] + [REQ-25 Drop Participant][REQ-25] + [REQ-28 Coordinate a Round][REQ-28] ++ [REQ-37 Aggregate Contributions][REQ-37] + +#### REQ-37 Aggregate Contributions + +After a [round](#round) completes, the [coordinator](#coordinator) needs to correctly [aggregate](#aggregation) the contributions from the round. + +TODO: what does a correct aggregation consist of? How do we prove it? ### Performance Requirements @@ -454,3 +462,4 @@ Make use of GitHub pull requests to ensure that changes are reviewed before merg [REQ-34]: #req-34-no-permanent-stalls [REQ-35]: #req-35-drop-slow-participant [REQ-36]: #req-36-status-api +[REQ-37]: #req-37-aggregate-contributions From 6e824e44f7448c63c34defae58b0e38a3d83140b Mon Sep 17 00:00:00 2001 From: Eduardo Morais Date: Wed, 2 Jun 2021 17:45:34 -0300 Subject: [PATCH 07/11] Fix typos --- phase1-coordinator/docs/CoordinatorRequirements.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index bb6aeb4e..81159536 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -58,7 +58,7 @@ A participant may be "dropped" from a [round](#round) in progress by the [Coordi ### Environment -Currently aleo is considering running the [setup ceremony](#setup-ceremony) multiple times, with different configurations of curves, proving systems, and size. Currently these are classed as [inner](#inner-setup), [outer](#outer-setup), and [universal](#universal-setup) setups (in order of complexity). +Currently Aleo is considering running the [setup ceremony](#setup-ceremony) multiple times, with different configurations of curves, proving systems, and size. Currently these are classed as [inner](#inner-setup), [outer](#outer-setup), and [universal](#universal-setup) setups (in order of complexity). #### Inner Setup @@ -98,7 +98,7 @@ TODO: specifically what are the parameters? ### Participant -A participant is an actor (in the form of software) who performs a role during the [Setup Ceremony](#setup-ceremony): the [coordinator](#coordinator) provides them with tasks to perform. There are currently two type of participants: [contributor](#contributor)s and [verifiers](#verifier)s. A participant may be operated by an actual member of the public, or by aleo in the form of a [verifier](#verifier) or [replacement contributor](#replacement-contributor). +A participant is an actor (in the form of software) who performs a role during the [Setup Ceremony](#setup-ceremony): the [coordinator](#coordinator) provides them with tasks to perform. There are currently two types of participants: [contributor](#contributor)s and [verifiers](#verifier)s. A participant may be operated by an actual member of the public, or by aleo in the form of a [verifier](#verifier) or [replacement contributor](#replacement-contributor). ### Replacement Contributor @@ -116,7 +116,7 @@ A queue where [participants](#participant) wait to join the next [round](#round) A **Setup Ceremony** (or **Setup** for short) is currently necessary pre-requisite task for a Zero Knowledge cryptography system. The aim of a setup is to generate a set of [parameters](#parameters) using random numbers which will be used as a basis for proofs **TODO is this correct?**. In order for the system to be trustworthy, the source of randomness needs to be discarded. The ceremony is in effect, a public stage-show where members of the public are invited to participate as [contributor](#contributor)s. The advantage of involving multiple contributors from the public is that in order for the system to be trustworthy, only one contributor needs to be honest with disposing of their source of randomness used to generate parameters. -In contrast to previous public setup ceremonies, aleo setup will be making use of the [Optimistic Pipelining](#optimistic-pipelining) technique to allow more contributions in a shorter space of time. +In contrast to previous public setup ceremonies, Aleo setup will be making use of the [Optimistic Pipelining](#optimistic-pipelining) technique to allow more contributions in a shorter space of time. Extra useful references: @@ -147,13 +147,13 @@ It is expected that the `phase1-coordinator` module will be consumed by [`aleo-s Public contributors are members of the public who have decided to contribute to the [setup ceremony](#setup-ceremony) by operating a [contributor](#contributor) node during a [round](#round) of the ceremony. -These people are expected to have an interest in using the aleo system and want to be able to trust the system by participating themselves. Some of these users may expect sufficient evidence that their contribution was effective. +These people are expected to have an interest in using the Aleo system and want to be able to trust the system by participating themselves. Some of these users may expect sufficient evidence that their contribution was effective. It is expected that contributors in the [Inner Setup](#inner-setup) ceremony will be willing to run a node for at least a couple of hours in their web browser, and that contributors in the [Universal Setup](#universal-setup) ceremony will be willing to run a high performance node for around 5-10 hours. #### Aleo System Users -Some members of the public who are using the aleo system which depends upon the parameters generated in the setup ceremony may wish to convince themselves of the soundness of the ceremony with the historical evidence publicly available. +Some members of the public who are using the Aleo system which depends upon the parameters generated in the setup ceremony may wish to convince themselves of the soundness of the ceremony with the historical evidence publicly available. ## Requirements @@ -260,7 +260,7 @@ Generate the initial [challenges](#challenge) to be used as the basis for the fi #### REQ-28 Coordinate a Round -Coordinate a [round](#round) successfully, [aggregate](#aggregation) the results, notify contributors, and proceeed to the next round. +Coordinate a [round](#round) successfully, [aggregate](#aggregation) the results, notify contributors, and proceed to the next round. Requires: @@ -317,7 +317,7 @@ Requires: #### REQ-35 Drop Slow Participant -[Drop](#drop) a [participant](#participant) if they get stuck for too long (configurable) on a single [contribution](#contribution)/[verification](#verification). This should be fairly excessive, perhaps 10 minutes, to ensure this is only triggered during a serious anomaly, and will not trigger if for example the user's antivirus performs a quick scan or Windows update occurs, or there is a monentary problem with their network connection. +[Drop](#drop) a [participant](#participant) if they get stuck for too long (configurable) on a single [contribution](#contribution)/[verification](#verification). This should be fairly excessive, perhaps 10 minutes, to ensure this is only triggered during a serious anomaly, and will not trigger if for example the user's antivirus performs a quick scan or Windows update occurs, or there is a momentary problem with their network connection. *Also consider a drop if a contributor is taking too long over a longer average, with a lower threshold*. From de039f3a1543594b8d45ffcca3b90f30ff12c39c Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sat, 26 Jun 2021 22:46:30 +0400 Subject: [PATCH 08/11] Update CoordinatorRequirements.md --- phase1-coordinator/docs/CoordinatorRequirements.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 81159536..43bfa867 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -240,10 +240,13 @@ Provide a method to drop participants. The fact that they have been dropped will The contents of removed contributions may be removed from the state that will be persisted to disk, however a record will need to be retained as per [REQ-18](#REQ-18-History-Retained). +If there are any [Replacement Contributor](#replacement-contributor)s available assign the dropped participant's tasks to it according to [REQ-24 Assign Replacement Contributors][REQ-24]. + Requires: + [REQ-16 State Saved to Disk][REQ-16] + [REQ-23 Publish Participant Instructions][REQ-23] ++ [REQ-24 Assign Replacement Contributors][REQ-24] #### REQ-26 Ban Participant From c6c5737f93adc80c8a2860baf080c7bfcb0cbdc5 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sat, 26 Jun 2021 22:57:55 +0400 Subject: [PATCH 09/11] add round restart requirements --- .../docs/CoordinatorRequirements.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 81159536..b0fc27fe 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -302,6 +302,8 @@ Requires: [Drop](#drop) a [contributor](#contributor) after a configurable amount of [verification](#verification) failures on [contributions](#contributions) made by that contributor. +Requires: + + [REQ-25 Drop Participant][REQ-25] + [REQ-32 Handle Verification Failure][REQ-32] @@ -321,6 +323,8 @@ Requires: *Also consider a drop if a contributor is taking too long over a longer average, with a lower threshold*. +Requires: + + [REQ-25 Drop Participant][REQ-25] #### REQ-36 Status API @@ -347,6 +351,26 @@ After a [round](#round) completes, the [coordinator](#coordinator) needs to corr TODO: what does a correct aggregation consist of? How do we prove it? +#### REQ-38 Admin Round Restart + +There needs to be a function where an administrator can tell the [coordinator](#coordinator) to restart the current round in the event of an unhandled error state that stalls the ceremony. + +Requires: + ++ [REQ-28 Coordinate a Round][REQ-28] + +#### REQ-39 Automatic Round Restart + +In the event of a dropped [participant](#participant) when there are no available [Replacement Contributors](#replacement-contributor) or the participant is a [verifier](#verifier), the [round](#round) should be restarted automatically. The resources from the cancelled round should be cleaned up. If possible, we should also consider attempting to restart the round in the event of a fatal unhandled error in the [coordinator](#coordinator). + +This should share the functionality added to implement [REQ-38 Admin Round Restart][REQ-38]. + +Requires: + ++ [REQ-25 Drop Participant][REQ-25] ++ [REQ-28 Coordinate a Round][REQ-28] ++ [REQ-38 Admin Round Restart][REQ-38] + ### Performance Requirements #### REQ-4 Latency @@ -463,3 +487,5 @@ Make use of GitHub pull requests to ensure that changes are reviewed before merg [REQ-35]: #req-35-drop-slow-participant [REQ-36]: #req-36-status-api [REQ-37]: #req-37-aggregate-contributions +[REQ-38]: #req-38-admin-round-restart +[REQ-39]: #req-39-automatic-round-restart From 31c82c3a999c11b167b6bfa9d6dfb5b3c7c892e6 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sat, 26 Jun 2021 23:08:43 +0400 Subject: [PATCH 10/11] more specifics on round restart requirements --- .../docs/CoordinatorRequirements.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index c3bca3df..416a6c2d 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -240,13 +240,14 @@ Provide a method to drop participants. The fact that they have been dropped will The contents of removed contributions may be removed from the state that will be persisted to disk, however a record will need to be retained as per [REQ-18](#REQ-18-History-Retained). -If there are any [Replacement Contributor](#replacement-contributor)s available assign the dropped participant's tasks to it according to [REQ-24 Assign Replacement Contributors][REQ-24]. +If there are any [Replacement Contributor](#replacement-contributor)s available assign the dropped participant's tasks to it according to [REQ-24 Assign Replacement Contributors][REQ-24]. If there are no replacement contributors available then the round will need to be restarted as per [REQ-39 Drop Participant Round Restart][REQ-39] Requires: + [REQ-16 State Saved to Disk][REQ-16] + [REQ-23 Publish Participant Instructions][REQ-23] + [REQ-24 Assign Replacement Contributors][REQ-24] ++ [REQ-39 Drop Participant Round Restart][REQ-39] #### REQ-26 Ban Participant @@ -362,15 +363,20 @@ Requires: + [REQ-28 Coordinate a Round][REQ-28] -#### REQ-39 Automatic Round Restart +#### REQ-39 Drop Participant Round Restart -In the event of a dropped [participant](#participant) when there are no available [Replacement Contributors](#replacement-contributor) or the participant is a [verifier](#verifier), the [round](#round) should be restarted automatically. The resources from the cancelled round should be cleaned up. If possible, we should also consider attempting to restart the round in the event of a fatal unhandled error in the [coordinator](#coordinator). +In the event of a dropped [participant](#participant) when there are no available [Replacement Contributors](#replacement-contributor) or the participant is a [verifier](#verifier), or there are no remaining standard contributors, the [round](#round) should be restarted automatically. If possible, we should also consider attempting to restart the round in the event of a fatal unhandled error in the [coordinator](#coordinator). + +If the restart is due to a dropped contributor and there are no remaining replacement contributors, then any existing standard contributors should be carried over to the restarted round, and the dropped contributor will remain dropped. + +If the restart is due to a dropped verifier, or due to a dropped contributor where there are no remaining normal contributors in the round, then new contributors should be assigned from the queue. + +The resources from the cancelled round should be cleaned up. If existing contributors are to participate in the restarted round then their tasks need to be reset. This should share the functionality added to implement [REQ-38 Admin Round Restart][REQ-38]. Requires: -+ [REQ-25 Drop Participant][REQ-25] + [REQ-28 Coordinate a Round][REQ-28] + [REQ-38 Admin Round Restart][REQ-38] @@ -491,4 +497,4 @@ Make use of GitHub pull requests to ensure that changes are reviewed before merg [REQ-36]: #req-36-status-api [REQ-37]: #req-37-aggregate-contributions [REQ-38]: #req-38-admin-round-restart -[REQ-39]: #req-39-automatic-round-restart +[REQ-39]: #req-39-drop-participant-round-restart From ad9f75391184c4611cd51b9874094c62052b84b2 Mon Sep 17 00:00:00 2001 From: Luke Frisken Date: Sun, 27 Jun 2021 16:23:50 +0400 Subject: [PATCH 11/11] Update CoordinatorRequirements.md --- phase1-coordinator/docs/CoordinatorRequirements.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/phase1-coordinator/docs/CoordinatorRequirements.md b/phase1-coordinator/docs/CoordinatorRequirements.md index 416a6c2d..07d70384 100644 --- a/phase1-coordinator/docs/CoordinatorRequirements.md +++ b/phase1-coordinator/docs/CoordinatorRequirements.md @@ -365,7 +365,13 @@ Requires: #### REQ-39 Drop Participant Round Restart -In the event of a dropped [participant](#participant) when there are no available [Replacement Contributors](#replacement-contributor) or the participant is a [verifier](#verifier), or there are no remaining standard contributors, the [round](#round) should be restarted automatically. If possible, we should also consider attempting to restart the round in the event of a fatal unhandled error in the [coordinator](#coordinator). +In the following situations the [round](#round) should be restarted automatically: + ++ Dropped [contributor](#contributor) and there are no available [Replacement Contributor](#replacement-contributor)s. ++ Dropped [contributor](#contributor) and there are no remaining standard contributors. ++ Dropped [verifier](#verifier), and there are no remaining verifiers. + +If possible, we should also consider attempting to restart the round in the event of a fatal unhandled error in the [coordinator](#coordinator). If the restart is due to a dropped contributor and there are no remaining replacement contributors, then any existing standard contributors should be carried over to the restarted round, and the dropped contributor will remain dropped.