From bd3890da7ed9e58a2d5d88c8c78ca31c335c1876 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 1 Aug 2018 17:04:04 +0200 Subject: [PATCH] Collator for the "adder" (formerly basic-add) parachain and various small fixes (#438) * update basic_add wasm * wasm feature and collator feature * move test parachains around a little * fix wasm build for basic_add * move basic_add to adder, introduce README * minimal basic_add collator * ensure collator messages are sent in the right order * more logging * route consensus statements to all peers * minor bugfixes for parachains * genesis builder accounts for parachain heads * fix parachains tests * targets for txpool * tweak runtime + collator * fix version in adder-collator * consistency for overflowing * adjust comment * fix stable test run * remove dummy registration test * final grumbles --- substrate/Cargo.lock | 23 +++ substrate/Cargo.toml | 6 +- substrate/common.sh | 2 +- substrate/demo/runtime/wasm/Cargo.lock | 8 +- .../release/demo_runtime.compact.wasm | Bin 243890 -> 244053 bytes .../release/demo_runtime.wasm | Bin 243976 -> 244138 bytes substrate/polkadot/collator/src/lib.rs | 47 ++++-- substrate/polkadot/consensus/src/lib.rs | 5 + .../consensus/src/shared_table/mod.rs | 64 +++++--- substrate/polkadot/network/src/consensus.rs | 1 + substrate/polkadot/network/src/lib.rs | 126 +++++++++------ substrate/polkadot/network/src/router.rs | 68 +++----- .../test-chains/basic_add/Cargo.toml | 25 --- .../parachain/test-chains/basic_add/build.sh | 12 -- .../test-chains/basic_add/src/lib.rs | 142 ----------------- .../tests/{basic_add.rs => adder.rs} | 2 +- .../polkadot/parachain/tests/res/adder.wasm | Bin 0 -> 29853 bytes .../parachain/tests/res/basic_add.wasm | Bin 11348 -> 0 bytes substrate/polkadot/runtime/src/parachains.rs | 33 ++-- substrate/polkadot/runtime/wasm/Cargo.lock | 8 +- .../release/polkadot_runtime.compact.wasm | Bin 323032 -> 322938 bytes .../release/polkadot_runtime.wasm | Bin 323119 -> 323027 bytes substrate/polkadot/service/src/lib.rs | 6 +- .../.gitignore | 0 substrate/polkadot/test-parachains/README.md | 5 + .../polkadot/test-parachains/adder/Cargo.toml | 9 ++ .../test-parachains/adder/collator/Cargo.toml | 15 ++ .../adder/collator/src/main.rs | 145 ++++++++++++++++++ .../polkadot/test-parachains/adder/src/lib.rs | 110 +++++++++++++ .../adder}/src/src | 0 .../test-parachains/adder/wasm/Cargo.toml | 20 +++ .../adder/wasm/src/lib.rs} | 44 ++++-- substrate/polkadot/test-parachains/build.sh | 15 ++ .../release/runtime_test.compact.wasm | Bin 54240 -> 54272 bytes .../release/runtime_test.wasm | Bin 54450 -> 54482 bytes .../substrate/network/src/consensus_gossip.rs | 3 + .../substrate/test-runtime/wasm/Cargo.lock | 6 +- .../substrate_test_runtime.compact.wasm | Bin 56550 -> 56218 bytes .../release/substrate_test_runtime.wasm | Bin 56682 -> 56350 bytes 39 files changed, 608 insertions(+), 342 deletions(-) delete mode 100644 substrate/polkadot/parachain/test-chains/basic_add/Cargo.toml delete mode 100755 substrate/polkadot/parachain/test-chains/basic_add/build.sh delete mode 100644 substrate/polkadot/parachain/test-chains/basic_add/src/lib.rs rename substrate/polkadot/parachain/tests/{basic_add.rs => adder.rs} (98%) create mode 100644 substrate/polkadot/parachain/tests/res/adder.wasm delete mode 100755 substrate/polkadot/parachain/tests/res/basic_add.wasm rename substrate/polkadot/{parachain/test-chains => test-parachains}/.gitignore (100%) create mode 100644 substrate/polkadot/test-parachains/README.md create mode 100644 substrate/polkadot/test-parachains/adder/Cargo.toml create mode 100644 substrate/polkadot/test-parachains/adder/collator/Cargo.toml create mode 100644 substrate/polkadot/test-parachains/adder/collator/src/main.rs create mode 100644 substrate/polkadot/test-parachains/adder/src/lib.rs rename substrate/polkadot/{parachain/test-chains/basic_add => test-parachains/adder}/src/src (100%) create mode 100644 substrate/polkadot/test-parachains/adder/wasm/Cargo.toml rename substrate/polkadot/{parachain/test-chains/basic_add/src/wasm.rs => test-parachains/adder/wasm/src/lib.rs} (60%) create mode 100755 substrate/polkadot/test-parachains/build.sh diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 4bc5b446e5..686376a0ca 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1,3 +1,26 @@ +[[package]] +name = "adder" +version = "0.1.0" +dependencies = [ + "polkadot-parachain 0.1.0", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "adder-collator" +version = "0.1.0" +dependencies = [ + "adder 0.1.0", + "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", + "ed25519 0.1.0", + "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "polkadot-collator 0.1.0", + "polkadot-parachain 0.1.0", + "polkadot-primitives 0.1.0", +] + [[package]] name = "aho-corasick" version = "0.6.4" diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 6b5271641e..a7630a11ce 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -32,6 +32,9 @@ members = [ "polkadot/transaction-pool", "polkadot/service", + "polkadot/test-parachains/adder", + "polkadot/test-parachains/adder/collator", + "substrate/bft", "substrate/cli", "substrate/client", @@ -77,6 +80,7 @@ members = [ ] exclude = [ "polkadot/runtime/wasm", + "polkadot/test-parachains/adder/wasm", "demo/runtime/wasm", "substrate/executor/wasm", "substrate/pwasm-alloc", @@ -92,4 +96,4 @@ is-it-maintained-open-issues = { repository = "paritytech/polkadot" } [profile.release] # Substrate runtime requires unwinding. -panic = "unwind" +panic = "unwind" diff --git a/substrate/common.sh b/substrate/common.sh index 847aa23820..254a4260e4 100644 --- a/substrate/common.sh +++ b/substrate/common.sh @@ -8,7 +8,7 @@ SRCS=( "substrate/executor/wasm" "demo/runtime/wasm" "substrate/test-runtime/wasm" - "polkadot/parachain/test-chains/basic_add" + "polkadot/test-parachains/" ) # Make pushd/popd silent. diff --git a/substrate/demo/runtime/wasm/Cargo.lock b/substrate/demo/runtime/wasm/Cargo.lock index d5eac31f66..e3fda5b1f0 100644 --- a/substrate/demo/runtime/wasm/Cargo.lock +++ b/substrate/demo/runtime/wasm/Cargo.lock @@ -730,7 +730,7 @@ dependencies = [ "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -846,7 +846,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", - "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1107,7 +1107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1231,7 +1231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4a6d379e9332b1b1f52c5a87f2481c85c7c931d8ec411963dfb8f26b1ec1e3" +"checksum wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "522fe3fdd44a56f25cd5ddcd8ccdb1cf2e982ceb28fcb00f41d8a018ae5245a8" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index b51ad28c97b97445aa4a093e179e6f2db831ea77..e202d418ffb6fe6158bea559f1322e1731f18557 100644 GIT binary patch delta 22397 zcmb_^349dg`TxA{Y|hOllO-Vs3CxBY1ol1x0t*C1g=Xqy# z51-5Y)0deC*OBN!(mOj-o83?zs#2zD&T^;6E2Kn^lhK2dl2S4(sg&ZHlthw}Xi_H4 zpjoCA2^Ey4B&AR^qK#%{XJsd4W@aX(@c+}3DDG2|q8ja#_0ki~g1J!$>erN4qEUKN zW4&3K(J-~9uA-qrs}~xiifY^`RTcFbh^SGg2{W>k+S;l)_2q?jdPrA_R#!DUj?NaP^?{!%bCU zN-Fubslj};8JEND|3*klbZLG|^!CCb#1`FHScbo+3j0PI3;N;iK*8Q7Ylq*r!|exs z=aQDD@_tc~9^DcB$|+lp?r0W*E@`k}4j$dnWOMbDFxSYT*P+|0q3`jDM-DBFE-QQ3 zViAVC^Yx*otqXo1eMN|NA3l;E-5hNgUK{N;Vt(|UYez)Oubm$aU30|r5)sAd``5OM zPP%SiblZrndgH0#^PAE~_Q!~$X6=WKul|iA8@cE8t<0HAz@+CzDe~y9= zDbhHb7+k&zx7oNgq2saWiY49Xu~pGGm*zx|Eg3+UuZm_qI+z@fj(OA%TANqqM>jvJ zq#x&lQZPV{e!iwKx^r)4)U~ufeTWbA^NG$!_b%;B@8jhFITkf98_@Y>zNRFN3qGU| zmd4F55oJ*}-Q1zXG(@<;A_PxIE0;Z3PJ7VRL{9EOg%VO(k`xqr3Xg0W?8BCluq9qx zVHA^P5-hANA$*TXK}l~~pXiy7Vn1QqCY={F*dkP7aEV1G(cP=MMrSP_gWcHwm=k?_ zxx%?W@E0yF{pOYK=#J=Ma<=Jo^n_8-fP!aL86n?A?`C&Z=)}?BYNF3aIF-r&mP%}e zQ0ZjuciAoMHj5?*(#Y4 zNuoKpV^dUG*CW4;uCHF$EJz&%GX%4JU3BcaE)^?~Stb(zt5>ocRTt}AYxV_1Pq zdy1<`iRcq+Wf9XEx&jGBr7fK(rf*!|A3}X*eIZ}}g>{{x8`fn*wtVaqiKeU1z$%p0_s^ z_>wT6EmMZZxNSN7Vz(u8rPRA+4-tGKw4YyOIax+Ov`Fc4QndFb88lwMsQ?U)YzjJ( z_}F2#EIFslLd5)xQ z#}*$-O_f{TB#oDAh=p%C>)&b!rsW!v^gHsDv2go|bDron)5>`gx2`znld)%T-eMp~+G`ryq`98v9m ztmm8F{zs9Jx0-gp6(FRd>BB!QLz}^`#m6Tlzp@5Xors<}UO+yMCY=~nc6g0Gohg{C z!~9XBD8^0Q1Wy3%(>;MG<1!VFMeHd~=9W)^VX*rg*%W0bZilX%KQV@IqGIMpwPp#h{pD>oX^ZMm;Bca)KwH?A*5g4(aS#FfLCT zCnt@ELtVHw+Vg!VYAa(i&p(ECIR5b#F}Q7Q^u7oQc+)ejhV6-T3kKWKbMm zOqb(}>2iD#g9a~6Z4h4Mj&Evo%U3zX6#eoOF09d?jwUdl4QIY2bkVx#^3Sz|YEgYY zu3FKQFWv>Q+$^HY&h?CTK6@KfEIR*eLGdL72&M*!R16eIT+!pmSqJZU`Yc!P=(%$R z(Jn3bCgwNj)#s13{OZ#Dnk-@*C12W@%MI3JHC01&?W1m4d0%<;b&pB2v(HvKqKKQ4Mw&afdCWmSIQ!c zfJBdc2OTw-)$Jb>`Nr@6$6)eJ^wMNL{2mV=cg*tWp zeiBLW)$s5-U!y;qA!4-g$6#Z8o8sjv!}rBKO57!Ji6dq-@ogHBEw{aVtc!p};?5p4 zV2|)gCL3ov(DE;5lO!kY_a7C|=Y-W`ZxszeK~Aw8I6rODBg>Fae z)f6&7vc-<7Dzin}+eZ>ozwFHdC;JEk#Zr(uiP7P7j`E{#5dMn{Kye$wW?< z>0GIXhbO_au?1923p8BAhkLPdC}MHtMc zkN~m#4GRYmvr7fRlbd5-k0US9yqn_T4_Ig~G0Q2OlNrI5*c-QzPbgG|JvEU83tDzG z3vlNMD>>%!uzxYB#6&Y$yGdj)nZ<6NM3!_sf#B0i7w}-@q<))+R1aS~}y zKVBHiyMx@2OoqfN!ekF6=UGt$xrzm+kX-T)cIy-}rPF7R>5@r`OQz+qc)Z9xLLcGF z*gI2*Na#J=*auTdudD>n@ysGAcs|ylf|$sEnu86j_#^x|U<&LqR+2Ml%M z%Er~{VMCpW?pFE;OSZ>yW|7H++{I?hCQCXQtdd$ewOKS+wT)lFE885B&w15<4%reS zTVn6LO$Ne!#){q{x0&eMO|e<;W48aO!?6n=kWO*6>=!+;wjfr1irC^6^@YFT0lyiE z+8^RKGTk?SE@Hd0vCNOi;nw++FSilHS8^MPojgqz@adFK$le4s|GIadPl;xt??l;w z^Q1kS|1Bx*X6Y1Mx=r^-BP=rXJdv-Cg;Pu12VZ8Ne?j`uKkEZ?nd>YWM&60dK1=>W zNF}@R9J!m`OJZ-FBRdGGWi!r`I*`Nztl0PGiJOoq%<(m;L7cPYYiJG$vF+cGuEZ95 z^&8S%gch9tj@+T|0)8bH`6tODoeptTKAI$p!DILF+iz2FOTF}aeuaQmd{0Jk^Z4+4 zL`p|@#M=KrJ{L)C%tUB8U%-t38?hb7E#Miu7vo0|TnqL7v@2^T^EDwI=E# zWKL{B5{`0UNJ~=a@PzWhSan^B8-Nhkr7zi+DRc>u*@9HMu)m>6EkMS&(XB>~!>w*T zzaE9jd+BD}qR>Jsy>u6^UY%4K{CFW7oJMD2`>{0IlfWR~Pp4k!bu2#vq?vgZwK=Ua zC`*~KQVYGnHQt#;$3cZ3%%Wdl{n-*NDw-Sb#{E*8JZy7X@X_t;phQanQOFV5MTvGN z^J3kzX+9zISEt$a&_8Tf!B9>V)Wg)nWR!R{z zW)}9{!dePxd$w#g&1U0rX%_es$)$b*pxV@)cIGnwReS2S8Z(TOi{{#jkV9fImXSw; znUU7XZS8?Zx93qmCHrG53h3=z#V~o8zOj>?E2Q06?M#}Qj^$rL(kumA*bU{h7dzU4 zP9nir`yzS^p}*bBd*-rxi)nxyh&@|O&ytLjk2k{s26vH4X)=p-qEk3g2!BT#^LJ;f zWI7V}pt~2_P=bvV+vq3pxpG)h3GIW{>q;Q?mRLgx?ZOFL)0z5G`OF9!Rd%8?wV4zA z47TiNrY^KAJ-wUt?m|a&x)WZrMCX*%rZUj?)y0MZ3^`p(X z>0Am~k}0_FKuqmLKT0JEyUqnpUfgAHVWo>^gMh^5^I{*n=((f`J?JiC%*cZQ6L(C= zDhq-_4`I=6-9Z$@4dRjAgG=Gb3*zST&~C$%%Z0&|%928!h6=%Njboew8D-`wh0&GA zrj^nk_<2eaJ%Spg$oCL`r;e>HCQXr$uHVlHU z6~vwxL_ehDB3m;AYI1TnXNWGKA~ss1>C7?|3V4AP52gLUp;1HWB9x#)b~Z+%W|lRK zK18O*)()d?lJVwNLo1-lli6R(=$sLP&O&QjvRk(3oJ)}X%@&<=39`T1qI1sLhU{)S zwd;q|8PFB$H8fo$5mtO1Jxf2_$}&gNVtQsP>%*`25jJup#Tiy?*GQU4IA4!mPv?xh zT#h<5I3)oSdkSo;p6f|^@YhG!v{k3Zic^xb_$dhl2Vj8wB^l=+Z0;xk-+4yH(3Nb{ zXsVF&G2HhhQe4Ln2b(058R68Rv9uSN605{TL}I)0CORLK<=jlW>Xh}rg^nP1vW2(M zL2w7Zz6I5`*qK}CH56CZcv_rdXyj~cBlc=Jy@8uZu|khzz7szrvr)M~8VR5o9_t#S z2Wj$C{ID~Ry+4KaiX~}OCCMLcK}|ZZ>C4tf=o@4|BhzueW(plbU*5hKO-kV7+o%!)E0^P(Z za7ix?!~9rHuhLss)-0OeDdFgCeS?X!V_QF93_rKV2{Ri$t96-Nj?7lJbQZN4Yb`2i zJ=eBh8r`dPRa;7ME4ytrmB~}=uGs+L7WU`av^>Fx(KBfYvzJhFZ0a0}@O}u}bvON< zM}#}(LP~JppUwsJo@ZU=>2CX$d2|jv{}>C-r`_3wd9=`e$yp)OKo;{4h*ApUo})T6 z7tV(#EV^^NmODiZg;Qj6=L3Z1u_NPG7Z=*NOKWEvE~J|bJ`G|2`wfzQ}kSEE+hBQ+C*5I5eKGtSenrq zma^sd(AQuYcic;Fr97sN-A@OT`LXZrr*mocrM>CLYB1?V5705>UH0b(po@lMFIY^~ z%g@YW4=$$FguKeebs>A8STL^V2*-;TyOE9@FW&D)I&r)p-4S=Su*u!Yqz@iA_A0{zZYq` zDUNiBd@hc3iEJ;9bb2~%k~26;XK<7jWn4BBTydzhnsC9jCe$W2us69=+6 zVF#}w&20|%Q+>!dvsw2Cdd*~37$B!_ z%77Q;uIp!V1{oe#-=A^^ ze)S$`=+}VWI8fa+kd%>I<0P6cC($_hX+vWCX%F8t$oyC0Y891<^$(IsY)x-y-J!u` z$hC1bFt+|vHOK&{K@Bb)Ctj`wt@CE^dAVt<4U(Powa3`dA*2s?MRh}v+tAOpvX6$6 zZI*=1*etFo z>!6%u=%X0?m5?}KVfUAjY=k6ujFw3fDu^+YV+V$lv$T6$DR~W_0}J+`eu+SNgKe73 zZ0Yr+lwBM_hEDvMf{X9(CxW|jfBNZIe2XTw@jCMH#Gh#oZC3b~Xu&!7lND+ya*La< zC*RvXH0(q-cP@<-*~|?g0UAKYJ4cZsAY<&&Q6!Jt9^ZS?NH=NK7#(78lFFYg#J(JZQ>=s?|0g5SQQ-jF}giM%Ge)nAn$NHK6ImD$8X-K+i~pNjfByR4Rh1d8p(W$j~EjlqV0H0 zw){yXYZqTcz$RJBEXlzi*$odPMyz1(Jxu?OVENaNP&`QGhXMI4YYD9~hUBr9M`;JR zy#q@SU^8V2E#&EuvWoUd2Z7(l^RbMjR7=YmQoMMlrN5lT?pg}hs4uCHx3W`9sg-=s zE-a-%cJU>e8jL3<38xcJOcG8fo|uTiWeI3ao-+sR_TpjR6UH}8xeW*TQ?FYnYN>BPdn+8IaS zf4^`MyDduZ<=N?#jL2GnsOLAk*+VO6CouK#6_+t}3>&(VdjE%nT;f12Pl`Z|uZ;{x zu^(6A5aA+Qc9iyHgBi7;aWq3-{rkt+5tfj}|AZx7SZKALOD7a)C`(&It@PeqtauF_ zIs*2l`_%t-F*6suZu}z000{n;XQ<46y9Sv?3+u3!))wsD*(})7gE_XepkTwJ>N3lq z47WMBb|2femUip56{$L!``FTW?Sb9Ag!65F5FRAgSb`Ztcr9yLOM9mO22=51TB>E8 z*U_DYSscMR^gfH8+#-(x8Zb->vQz7DOq0bj*3&U@Md-~IuSY&-JV;=B)+6xCW`A8z zi_)?|Sduw-Y%jaGo^HS>sH~4=JV(vwjVGeHtj}|Flr76F=g7J9Z8=yKHY&(zhTp(L z_z8$)R_|fzM#QZrAODHky|9svqo*Hdd7Ef&TLg3>h2~@*B_)<=NFm2p+K^2L4>nfX z3T26@o2aX^B&Q9xq+@#)8J?C~GtawaDW$|36t2+^E!b0=K>elSyPIfno1$qmo!Ft3 zWp`qe>0mKl5a^ZB+Z+TrcW(x{hLv2^7A`>URjmIC08;T5YU!8dqboQn!myVSIctc# zcqja6)=rx>Lp00nZE12IL}s=WWfYr(_w8l3ZK2(Wl`YspZ^GrRE%YJ2$mFf`<}527 z5#YcjUAE$!MYghEZlwX9VE?$47K}K$1JX54#xBL{ZO_XtJqK&;*k(*h{An4coBSAU z&!?UJ7@cta{~61SIPoYP!ZOxz8*Se^Ev{*h;4%WyaCab;Lo3p_R;2TQPS?rcj=ijW z8y%mMZNp1Jwt^vot)nCa53H zv;ky(G&6QP?PHZ>ysD&!|NH{^No?u%1nPOlTV-poad-#l6b`|HrV+TSEGd?YhGQee zLH?A*I!)?UsBh>fu@wi2&5Bb(xsdNvGW6fd?~CR15io)jNhm?t%$|RW7PIFcqsc=P zdxD?rbAI@zJH0bL}?A#8T z1Dj3WNhfuDeNQt76R#}|imAUDlgFiD)^D@fJv-rSQ`pL#v^3o+=gIlO9#th0`^!#R z4@r#Lg%b>k)$O9!(c^n#&+h^tW8&9#(*vEX*myByXDz|oDq}1Xtde3dBn4r@rLKLP zPVdLH8!v#RffY8GFVvjcie(cFL;?ZG?eN^ms4&ZE806gpSonM|dvp)YgL{Tu;Se{A z?cYO-Gpsz6Ots1QSlRJCbU`CtIs!moxsoivja(v2m9{jHWZ?-U#Rcer7jxt^-X-H^ zoa>}zpw(O&Wva-0YrOCPc(hJIVb|2l^S8Ao&7?odH(gk{p z!JJqlIpr1r&F_jaFYKpznG!E?Q{l}LJGGyBviSiU2ukH#FsgeUpnbsWWL*|~G8xR_ z&y{hOt4k^wiXySu2k7Etoir(ye31TwK+fbaq97|9a+ogbiw9WHv}C;3H^yRu6tQJs z6gXj(lc3faNno8UL#9%0p=@2%L^~w$R*A_?lqE|x69=>Bn&=^$ex|MOQksmVp@f3W zbrAQ^LP5@EOON2hG==RvLN~U{Hd@;4x%?C!aw7TV#98>D~4e0z{@oC`nWNtU2e>2 zmm6~{D8Vc^Ql%SFA}&0b=f@M5kd=)&N^^v?o_&spB$ZH`<|o!O^=IK*nj7jX)sw=3oEO9 znU?)elZUIHrx~#xzrjf;x9G#K(CZpafVDP$6pQO8RdGK`uQWYu7{JDr{nAlQzOmo< z+b8@D8$^ME4Q#lS<08Hj`HL+WpVlUPkg|X>=!hn~l?n&L&P~OOeH(vE(}{`g{w=k) z5*SY;5(LH*xdef~N+fdsJ%I@GIk}ezO!_wjCK&|Y{X0%zY|-!NDhquu$U2^&n`vVq zYd%3c^6SYHNCs+I)?a92f{>1Dg7C}6V|`(nBnip5&cL+;uG4Vk1O9*yHqkn873w)# zi}2w)NbKy&`u0{y=!kYVuGizb5FajzME{kj=b|2hPa~hG1r>b9QoGA{oS?YvfVK{gB?+ z^}q_${=CH={*bmOKeDYK(thoCti&*jTv07IOx0xLTS>ttcKSm&(GOXtQ?$GPzEym^ zdab^+s!A2~2Y~USRxRk?elchBR&_>QomSmYUf-b9H3)b*IR6x$pFYJl;L`6{>m(J` zAew*u#h9eJ3X{CsTGV&gf+wFBXdzqw1@KBJ~rt;cZ6;-8pwS<=?URLWg^r@*Xk7ycRxo)j*s8g!zBU+tN|1q2P5hCG* zYuWOT5KnJg%Z~E$OKaJ?A5m8$52DO@I+3$0>KnjDd{3-Atku@kSAgC{>(Fe`Y2x2t z;~Nq1wk#^Gys}PHtCWiA<#k#}X#f%YO=NHvEn1x-;BDkY5nnnJf=#XC;v1}~W6Ms{ z6ufcG)|{qSC7k$+^PKSrqh4V&{Zg12QGI9t0Trr%(Q@VgBd`}0I-|Agk0zKjR$#y+a+v8~rz zi!&AMgFl8hx8u8v)YPevQhBvDt6bmlX*T~8T2TC5YY$DS<6pC@Q_AbBl=`Vc@R3dI z$R|{8g#rq*foQ){ZA!TcRRGiOg}NU7I!+4Hyk z;#G4Rj4J+CgE4(W4di%=7fV7~wHB#RE0nr9?50m?0e_pd`cp7$-DdXir__co%CSd3 zqrF`G#Zt2=tWB>G@MbBWyjH=N3Fq`Ns?PAL^!hrrUsXk@Z(Y3*{CYDx^BJ|dmf;Nv zb8;8CTA7Ybt>UGz|H*QsuV|0HGi$iI>vQqv#pZOiW@c#uhgx_|ie6I(itvawc!qXs z$MCGwoW`qXY7I58jm=xxU1y-=FKlI7&d_`he*%>l2O>}KqFL`>(*S71hz~DKfhtts zN!%A_s6CgzzhU%MYig=$A`v0D+r-a!mz4TB^`*L8__I5ss2d4? zYrrVhPK7D(cL0oH!|XaCxVW`g$5DyDF=@2UZm0m?wy~L?(=J_)@apUT6aRD^fAw?P z?#2b%6Vp`J0NfsEEzWMhB9FEf!xaFQmAv?KaNC)Aig!&aRcpc!Djx5Dfwwo7?YIP8 z(%~KGkX*{YbP66Kt$O+k8gQQBwPFZwX zr5?I>C!2Vd77lFQnP{!zX2)~4c;^s0zj3L^HSkZZMWq%D#>12&XX#b)y~x_l?SYig zC3*Uc`UW|q$%+hh)6i@6u2n67#}_8u-Xh3d~YS3CnOlQ?!NzG~tBcxfYsFab|zK1>rTGwp?hTo#d0P!_{i+iYJ)H zY%1T?7rUAF97sX_Iq@7w+xj@W>l}6QCm{#U(Y$PatYUPZRRLOXczygF^--L;OJ7oV z_RD(`&58>CzP^Xu@+BQWaTp!_60fD;9QJu!Z~pDxM7R2S@a|Y^v6dH)^J4q(jM}OS z6|gSX0(;;XbY~+3Kj*Dk71e4Dysp|H17CP>@IC8)o^~x+yAQ4T;8S%?gIuS<7oiKZ zu}_@ic=UDedF=1lJ{_WI@JsgQdD^S%%KaGk9}yZ*;poeI>cXjS0I{F67Hh*ZpkS@V zhB~;a3;S8kSF~TJ1Bo$E10lGhwWxBn+joFH_Z1zG&ug=;nNc@Gp00%}68l|nko#(x z95nR(`mgbT@u2QjG9ST9#b%Sh{{@#FV!OYl{krg~pJP=;EcF{4&OdON$=}e?^!JBZ z?KiY9y>OUq{s!-99cW@FzoAaN8P0Mpz}&uWV%`h17hQ9Ng)Y#N;SvNnSGo2h@1>e$VZu~Pr4g=Z=NnOSF zkh+c+Qg`4lP2G#XV(OFlYf60vf0Kli-=qKEd4(z7{{#v|Z>6d4;9g|izN5!UH1^|n zw0{@U%t||o8`<+6MGHI8Q5@EVVgi#Og^+`c?^C#IWlj zy;*9XDG2(lB=me#@7en>ZxMPQ(=WZg;FYp0^dgi^ZYR#l`yS%J5^mIY6!{WTeU>0h zWtuErm9aEQZ(N93SF;VWSd1X?8Ci7o8D@0tg$Dgrl0L*dUsH6?m)xj*op+Gqb9JzZ z{rfn0jUZ&*i+!h>q^{^2)TbAE7GVJPG!Z@YJ=KV;pH=j-r)*+I&gM4bOvbpU*iU6R{njLH!=%l4y;qdUKz4PB*in7}OHRdyj1WpaLj++xR!{1Js2?8^@Qq}5 zmxx7qzeEqt1X&Q4@a0maTHLN+`!NOS%w8`Mr{osut7Us|c?-*!OoFL%65H5Qv^SRj zwCNPqnFq0D%?5SYZV9>=^jf@vjs zEag4g<7NQJ6Yl2K_{6^LEM8@@ygI~4P(Q%da+#xt*dvqYKR2Pc5g$^|-nEI{V~_R_ z&l0ka&F>`+#dio^>LsRSCjAOaOl8OXVi754pZmpbMFgvim<~kK!n$0$O`p*q--?(< z6ArO{0kN1qC9?PXiXDPn*@sS5>dNZsYU)Pvq=B=uTd;bLz1 zax5@bsjg5*R7YwA&KaYT`zWsOBkBdN*WGUCt4`9-6lOLkp(;(_b~750xvuPEYWW%i zy4?-ATi_BW_dJC?1?#5Fm<|}%H9X#RMt#Ly+CYJ8>gbwkO<2OtmWsAc z+~kJpKk>i?nix3Fp=)@z+ga@Zu|wBM0yjRs_*kV*nJ#dPH14?YbymDCGTAG3q|G8b z=oY(Wb5SQ|s~4V564<#pVxDaU_I7;@Tn*h^BA1WMYKlXFeNNeFcli6*eSI80_SJ3TEh#hn!Z5Ig-8Dh9r43QkX?h&b z7W5KxOk7Ra#0g?iZ2tt&EM}<@kKgA|0%4cWsj7bV$|UiS6b>lvNW|lH1v~*P;EX+Z zhd7%`A%DQ`bq2z2%^6Vro^UK%5%*EaX}5>{Ubp7r6L>uV_J%4B$nq&phdmVbsdm*D z_J>(PSiD+7=&yQJx7(|F!hWpDBB<>U3b{3(-N{Mus&>s)CX5|(tHXZt7_Xb%85aBG zdfg7+R7Ht^%t*lNaR;#V&?-$FEQQ>jkYDk6)Q~qEafRJ%EU%43+^&Gb?Qw*$oaR#5 zW=&k2?FiX5k2@5OIJH2?X~hpm{%N7 zs$dStiZzgLciUZI4Lc3F?OsjwuwPb)^CY*=tGdDgx7+1b9QJ_5##V}zQYhkA9d;$8 zXc5JuDiQX(O0k#Za|I&aNXX>^3qXyFnWl-OB!@E)K_nM)1;VO3;&m`(ns|rg3xxe{ zS48u=AXume`~5U=Shfa*aXP|ow>=yVcvP*79a@M@2CBrq)`$`c_`rd1I23S#72v=P zRbo5#NR`+_!uD0w>kLH#E^o-;)!479#6gl4aCqGwU%;=0T%mx+&Du>D%O%a__xL{9Grk3+TlT`nKXs}^sPe2zc}8l{AMVRyu7hssuqlO>23 z1*aW)5(+C$g?*~`g(`(SUboK&F)ATD8&xCvrI4yPp}9`KJK(_d4z{vJyhaMBK9>^l zDiOcm>9#up?6Vqic%j$t@P@+6PR;Gt{Ho6fcCbIyic=-k?(w+7_5dW|RsBAN zjk;4Dl&yqZ*hC1VXm-tOx0kV{i^Lx6*LR9{6uEq!u-zN-g*+k1C2TJfsyQr{PZ;g@ zvB{NU4!fyN94Yw&{t$#1a$=v*O_lAh6IJZc5Bqefus3@+5b!Wtz39jeX<=`~6M!Z; z-66%Rl(E|vip6X}y;vkUJRYYCbyHkk=pi_@7b7IMLj!|CUd^s}Vb(78c|BJuf5;wC z!x4w#a(cCJgk9GlZp?-9t4hF)0bmedqf9{VptCN|g*zy@$L&(WiUK?Gga90F=AR+X zmLe{v6AI$;*qsh&zlSx?5C=+OkER76YPS6BbraM zhh2VEi?GLML1XLzA2uD(6u+iLAVl`%Eb%=UOvs`5J=m|yt|$Pp_h*9-;gH?!aR&Sz zhY!{W?hKp*cnK>$yFcRdLCO3afZ3yS#1hE|6YxQq)sS6v`5kuFJV$&{Qe7T@1c2$+ z>>((Omo2{wdk?7^BpR{%1707{+sWR$OYATC6@S2~MBL%9+ofv0FuUh&F`s4Di2Wpp zNL5vb&+oD0KNuC7I!XSJC#*)C{;*fooQmdQ2k#b#XL$m?u;zD1>}tdnaJpF1T+s=D zbNeGeZm-h;R)tlVw>%drHfgTd%j)2$plO;wr zT>*c@!7TH{;;fJtGVyq{2v*j@b{3c?;x|S7s^9I1Xl|DSkmzHT^Tgg=?0zRSG@_`Q z*P*I*Xid1TrnbC-BPA*abejQ~KZ>5vMVE@9zJSB!_l4YEc77h#cL&@dNX+3-+=>Ur z#BP``PAP!|J#Z|V2RLch!tOFbn~k`np**5gR3TszF2w#iUp!)IY!4q#g?8Npfk#+8 zIY2Zt6UWQK5m6APD|OQlvG5qRqFM**D*RFuqNTbSDt zJzQrx1fFs5U`qHNbJg;2NO&GoDG0nycmgnjSGBhr!0uTFEPZ#Gm}-Rqx_o}8qQb7AsQw(i zF`r4x#hgMP2iPzy)P=!b)tQ?-U7N1f&S~GK6TFhs1)m>)dsM@AHJsPBQFGZH?y%yG z_+4ti0gKw zvb}b%F9h>fJU}DO{ELq%E8rI3sRNM!yk^J?cyigryF1kv2}R(;!cM=vr`{V#;`iCr0H%ZQ(CqeJ zQ~1X7Sq1}fn%4~(Lfn86J7R|3^}MksTg1dt$zuoey{-^w3Hc!qc8rONq#?fYIlUfl zL`5`#P$0Nk)UvVdh);7Nl2J6oIi9}k+!pbkeE1;n-VacKGw?$JTt3yQ^jpKVBA?lx z6f@YxU1BPmyM{+d=;96e!*;s@_9-s*=^F6{>y;4fxrrSd0GRBxR+QMCYk|2xLE_D8 z#g0Ek;y2ccLwm#d*GO1_a2uP^0_o`WVl{!g-Z=< z5vNN*h~h!6q>$JHl-w1g(IM zg`mYF*x>ErP%ApCKA1H!7x-u;d|ljV!+ww7>3{=r10vu2IUFIyi8a{(AUmQle+a?|xFWt$?8V(;NDBKx4kTADHzGT)%Nb@ZTg1gy zO>wxr_!&lo=&Hx>agVu`J@*T-J9}gWw)W;$alYjCd&3A!9bp9JPQ?DK{4sHY)#q{` zn)11vA$K^WxkERG`M5#sg_UA%mfP=C?NBsNB;s&}T&(Xlaa6X~32zIl3OTtCj`(k8 z_HE)wt6u|Mb{~R&&Fk}NzFWqz;0|nM-*yC;9k+|wk{f}dLyLIaNTHA=Ds0epu`C<0 zu-oBr+ubfFVzJPzH?|JzW%c+S9>w8{1bhJmLC(N?Fp5v-VPp4*N$p_#il!)`kP5^OBWv?S*y$Z&CjdOcqlgEo zWyBT21QR)4Jdlk*B@h6ust1vgUsES>QFmo;?G!sg-X1r?8?S;G+krIrj*YFpbOvP_$-;v3y8#xd4_3cYTr8rfdj0>|8*!q)0`A&F-iikeX7%3#)VzHaQp{sdh(#;~Fr1Bi z8S!%jx*GOs0VQ0??7PJU*Wes^0_cYxYvi$+K*Q)_QU_}mxs#F=(8jK_q zL3+o1G{V2>y!y6Pd&D%W->y1%xE%-sKK*WYbzG;QA?+ltNiaqQ*n^O^W}=}yyY`5A zu=_Bi0^Y-l-O!#|c5IJ0I2%ZXEH4D-XZLyBj=-JFwpSct#rDBJkI(H_;GBGF-NH6b z=KjOtjioNQcx+V-gdKhtD5_6E&{>b;qK39VbUNcFzjHcsXX{M4?CK_QTDBWz6$&`` zxr-fY;F-lqC}7V#36_4*Bw9Lqkv7=faQiA^Y`b5XedRBu&S`El=g1@C{m4ss#_aZa z99qZ|(IR)TlSjnu#j3~ShydLbmnWj$efiI;&ShJl5W_GGK(*6{Ll@17jNUWvf!4Vv zTf;tk*y~5mixZ@P+ZCQa#;|tK+IlY@|O^@RJ(oINv$zyJXew@0|}6XBp@h|tggqd z3g`&MeaR^|L5B5=th(y1E4r@7uIGY)t_pbXyX)@vukM*4LHzc8f8YCwlkTc|y6UOt zexB-?KYf{d_(JZ%b;O>lFKny~&rxUV?n<{$5i(+ol*j%;t{$F|mX>47q%Keodor2gy!#H3)Z-EGrR0#F~~7^bfgmSoXe_ z*%y>xGEX~_uOJzG+NzZs>2TI`)(Ex_$Z zgBFu!_UwzKpk-cpvsnJ(_EsU}k%kLaSqyz9RQI7mg-yWyS>s+Jp^Ff>ZIL~FC9HMz z$g4?n%gT`-@P)4)SsGhjabHf3Fk;2;cW;0BU(X+(7wbKG9BthiYaCq{yZ`E?vA$Ow ziH*E^Y;4b%rN;Ht=%ukOW4FfMyXv`?>~UA{X-1EKieiPdYwpTK>%Qw}(lJUR0R^rxFX2V)OE(2E?5omgHJJMq8}dSPWOciC_fk4;<_0G_QY zJH|FIQ?ui%_~U?=W1p`njqTi<8}lr`f_}O(_S*6QpJ#h)@AB^SByR^Xopr^K?nn8O zk~B5+DPIt4FD(;gQMO#ysmwA$m~0b5_r$7K{8CMq)4`>(v`}ev8BwSpr^&PrT}`Ud zCG-{cZXE8%E@|kzP#wywF0;ud5bpW#5py^#BpJ;olg*B3mJ82q9Daom+q0^B?A8Y- zVn4rqa6YH|(1$#nL#->lu^qADWK+wT*xP1DBO1O{6@;vb-Og^S3IPqiD3M7D$MpY< zW1egR{SR=wWpy#hi!E4v6XfuZt0h9e-VpnEjSE;7ukFGc%G#^wD;s0YYx}17GB!=L zhF;hhlh*a=*hZ{Z-_r?CEuKY{NQxEMr4QdVY1xvB3v? zZ`d$^+!$&#`I9H-nWW0EF3U}kYIuU1C)Xyp=``q?E}I|;LjBDgHJMp1e6^Ny?=Krm z{9HmDxm+&1jzWHMIv^zwe9j#E2*EExLik07^Z*VcQns8P>%U0`wZ?BMA?dN`rjRS0 zKRe2iCl^-Oh*eILh?NfK|KxO=FhX#MvJH_lyKNmJN`)l&XY}`|GscwZzh*GkFW)<3Q{4J^I}gv^3=2> z8VNljArL-~qd}5-WaEmGqI^P+h-?7a+LPX9=uwjNlXn!yKHYXRNO;xuLpLTCuyI8- z*k(&Eklsd7iOJIR_S;Kuub=6mHv0L<T2IyPApUCY^pI7{r*ez%3?cXv({L>8L^b!8WT0S~+ z4YxeypEPj5ZJ&sQ+|jb@(;y+0Er0#n3XGX+^f^};Tle```TNz_+P!O91vzt48R^6g ztem!ZNm-Vhd7~{Ov^r+_;+l%Tt~Qnt6AF?6ACa3du9i@`VJOcgKxDD6ID_kr$nEMZ zNE&}iDwH!~tG<{Hf`9qNM8Z}5iEsL>$|spL)Et|CzJb2AF81m9TS;XseBmD#*9#a5 znIT*FdKNB(>6c$Gz&$~7y@0vijISYS4}J9p{bp_K&95r{cW3=W?EY^u$(^y4-}Eqd z1H%=&@XZ{)k;-qox9uAl`{CP8(x$Z_bTOyyjc`?ut%>#d4g%4R8M)gZF|Fl|HZk>@YJT_#v$ahA*LZSWLV3kdlECR)%MB-EX|KSRwhD~EC&6D%Z-CF@ z9hk)6?}dMZzmHu*CJ?eIzMhaT2|c=&tq_TxlvA3LQNwBXOI%sJ)PW(FIr6v78%RHw^O6Cokq{r-^7sR*c zklz#f)H>FXOU_MBksh8V1LB;dJ84gMa(TLQ4w!TY)n$>>owei<2s$Ta9jC{g5*bc* zu;(Pwh`j{uL>ZRSU#$7x*a%-Fxe=_8&i30$ReKSP_sGYhoqlA0hATX_g1+X&_T79d zD<~w@#KM*ql2C2RVE~CVKw#sBMvLt?F1Fve;i)9UA9DroC}Voy1h;E}cg000LxhKm zOr)FOcSRna3-H5C^^p#2R1ujjZ{22~WeHh~Aa2JtgaHCD;FfEkuxnfVnIa-46^gx8 zOrk_*LpzdTkmIEt$r>}1D`W#oiAuEivQon1dPDu#%U#G=_Pfrcl(7MuCaV-1P zLEdiLmb;VAWD~oxJNY(Ehxc~I$YWh%m9I?((4p5}YI*9-mr2WQub&d>n~%n3ym@o% zp0_Ja`6!K%cYX;OiQWIsRG8wE@1&7*(@Vwv_^!+P=A+!mK+r!FV)B6wv7YZ004n%i z3nii0=N}wMH`Oxs#h*1}slt}%UuF_M-^LGT0y6z0)j~$M%=$Q;AeE{;U6zy7W5Fu* zh@IQtn?AB7*6~1pJU!}wE7tu?uMX{;B$hXFt>3ceZ=`!jO?=+Z=u?C~wuL#T)2{TX zEo{KASer+zl)Ju=nj(0cHKf-rX1gFNDCKB$Z1X}qq;1Id!D5Dys){Q z_`JB;$eIkpxSDW56=lG0CI$|Mil(vsm2{r;CGdkVbaUk7WLQHlZD!>&=&13ZY)<&r zL~4+ZC9@JsntpwtaG}i_0YAcPa}7v)sFlDB@Q}?=)MsYU8K4W#Uztax``U!@a*h$4 z$`&XHWbk{Hb}4+&BuqXqLi8$z`czBv;(fz(s@3`khRmL7_N%${%#<|X6cYLfDe~NF zrZN^ejgu&ilPD*lVF?oDBs8ooi4arY%h3mXX8gGtI-52}N>(l$ z-eM3uCzNgI>ya%#COBqmOK_1}ha4FfUEIk9w4TtXx3C))(rvb+f;eoU zvs+l^B3g5CIf#$3+}O6uaWQV?Ou~ActXL3m5HJw*IpVPJYbzAMmn=Dl zom@n_lX>xs+h{IHiV?hFbzHuko};}Jg2j9I6PUga4M+q67-}REU$^4y(uNqZC3anYP~_OpIV`gN;T~HX8O;ek0nJtu~LR? z<$9CU^QSHmZ9c2v=M8)tj^06w$@ELN@db6FOdeafamrD@|a?;mDS&A z*bgHrJ98(!oeNXs7gQxbsibDGm0Iy~I?$T1icr!QlN&OH$zsaVWt7yAB|}Le9`}<9 zHtKHr-iQ?W3`_B2JK2_g$yLFWi>n%*qcFbk9(pH@U*ChwAhuIm;Wbcll1f5nx5kh6 zB*$s-b=(z$JiIVaW|cFz9mxqb$Jg~CpHR?*-QAyrN}6}H3g8~{&vs{G~k-e;kLS}Z`_=w@B(h@dz>m!DhOiS3@ZShAHA`;s22s_{> z{qmAVfLF@WLfhkK{lr54(;Uni-S_gjwHoMd)d5^WEyPH z??;kSa(nFOVu$z-Bgqs(8rkFu(vLp-2wPG?M#;O)AdDo?-Dd`2B!TXMZSjvPzz(vQ zjTl27=w?z4lt~b6Gh#hXwQc;`x|Mw~21x+OlzA1|5+Fwi7GgCF<%Y8>lbNh*JK1P-#vHR)g{_7agE#wt8<0<0r{;ZiCjzyJZcqmza zodjo|ybm2^k3U7q$qO95!>XsrDDq0Y;%V{@Av0LFR&qP3kFRefD2_zg$m68mjN#%h zA17Wy>e#=3Lu$$Bc)1 z^a;|HEq@)k*}vE;uM;QM`q%5Em@JHU_#^QXa(jHj8>pc{t){<8Mkgf~s%yju3F#M- z($8AoBo7b=oA4I7>k3nt&T}m@Rd6*g_CcD~^Q)PyZRHS@Qt5IjcG(OL_6kcgc4cS@k}d3L(DXeey-nflzvd z$g9257@J^4Y0ykhxLuQ$CZ2^UBfQdxyoO&kXN3-KV@p3EgF%2_e?YDvP4RC&ARP%z z2+RG5Y$Ouf_YsL0YXe)pHtYOX^6$2h^yYh8jfyR*Rm^n~dU=qIKS_FJCyjuEKu-hC z(5C&6Y*ZD>uryCjV5IICAzW+A4gGbWF*3Fc`Bbhfgm%$t_%P=fIG|>>C7*U+w~V27 zDTII)yAnb#qF5`1n%RMKq+k5zQzVy=?QG7+q&pXY2R|lCzB%Dkx$|O2XHWubvv)p5 z9jPX@mZJmgQlHZ#K*_$idX`M*@`kmX?DJ0`qVMzj-fUqf3AqY5!ZU2%utV!~Q&hKNd zeMx%K?{=~8za(S3%|!Chr`lnW^O3XKLrthLb9qRhQWKx?6?qRiR($BUnc1^J;!ZrcDqxOt$TXMlGWRx#BGPJRoC0xBATxa$-x`mREV70BtP&oX z7x4(AL>Br`43?Gh7=G0*!*vLu?@jO$*#Ig{DAU?qhASyeDAW2~2)I{eQ9qd#4`k6F zL{2rojrOu#Oz*g)Rom!}rX&WEEO87ZjzI~>KuTf&p=pD`+h&!&R5pRyV<5G~0GyMB zzTz%K6F15tXop7;MwDV1hq1kz9Hnx6c`kjElI1LFrvZB2Ak)>(b#-BKZSegk8w|gi@juXEP-+&=SiY$w%JIJZ5H`$0rXh#JUg zkt|lEg|=?AAE}E6a1n{jNN?JiHI>mY(EDo{?P;Kw)q{>DGuf0LbQt_ZtOvRc$inz5 zJ*bDmY2dLg8Kz_|#D?N)2GPk}XZ}`BkI)}B#&f7YkT-?OGmzkV1S;a@l^(N zS_f>>|0+ZocP(R4a1KTk6Hb`BAovhqVu6c3VTpJn~H#pY*97f0B8 z6|`fYWHjIy6iS|$I?7>xc<~tLs%8)|)zRND<|!<09zzS*&7-lwW`?EjE=!&2IxkMs zFSWcQBXkGrJ%-BZYxqfSF(ao)8LJ%weQIXg#?Z=Sf9M?g!OzUN=PK}!jARS0rvK!j zWaBur;rx${qe0N*%W;&u{O;rFA|CDLT?149{CHaGyjUQDH-%8|#SWyoxaTeh0uR^4 zou}bLuj0NFk8(B$fV^|&yq%Txp$}S z3Rz-Hm-7wnVCs6>mwmFF+R6RwAIoXzy6oz*tTv`z46R7|rflvMvbinGYH#ne+S_}h zrgjYWeg!W=;DJ{5+DbYv2MU4WO$AOmj_+l*2kAy^X77XaT_E?%hp3Z&wu3$K5WVs` zNQZ&Ji5-cGUJ8RujzMNy4Bpsb_`Dywo0Z~CCR`4+7^{riO z*~6$A-NW`j+?JM8*qD`6NfF}5X#AKE{~a`vgm{SiH;}zQTd|7fTx8*7Mj7qMqXclQ z1KWF)=66P*#*3ogn_=1x=q&z8G}JWOW?_zpsh2&>Xc_%rH#^4K@a}&bL-*#c*^#&9Gx@XcV04wwBh>CwH(1 z*U}>T=w7yKE$!9oFyc2yc4(j@E5~aMJ+q6q%vUokAu`4m${E3X+1G1n-|V+I)nG-X zDC@nB?nE5^>N?tyjACck(cWlD>*+-LzM%*~tY_3v4y=dY$!G7cr=7F%!Gknw=)*ls z+(0+rfh`;82ms>9H|&tCa-m$b)KLg0VB?`)mRYTpIlnupg&%CD z1K7EZv>*L$H|w;C_IK2PzX*wVJ?$7Nv&}BEhiDDT>U**0MoC zInCBDr@u7>l$tgJU6UI9t*96#MUMgTiRF@?KFoDGOQFzhX@q?5PT(T#bmZlTR=I;C zOD+Z@thUZMU96$l9(MB<+6$KG7hC8QT;AS7f5qpHY^B%b;beu!*4c6fLTYU1w_9nD z2T`_XXo-5!uK&atekOm%>C$6;@Yy(q2xa_ubn`t4-5F{;#TGw8r!^(w>6D4fhGBz& z!R{^|8zh42iU3SIGoQ$fGW*` zu<$}zt|2Xa>`4+jx`%1o=#7Q>4!rKbF*x{7!mrLQPBAhFwM=O#N=z+A8Z8B+Je zJv7fI+j!KANTIr{i-EZ*N;syxyiOWG8ST|Eq>Q#!v3NGc2E^q~QWRr3!*O?4c zXYBmGi<~_cijyG;Wf>JVz(X|NKTbuOHcb}Nv zA-TK1aqqy6?Vw$~yw-7%F?J*Gl4^kwRuyCz0V_CA#I+j4m9wrvr^K>%(wpgfkFu(r zv{O;OiFLtF{y?VL$YX1E(!tpoafe7xyUGy9*%Zc6eKsN}lqYGG{QAXvoi8e__;RtgfIfN_#iH(oax#e7Y zuyqL3SchHC!gSQpMYcczK}8;3qPl5zSmi7{Gpw z_7r;NQyr_zdcd~gVU86CHT$LNvYzP2u&rG`G^`i;G0b(5!`s=}{nTf-BZ>uQGWq_^ z?m-9WKyV}7;1-`<23ZK&C>$8POou$#+2RBA-gE<3dp!Ff{VxK+NIOi2Lrg{=rYk1c z`9Zv#j@Kh6+PEzT31B5bwG258x{;FxqRBG2E)|ucFRL1afnuj7>|`KnQXu$i=4oTKWBt1e<#a0OqkhN9e|a9}Q#R zrpIW{tao>|;+(t_!fX_i+2+TPq20sdtz!1(V?04g1`nNB@1s;H*adKG%qrW)K+i3Z zmU~&N_Yb0(VI-h^Z)45VQ~F17zSA!%h- z9;5w9Evq^P-`+NcV^1BUwq#)O!7(})p75Gq(|MWs6*kyb8DR$O+qH?e2lKgoGioaN zN&AKXBvp7xp_(YXPphJxFe@lVoM6LFEJz$)iJ z@gWU40MF!W8sMq7sS4zr#bpIILRhKvGoB9rf*pE_{v%V8bCyVYPA*&jI4$pIVup0p zR8nAt8yrAVAP0ZWqq<0rjlbPz#0{6cakNn;nQZJcv=d#wn?;|YbBn%%fS9o$Cob$7 z3H@tV{OmLIX@c6*&Sz-_kIfN&7xBc)Z)OHP*^J|D|Q)XgIz^ z9gasNFj^qTO%6lkZgk{@VD;HG&(pWWJSbA{7icKm5Su(!^8&5-|CSh)#O2>2zT_d| z(HH5}O>l6u9R;v^3n~cE5F7%a@ZMfUfu)gBwB5O3W<`F^$KOEW?_Kc%s{=&fuNpx8 zc#G2>uZ?5&tTwTYgp)y;u+7D!6WjO_FY&Q`FHvU-t5mY{6Idk@og`Lm6P^D%R=~48 zR%vaq!r6svY60GC#!DP**-Nw}-S~C`jsNOpy2?iXK8%&UO*faFE0KgkK@eIp1R)LA zjcJn50oNnA+HgHr!cM)7L`Pr+@6e{EJ32^0cXZ#HB?-fD4dFxZ`40VkF4Lcc@0M-C zD+&1Dpe^G***^*QB0e$nJKOY6PW0b`e$3w_+>INKSMtGY698`jp>b{cZ%Fhf5lg}+ z5ooqbLJ%;Ma4o~NlnN-R3PKX$U!(s@v`67{af3~QaOnWvy%9f4*m?AY|j3M7-VeSU)xJeV!x?N4qmV9K$5$m-er=OF}xv zm*Cn7*9Khq0E|rs{oT+%piTd7+>giSOvffk2(%g4iTi%|JcEh3 z^d}eCg?l$Xx1#^5HvPZHJzqe&1pbX=f2p~l(;!cG4wq=3NwohMOzb47wKbTHYr{eG z^9LTJg3zT+nODF!O&V5yeS==#P(D*#P(HG@UT4kU;uPT3ztRqVUQxD6 zja7388{g-utkdhOY9rvANv|#1^e}oaKly=^v;*R` z7f#ah4tJx{ZMDf&HFD!DT{gcr7K$L*_UtLzwfrE5 zGA6I80rLE-N@lZW4kqWNS+i;E^u#KreuPR#Gh^~cbXd`^8HTUCECG*wObd&?<>NWP zXRux~e{N-i&e3Al)3h_$%=(m!SyMX~Ux{n1s+lQ-&hy?(-g|4+ zoWVHt;cbbxwR#;ewKbJd9ecT#9XgG(+STl()3gVDYz;ein)ak`tYIC_p#9||5*DytA|* z{S*i4#txmO9kWwFce1@_X}_*J)?=)2Y>n}iKN*~ysW(D8BKktq=+|>%l``ognoG~G zH+irdXE#5=gN>ii!ojEcxPgC714#9Gs<}V~{`};}TEKS~t*zHU^vW9j)=Fci_pr}C zp(RagHYOo-wVr>Ov0klgn4>n#5<+|VP$_>nDS8R!)z&vuVm@dJhcFgzsKer~q?&Vd zEdEAnYJ&=ujkD_YhFP_9Acy=d6f39Tz`fo>K{NZETr|A1lm|*y2#r5FVG-uF)S}t~j>Kg>(?OJQL zR=Z$uQt6N5eO7CR(NkY5@E2OUe@1&1e8Ri4c=rOmu@*A=>}DRnPSJ>(j7E?Bmaw=xMyN8{NF!uuRhN?HEiS%)jajMj&MxbdCny|KPpi9BzP{ci3qXG_YV9TXT;3cuD@mIa)gOL~3*nSHrhb%>`iqzkjjGh4JH5Q>_D8ap2SEJRLCf zp`BQv0}LTVRGvG(p-~R&vMNK0bwKe#fwco~nC3&Sscn=KdJ2Ks$sRfn+xYHIcI-TL zkGU5qUIN>hbwX%)s;Q~i;;K}$UI#sS!N4ko)yO6G355dJ1sFq|A&k3#w~KL7H2VVW zCZA6|uGL_(Je@Sx()ecowTnG^0jMC`JaK_`riXX4FD_6|zYlO)VYM5kuRZR(5@SAp zYZZ_~`F-4%)K770@QW|0*UsPTH-}XXd_dvxr7!6ain@BnS1=B!7`t(m-`SG{YiIzC zKTI|2c=OC2cKcVfb4OnMv*uORXtnUITB8gz!(IOU?7&y>FgRFw^DAr=2Xo(kg)Mxz z_o9I&cd&}DX}_ZF`!K`heI$%d(I7r-h)F{u*8L>atc%Qt157m=>*1xo+sD58nwEFl zpL_ z;J38Akat~9OWgFkgY3w+bOL?m5VL$o2hlT!nD;xJ{BJtU8o#4%yn)DeeFq2k@nQDz zcPQlivW0#79W6^g*n%m$Gx=-U+1gNB-)PvGKen)n?=g6e4;HdPU(*hB#gP=@Y-B6j z_dR{$+E)?c9RPk7OJhTQ+5~MJq{-K!Ck}32ZjccZ*pN(H+ zS?DjbkGhEw_Yz}R>X3`{f!|6(-(?)c(tkT|3jKd$T>5>)J7rnu_ci;Xm$U4XkOg2$r`n^AfNsZz1r({>m_BV%QFBJizk-VX4MVBlc~17=XKR zGjJr>Fo;uq&^G)LEcXIpIfux?%@80Y+|Il4iLdD)4zSo>9$}_|A7L|v?DalkpWGab zUW?`ieDGRRQ<>O1Ufx$cN62feTYqsRUhC8Pi&?p8aV#;N%?pa1$+c`*Q0&$DYb-x@ zZrz+Jgae$Bz2?quly87{)`e~CL{RL4x1PTMd}u$`7&%L=uc)uDtsloDbWXosp_)a4 z4YT&sYHMKjdo?uH3w$@dV5aoJgQIgB2M?ZFi)3UG8#h>#n>b^q)WV%}IiFP9fZwTr z*OY-psL>Gk(Y5t+)y64xh{~?T0+ZC5Ds5~{v{vARF$cL*;UYe^LEy67YdT-`W+QQ5 z(5Qyz=mJ-j2?(hT0iRgM*BH`kI#6QQ3>7=k`*3RG6=(G2+zZvuoIe-2h#}Dl(D@Bj zx9LL#E}0W*YjmNRt++yTbmLk!()b|^&d=n7Q(cBc_nOY^SBjl_-Yjr^(#je zS3>iS^WGputH_>J#ICeOWRrbjuYAtw~^{W z1D*bXE+1PtO}ySUiW7ARTM4ab!(om8V(0p)h*&7xOSgccZM~$s=4%t-yiQ+DK4av-=q8e zP9+%i2ZB+r-yJ`!iu=$VRy@wA%kNeFnkS;US#3ldk{5|MJ;8{oN42O|b9>n15%Ee% zSDku93q*A#ptuy5mu2YUm7O%rtGnC*kEVG1!LV1a5GGB$!R5SeqT*$)h}g4BFx7VX zXN7gYSC1&ch{xp%h66#iMHh!l9-r<})S&LwBD&&rN7)6V*W>g?ot|(YqPwH6NQ8x= z;=OiH1Y3>x15PEPsnLj9!N>z*5jz(Zdq{fN8Ho6mNZ6x$!cM=7b)PBDlp=mt(B+D1 zzJN;)`*ml0?M(4@+R5qmhP^<==ZtziLAP2VG*rz*qCIDR1G`Wqc4Svoi#d`WbUS^% zNYw3CBGG6-Wsz!eiR9P(-f%$iy8MbesJNW$LbX^eMWR8k?hB~Cpf~7sd;M(oY_XrD zs=De4`mq<6TXU&SwtcpEjpTLubf?FMf0`O_x%`aI5pR)#?tou)NBmKzR{@#*tZt4t zO7i>sQNP>mQQTpFKmiWV@!m*8i3WqZ4zW@+Jse>j=YmO*pbup9yH(w-Ml|4{&lQJB zfuQCLdV*R6BvqUqg&mnIR!RXd(;ZNPVUH38;S|=rM!ZXMs(!D>rKoCDaRZAeJ60o3 zk-~nz;*5BsY8d+nxP7cstvCY&4}gh!z^&_=KkCuheYJoEUp&rWBnWb-5ijulqE-w@ zS|s3iYknmdaJikj?q^D!I7ag8UdW^Zc~!j5sIIaH>cr8dL7z7O0Z}+9!m2+~A;7%W z51Ahr%3Slr9wj~vYSRFDQdCzE)D5U!uQ%XTG}dpPI7D)3VNcKnCD1()F6(T;JaHC! zgD#)ub$NY02m)Zgm?sXid-SLqvV{G5-9go-RWR2*VjmW*7jNmT`kfKC$K~<)+)+=& z<*E>BxQVQsHUX?5v&BO8b-g%Fii8zaQ-XdjuVEi_Xkvq?N#TIc>r{MU)vHDWor5ut1y*(T;Gl;SBqHU^ZCV?^f|vDd=%WA%;){PbBR1N7IxC8{|iid$plw~1wv z6I)S&isJK!b(h!aW$JC>vyu;c3HlPOyHSD_=3Wleisg3ItEz9$;+`ZTA{ z1&gXhqcC7BZwZc}CoK^tNLn!H_6B@`U?AXesk)EtUm|wN!$w@NEzzhSCKMX*=OtoU zp6ZMGTrQ_C9B}G^NRU~Viv7Do$D?jV55myH>IVW9LIl;2$|`OkRZSn#t17^z0Z`Hc zs)lS*g?)rPgKsOBiWBTnNF?|jbVmH)aKHr${A#&a!GcYqqs;B{L8(1qU)UWDM%>W~ zL0^dArLi)qR?R_BC43uS+$0{cH5DNcph7_}1affFyljn-X@QRV=uS}(=Bo9x5!Ud? zwW9dza1L|T@t8?C zgsD_SXHTG~VNO+(rVB2L0zZmscpw*}23#ed<-Z^XY^CjN~$FZngKJp61~V`UwF#H_J$mcCGuc(VZ%QfKOw^|iH)EcZe2 zO1sym`eE;*(1w5;2D*TK_@G$AhCC?dlvMJX-QdBqJP}wXpFikSU2Yi6NFj$AD8Zq4 zql(|>(YcrPxY%0{ihh`ZuwU_byj;@4im%v!&38KkFqLk<3&8LbTE{JH@)0=OXLgBU zwkaldlwgW=c)>t45QN)9nDOt2#EE(MSvVL`x8Dt&)m4Sv922MItEwB?p#?l)w;SlI zo&4;h2Qe9t&XaUE9G>5!M4SpD6g{}=VX@bbby;~>?3sUwTDZGi$sDW1uI#>t#k_n? z3p&FQx8e<|@QZ$r+@E#ZAa=@kL9ShJF}fcp!BOHpb)z4lf$rBmh*JUqujX=>{ftl6 zmpNyP>1^5~VyPX3L4XDC=7~T*-AeaW8{vrHW;AzLMVO+%PWpS)GIgcsVJBCL13+Py z6Nc8K!!dfIL6vn|CEi#9=gh4`*rx}As-n4irO(ypqE6qN%~&Z8wIe!;!ln7$PB+}4 z*Vl*1tHc}Z2wQx?hyqQAeR6steGTY**w~;Kb|D&uJ9Y=d{bq8sJF){z9G35oYObh` zxF+lZei5~QgSn@^tHr?*%%c~~@+v+L0zjvmHLMm@$)&pkzDO|Ob-|Rt%Cb|dMLpjc zK%^N7gyGHjK#GnW%l;2QCMSZc2;07k=&s*2O^WDl$r zC+A;keSK5d4k*^kNiPTgx$Da?Div@diQ#az(;w)P1#~ zo1N{DUbollM_i=45R8tS)_&F^rfm@m3Sg~*PQOQUxsa7a6n#7+rd=5w7i%TO3!8$l z+lv4k;Y^sxTg8Yy5b?lj>25z_rikvHkdW&YkBT+<5iN+|CFoPVnAIKiPP~E5h#}s( z?h$dLq#}=TAySVM^#(Pcjv#cP4Db?M|oDtvI2)NMkkCf5Ww@nfm3!lIX}b z;r{U~f|?trGO}NEvgXZV8n0>dv#GE;N3GGg8^Ii^*9XJNQ4MPBqaEVa`3M#j7+8cY z5kCaUJ?)x{Q{2RzdUvO~wj0=8)T@f2Jyjf)A8>3;I9-50R zd;Ae^SXF!~b8HpEb{{;brbZ%2W)Q!+AyYXVpcxV z8wJAe4ZGpug066+4aM1>gJOY%xGR8s1bH1oc3r>eA~~6ONG!JdbVUt#RUMQ;28BSH z*^k2Ex9$=%`R@xeWzaNt*T zmuuEV%U+Z34o4LY;h?G^sPy>4RTo)PYln@%{ym&`KCh-%UmTm4=M5tS^?H#{AXc7z zaik_6-VlU}1d)R4UIguPR++?Z-6Pf_{6tz1^g~1tXTS^3WyAN1W9?cr7P^Y~#&c#R|+tTVdv6}U%LbHmX^BfhX6 znRii1vh!WOfEy_?a$P61-L2Oru=+4AX0anj#b|-Y%Zm|ks9so6(6ynhamn}kT+m>j zQ-kHxp}UQDnY%KC?CV3~wS$pNYKjx?Qww+zUq$CSk@fUW#j!ez%_qyFk=2cg8F`INm+}_2->F5u`(Kw^dCGCGmcPYz%OpN3smjx%I zU}iAjMEcouPipQN`9An3Ul4}F1LN$CM4Jhh*5M;vic?2|j;tH8q&uwqoLuswym$QQ zH+k=D`;)xCz<11y_!A78SpfY*VjM((6NL43`tBmvnGV8W-)+ZGV)7!z3b9BJ3#S#g@ PO+eA$5s{j48~uL((Fz8~fEw$Ea)rzgJVk?Rj#hV}sYHj_0pPAhd;O$%c`B&UL^E~q$zx$fm zUHN6^o^zQ8TS)XE8IYZ+&1NhukYR7%k%C6S~gnv_X1 zXqG8O!T_ZyNhuUJagSzYXJsd4W@aX(@c+}3D6UhIqSI)P^k<(qDwvyv;ImIe*U&}H zv(3uvrs;JJRZUe|qcBIRs>PL3Q`M;9{5o}pFgHu7udkV335Xi1Y8$Im;Vz3dPg7?% zC1xzjj8xTjUb2*A%|Sn`G}Sd!s&%t#n}oYbddETJ9%@GOcHY~Bv`3#RXpb%{8bL~;FBDbaZ)Vp)(cOiE zarIW=zP2G@d)vK(qar=BBih|1TaN5FDg<592*DgYvZHOR%PnEAB_n@= zX)ld@mv6jeWKr~Y6+gFFgb^pcKGe2#$*a*9gy_`KW9gC2(cPo#qqmJ&9JP)a6Mg8~ z#Zh+6;pl>&JQsay%vOD@@S4SK!^d9D_gOIR864VHHhx(udPi@bMt7`h>o@5}6MBoL zEa&%r!RJ76XDN4SHzMVIq%{uK#Ge%x)*p`8&ws}ED^u<*b^zj{0X?1t{4i@G5Ek*TxR3agsI1(FRt!Gjz!y7Ur!%c8y$IHIe9aB&wYLX`tEuq+Wr0l^nLf& zke^{nZnS7kFTUzr^u7CglAp$hdSiY0njt-(=VwUL$Vi71P*>87qFrV+yR z79n^#+Pdc6N?J3+cA*-JODw?mowdEA`yQA;+L0mSeDbZ3Q9UMh~*Pnsq2?a2?S%CLG-4{}Wu`#KBGe55P^5_1RRW z{ls;|C)UdrkQcZ}xl~Sy?p-$(!kPMrMCj|AqDAW+Kw#YZV&0jt{#v@fHTuN*emYWN zx}!B((NbE_NyyhNJ1R&$1T%Kr-V$Bb(u<j;%^`%pzcWubz%YU|^ zls9`@0wNcT_6->Irp>vBkt?7J8?g`GxyIv z`V7bnRp}5yU1u!N2(Bb?Iul(nI_ON|Dio)4GH?c+Erwx;D+!S;(P7cTXpil;gMf>+ zADYxjB{MO*lS*1HSIJC{WhURxa;ZvMf|sZyku&u}HtzVCywkQ~=ZA#c9If5G5Pv`2 z?I4q)#e2f$cXUgkBN#2ezbLw6PbLKZi9O}e%(nA;_wqGc_b+sIlIn|>Qg2xD9qV9g zO5#QxmkIkGo%mQ7$UX5Gx4qHs2L_UNqT>!+1sU$%i#Vct4)n2HvNU?)z+W)`uZN~Y zt%qK~>3=sY=1J3kovY?#(cSj zlY)Yc=t3uOnV~Y8)Dkh+9?f`V0=GlAzv45opJ$Tmv4?#%&0%LV$rG{qY;sCWets`E zoDct%l(2=l#24FtB!|xCu)cZZer&>yKEIcZFCb1VT2esTD7luoyOINZuRj!HF85ibu_@h2z(hvJ9x5Tp z1VFU(Bqe;xuX|#L*S1E-9~fW|@Rlx@5YM1{^ugDfvR_!&$&!}}$JVvw|7kq9Y1rcV zf3D;-_{*O~LSAos=k)*~GujH?Si>ji1bybs+ml~-1p6J2%Et@IN71t5<0~G2MBmdC zOx9h%5u+z=F_BH*%W>G_-$Zo>01*Bw`XVH zEsfTHoC;$b-TRkDx^qKR{_9*aBf9Rdf49faOTPR(zkXh_Y~ttXz82mM=S3g5kVBHA z$KU4a^(e{%gqtz$-aiAYQ*|YQb z9nzWgAYQ&SSx%aah0E4Q?|2V#-9g;UbB}TnlO|8Lh{0{^qeuQWz4R!jcPa>V5`O0n zoSA|%b@K_oVa&Fr2KTkJUHg7BR3fq0REwOnup~)NonkQspIslV`0zYEydgUDba!$l zI`#B5)T@BZ}ZmxL~Fi9Y|imXJHD@5kjXI^>IYK&wM%heju#xwZJB*$AcviPRmYBQxG2 zJpALCLdYd=qO`q$Uv_Kfk{>N^Z%J%zfU0l(S^IPP){VxL!nWaG_9Ds4Ik7C!rDuCV zvdqzS=X#Nu(Pz$WH_Z%2TiPOD{f&^?=$P|m3AwmJo)frVF3-Arnc7}B|1P1cH$-=T zbLRRVW&B019y}^Zcv^#$9qJ)~=l*J0gnE$Z$KP`4g^`Kg_T5yD*Hhn>lk?HE{?Mtfu@OLX#~JrDGP8ef-1=;A~u#OP=t>&*>K6tvPl-v$V3-+fs4B-s{GI- zFWFx170?Nq^w{N|?RxBDFlwN%e0$s1KZpqxU=~UuWEN|pWH>n!J50$V+>BjkBC|^T$RDTS^qYg5S>Mp8%-UA~zWr;tBh9G{%qviYcBGX=ZaQsndz&4`la^x!!*GnKq@ zan>zaGLh3|x=@SXL1HPp17W5A>GIs)@UK;#aS|Czf31RV$a-6 z?j)ACaZ(WByHpfBxjEMV7V<33znSj`l?PSqC1yE=6DK3s9uudKk13>peKC~;vA6wp zl27KbYi}pzWInt1cCy-g9O0#xE+O#VC-uuzT*3TipgDr0yj0>m2rePjIy*SmK3WzV zcL%vXnT(2U3X{E*oMYEFk*nC8X(X3?$5u@v(|UaNsLq3=I1kz%jmMAN_zx7mj9I4> zkB%43d>bS8iitr;!0{Q4=Yq_itmX zr;%RlXcNgtSj?o|c~tGCC-%mrJ>LbhifSsgIQ36jOBxmm;|PTR&?gPyx^ ziH-z%9^|8&MV+Gc^U0PF*%Gt9O@_gr#;!j>ZZ*-rw#D|nhyDMpOvkQzpY(`}YA$=} z15y-QaEg?59=W6F_pOi}Gjh8>#V=&KfAK;@if3XYKO~QLoRWO0<`^!NYfdcpBeJAp z&%GZLmH_NuFA04@G*j{kJ#}SUz9EDASb7BS-v&rhq_Iep%7cltb|QRT;yU;|D>*|3 zlQ-B6XUG(CBDVhwd5e%5w&E;VK<^m*sbZ0@NgV>9 zH@=39kudwqdD5GdJb8ii6(KIA-;q0j0ymPemcNrMLJqOL-;-{r4zL%$C*!%k6#N6B z(vcmpvHu{Si=-hIAheQlkytO%KFJ2~to(CgXXiyal>Sp@9upm0Xh;~()wqQ59D8#b zButtYTV$d>LKeiHNJ5DRy7z1f9i5PGsIzXT;yNP4Me9q}H*mfeAU0Lr0PW z%$7?Fa~?CKqeQH*WXeKt7p<12v+HtcK5gH@md>HMh^#^5_SnW;>L*zIMjq|S8Ta=* z>a`lHC(GRy+PWcm47MI%BlBr6b9(S^@r`YHFftG3Q$Hn-#a=3;w~_e9eb~_mO=Guo zrEdDio&2al?CGvF4G6#EqCuA2jgBTGW8=Hgn+bh!p8?BL#WX+;#LgAdGbH2Wo}=(p z!Cj6I2B{Z8I&!txO$sF2+&9~9#;@jr1?jvb8 zR)-0gytD+oYme1G_aBI@?@vEWB`RC$0ug`M#gXdAUUgAqaWP=+ zOrBCocM$_A?xs!LzaW1s3<{;f^4+?jFN{m=s@;0MsxU6oKih5iUb!fkQe9HS6HX!c zjZus#l+kC^WzY;IwzZ7@gV*@jmSMEdrA0pW`Y^f!seES;3gaM1oj{N-1wpzL1f0e} zkPHxx8zqlI+33qcKXDf-Hey?esGDTGw$+df2y=*KkEZj-U~eF0 z?TkzN7M+|4T+VON$(g|At1UV?t(|b`!%<*=9!+P1TVt-F=^~lVZu$v5Q~v%|J>ddA z&_%FKlJ!D`mAi2G;7_;eTZ19}#BZoiJdP}vi!CPrKwL)H-D4>#SFv};LJ~M@&Wxk; z$6m?@9d?vdz=wVUGY*vE2ecXoSW!|*iaum zW|$SZ={O>*w~wBZym6Pn{_$=<;`?B%>DN_W4I(%GKpS8 zjmh0&%O_KWZn_fpXOCAx8)4n)o%DLHO*bj@Fg?*4OAk>hlBZ%8jXp@|hg)`TiBLiw zV-L)L6*xAHj-bzP;vHvf^mOQ9@>-sSnc3NDI>=H0Fyl#?jj-SZn5d&w^mp{lwfc&r zJah2WcJ?bwH8ymz9y6eAujm`y}N+E22XNmA??q@!V?QI4Bu^A1XRzl+ZItf zRX<$dmwix!RnSHjH_KT19 zWy6|jzvQI|X)t|eGaW{FG5PNnvy@m47x&0nmPL{+R%fR{Ui#}Gbs6kzSy@F04 z@35?ukU67r!){nf)k`a8v1eD(T0&l8Kkr5MLX3R9$uoq$zm=WuL%P#Xx3avxqz8pD z@b*R6)XpC6OK$I)ko4e(Tc82y(&UAx$MP&xnjW*1l68b`d6ez!hd_MIa`t>b1ZonS z*`KuC7`JYTR4i`Y5{X*ey6Fk8NzUNrI)j^QQAV?wphZE57uY+cye8H-fXtFM!?r>| zd)P8EQp~{%Ti90v$f$8~gJfi-1BJLj5))4Yl5hqr)5SB&jU)U%oC17~!Win4;SG}5 zJy#(PZ)YD|MUHl=&&wHlfm$~43eP$A%s^6{^J@bbD}X@-TMU*~OVzP229il;v+e`* zkr0~@Ag6E4fIH_<{&rQtfSpbiQ@oH&9{TuEa0mXR5>`M65x&NDCjWcxP zJXkonRre%1tuydk#*DJKL2ESsg4W2kO|~RG=`Kl@GvKy>93ay3@1#Vz2{xM(k2MY@ zFL6OCA7%*Box==4nl*sj9y>9NRFGTZAet@((J0Y$0x|yZh9eCy{}sDBSY=}ML2^6$ z;{ZtAhvj6%wQ(^pP`^?PGGM151{X_#mx@8hz8QR9t^=&hkZ!YRL|uFkPOHxfoOHZDv{YbJ{+K4NUh z&uAAOS55pm9PU5a&wh?5Zw4z^ML$5S{LfVs4?uaoeh<%xu4gol9bAh9=;VWx7xH5t zt)|GyQ&{s_L@G$Ju9(3p?x$K>)`;SjJ1tksS*-1T6u&xc)rECmgQV$uW?w^tW4LB_ zN)i&TC!VJyTu(et5rbY^7`Igp44unYp@{f{*WK zBOaiefa7})Q2tcuR}WG9`_ff%?9xSw_$*Gp~j8On_1iS)R%bPVMc!AYFOMA1_hiQhvhG}f! z!_@oV1~WmYdY&sKV6_=1YRtz_HTZ!|WT-^6vlWbn>8pF#=d2UI{!8Qn9I32jot|++ z=5Avn9-&rx_bxW+5jt`V^img&|MW037Y?%_9B3dM_dQKzM%N>uKt8da))(&EsWT$S zmWF4Ec#d6R8J^)b2iNasC)U$GeYPTb2cHJo()j2BoollGdV(oPuCW9&M(|PAuZ8wY z|2?+ik+jsnrnb-$61MQ14OvMH|p|gc{eb~6y!$U9+1&UOTQ*=%G6#?CWB!eFBQ}QQ``8!TsTpYE zQD4ZGWtMZ~+{LyWz+~ahCe83acz!F02?0q@$8%9c7&8zW+1PeT#Y1L3Lb2(Miwry4XxA#zkaNh77nrog=?ze4XqWH zbh%JY8;!<BnKeij{AnJqKs`=tJDV!bq$ka@GiWGFTsX7dWH#XqSWkJj|5?C_)XmSDWf^Z#Kzp&(ry z;Oj#K6fr~=y)~o+JcHy(3Ir&P3s5=)$Pn(}j(u$1HafXD+lKdxY=t8PTX(TsPDY$- z%Ys7S2~dT_%*Z;p8!KD#2+g^Ps{#+H^jAHk|3tej5HcvWUJvTz26%Dh^BuH+ZP`w9 zbEM0xsVvFG%=V04{eg8UVAdV9c&b&l2AfBBh3G*xgQhXKsxB#(yNw2R#h@-mXGndE zbS#e$TQL;P3jLIeIQo*IKagommea>Ti8!X{V?Jc!okwYpkqPu5&85Qs7>>mnPZa-Z zI2IhNSC!u~97`NME4NuV-@vN7+jBIz$tmDYfV;5SbF^By{LFxL>gZk7hZ*d#d( zszPnWvI!z3A#g>h0=0Kzz$~X>QQclTspRv0N1@zuo<+*YHUlCur=-XJ5v7YubY(?_ zIg6d%ON%qC+~}p+WPGel+DDg6z{^iCJUG833)W07k)>)|8ep^p$!H5j1FM8rhU7Fp zCF3R=mD9MvN|Q720u!|eumEPcFu0h{!eaLBKH4o0cl7B~U~MU%PWg0}y`PTD#{Lxh z>-vFL9zeO;{S?o)*kAV3;aOSSk*CSIyy=haN*|+J^P~>&j8z5ICB1O(AFltMT=kIP)XA#-Ma zeT6V`tB#2&?Brp(smm3&apQp}Xz#R_cO8Y{>1s3a=YZ^uCulLR^muhJ zoBAa6c3FqHK)@_pu7OILAOzpA?N8EPaaU2A2xPg7n2^8Gh{u2rz(}}RuvLxGl8n{H zO-V=gffy~99@94uc1Ku{W)5!L&EAXAp={7Pni`C&dD^9Fo_494cUUfH2sdZxMvQ{S zh*7$-yN}SWWE$Ia1Qk_10_&HlKRdoOG{||1&IJGNeu~aYMTCH)U(VJ|&p7^8UrAwg z2||O8;(zv~mG|sREAL6r0DzLMgOUia3uW|Kx;wzZf?UKN z{RN(VSlKJT&^EJBz zq5M;yr@>@h1gz}Q=V`@%J431c6`mL?zo#n+*W6EEpg*ZH!LD`ks5oCQoy9#WyAd^zlE32?+#;5D5i;K?m!TIwg#f1s1Lol$-v5 z3cM-y>p#%77J6@x-Ey36rp-m{+vBu5Zwuc-vALdI`xb3({xVMzdJ2LtH%$^Ipbg?f zct2l)>9}${F@JEnF(2>n==0x4U&eJ}d?KzzeA+N>?=*gWe0(v+v469$0~eM~6K;r4 zI0b;lb{fAWKAr$9aZmz)&1OjmU`{>S60}8B!1FUfNC5m6#>b;S3ZIJzHVeY#H|jGa zp%9bSpyeC=4zoLN^lhfG(X9AJN73g8C*~&(UW0MIzIUo1q@zs$e#v^AFRYOyAsOv# zv|Z88K+6~W2_GQQv2ZQMIa#~m!!bx;cKLXoRT8@6z8md0w9D|}tVqm%7~`DPBk*bF z8?|GAV=Q&K6ypTMofmXII2SU)Nm`2!A3p|J>Wp!sKL8ZS#Qns6oz^w$3nvyBB$Uze z4H6_2(C2_9#uKb4ERu989Kn5#NfkaE!>c3IA;+bKY;P8I*sqfHK)wn!e&YE zce=3?*ZuLCfCXIo6C3TqwG*Edj9=Sn{AFD81J(eL&huZ7k8cK`9H9?Eo}OqE{nPQj z8i-@kj5Y@oYO$LIZ8`dU!2?tfiaYf=fcUBj?#Jezpc9hh34?EL)EXKGH`Il+hNi*w z4RzI;+SE9>zOH7560U1vTRuQR?5n@gJRg7NXO^0(W|rySGODcC8mj8T#@jsR6h4lx z3kgB~5|GgiSK;m{7JQ%H(EGqc82xdFJ@-D%Lq+kg@6*9~J08X|i(FMJH%-@MSV26kdVZ%3`NzcRWda1I^%L z9c!v;0ppt;-P#(gd8ebRBhk zt{3q7yE&t=Nh#B6XV0u`)S86g>wGM?s#gD=m8_`x7q5VASeqvV+t;!6U(g zXHCKjz~)T8Np0Ose1og0s&*QlHuBL_K03Fmrc4O(*RstL@2d?O=G4_zMl=nN{5!^* z8kE|`h}K|?f5f(Zh}d@7diIA8@lwgQ_3SL~Kf9jgpGG`(hK)T>3mSuOKJ7_(GZxY~x+4zSID_uA#9qQr92^f7inPbQ(`l zKV?6h#>3Xt8(9C3sGPrZ13zm_oG@{M9Nxf`kMP+4&uqm0Wf zZp}tcGdw`q$i{y_hxh(=Bj)}XeigIok7*bA`AwLwqf^@m!oAYboudF9Jh0#RF)i$R znh)z}LHrsynH#jZN&_V7TlU(=w1}>1WuJdcWqC(yV!OtAY`4FoTccsS!>w%KC$!MZ z-`q2sIh8_6qo#9=zrzC*b{3enP#1ZxhZRXbgSIhteAx z)WJ1Xp+ODU;Oot-*XPvcTC)Xrl6%Ru%1ofKmiH$92qoyo%0H#~J^6!VbGlkLrz~MQ z+WAO|KGFbK@JRQrPidbn49`~0X?%E&)>H?9-n^ByeM);z;16BRRv4-Jx<;i&u47Jn5-2Y-FZzoxC-{+ zVcz|5#&`A?G%xcMpPy8w)`h|4cJ{~@c&}s4j*C_(YX|Npm+^0*f{u6#;oKKA;QW-2 ziZ$Ho@^>W72nO{Q{GDA^I}fsYfe-85IV#xwPj<%{>Y2ie=;oZNTD7jB0lr6`1NJ2J z_$a@puc+aQ#}l#m1|e+l$BSJqrT^2>Rq8=_Je&Fa484j!2k6?4`t!P7EPytdr{Cu8 z?Ccr5i&xuDE%fDGY*9OP4*rJUFuB4G^{j?5ONZXAv>~emAq9r9I@69UG{%z=h|8#(pZt<%`{{?kw#kuiAs* zyo5`@$?&2I2+~-?wSDUz)^?V<`oGF&W$SiP=1Q;52JP^j-5@WX7`x7`0??>%OJ7nS zMTvgQm(-ojzqVxDR#ePJeeb?6=@5#F^~+zv{Gt|n0j>PvzQnY~MiBN`N4K7L-`vN_ z&(UrLyyRxiy2v=#BOU;J&zjD`i{K$h%Q>Kr2WL;8gEu+0UpL9*OP2l>?ce+1$FTUv zSY+LJWcU)Mh`-%wV9?kESU&FP)`w?9;5xcZ4e(AE9%H+{qJw)JNUVY35rR89x^TF# z#s}E>ujr5hKALsS?1tI$Of6j1r29=Fxa1)B!ZJD7A^w^4*g@T^WUe}dB_@IY7hH3Q z{q1WyxECM#ajF(Pk0Qs4$Jwpt@uu3VkF(w9=^%RHarV}Eyw!D}jTK&?PP`k=#$SN? zeci_DF5p$CM-H==3$%nDJluCzk$cu`~-)yFW!v0;T!t&4Q~)6 zAOMe$)U_PU)E3@J-GRR}bszqUsZZjsDfMamO%hUG#rzNWfGIxzI66eXOH)taT4a^q z(l<#o=KGG~4b-Da?4Ts(u$A4#d)cw>qJ?Gm5J&Z<*v2GCA*2yw`DLomZ#3FeQ~x5~ z$g(hCAYo^Fi>m8q`h6)cQxNn^N$7WC$6h9rVCu=1_7oj;l~>+5B?!VI@HA^4Kn4j)FvURPk_~Rf zMpn!)&Ba9%NMqW9iMw$za3r`jh%;xvb;3HNI3rn{Bl`! zsaTrE^O+mb-4tsn6}wWhpT+u%Bk^s4zxNl@GLxUfM$?nnfk9$dQptit#ay;{o|xT@ zVCyk6>uahI9&qmVnK`>jz6D{9CLCh#4H1jEL@f1)U4vZqM^0B7DjFK<8piUBfK#qd zuy(${$rM5~PQyZxhI2DYWa32Df`!S6Im+wBe@l$Wt z>jQI|lu(T(a0R*!@wYDY6YBXHL;BnXkk~KgfdcE;rZQ0(a0(~|8>Y>k$(;fh^Z3l! zja7GP!vrp<*VWZ(TrODoU1E=}T=z!mKl{MBmsmQ<0TE~2y`oLmKYs2+r9qh~aHTY^ zIFEHIaJ3l&_=hkuMC`)k;i5@AitTMxV(+ZHPMbCgzhM8kS}Yv)5HK89ry7Q~C#NhY zG5@a+A1b^#fERcK0gVvH9#?uoOod78rXgZ)@?Pw&A>x}U13w=DB^W6P8Tj@jp`uY$>b0A}PlQZ2!gXl6Knd}Y z`2A5@M44UF6nk%qm@Q_h5s%;JPy%6> _@M(z*~N#TIvjzm0OSHKg%`Oet0cZl<- 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 diff --git a/substrate/polkadot/collator/src/lib.rs b/substrate/polkadot/collator/src/lib.rs index 37428495d9..60b46d47f0 100644 --- a/substrate/polkadot/collator/src/lib.rs +++ b/substrate/polkadot/collator/src/lib.rs @@ -60,6 +60,7 @@ extern crate polkadot_primitives; extern crate log; use std::collections::{BTreeSet, BTreeMap, HashSet}; +use std::fmt; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -68,12 +69,36 @@ use client::BlockchainEvents; use polkadot_api::PolkadotApi; use polkadot_primitives::{AccountId, BlockId, SessionKey}; use polkadot_primitives::parachain::{self, BlockData, DutyRoster, HeadData, ConsolidatedIngress, Message, Id as ParaId}; -use polkadot_cli::{ServiceComponents, Service, CustomConfiguration, VersionInfo}; +use polkadot_cli::{ServiceComponents, Service, CustomConfiguration}; use polkadot_cli::{Worker, IntoExit}; use tokio::timer::Deadline; +pub use polkadot_cli::VersionInfo; + const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); +/// Error to return when the head data was invalid. +#[derive(Clone, Copy, Debug)] +pub struct InvalidHead; + +/// Collation errors. +#[derive(Debug)] +pub enum Error { + /// Error on the relay-chain side of things. + Polkadot(R), + /// Error on the collator side of things. + Collator(InvalidHead), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::Polkadot(ref err) => write!(f, "Polkadot node error: {}", err), + Error::Collator(_) => write!(f, "Collator node error: Invalid head data"), + } + } +} + /// Parachain context needed for collation. /// /// This can be implemented through an externally attached service or a stub. @@ -84,7 +109,7 @@ pub trait ParachainContext: Clone { &self, last_head: HeadData, ingress: I, - ) -> (BlockData, HeadData); + ) -> Result<(BlockData, HeadData), InvalidHead>; } /// Relay chain context needed to collate. @@ -154,18 +179,18 @@ pub fn collate<'a, R, P>( para_context: P, key: Arc, ) - -> impl Future + 'a + -> impl Future> + 'a where R: RelayChainContext + 'a, R::Error: 'a, R::FutureEgress: 'a, P: ParachainContext + 'a, { - collate_ingress(relay_context).map(move |ingress| { + collate_ingress(relay_context).map_err(Error::Polkadot).and_then(move |ingress| { let (block_data, head_data) = para_context.produce_candidate( last_head, ingress.0.iter().flat_map(|&(id, ref msgs)| msgs.iter().cloned().map(move |msg| (id, msg))) - ); + ).map_err(Error::Collator)?; let block_data_hash = block_data.hash(); let signature = key.sign(&block_data_hash.0[..]).into(); @@ -181,10 +206,10 @@ pub fn collate<'a, R, P>( block_data_hash, }; - parachain::Collation { + Ok(parachain::Collation { receipt, block_data, - } + }) }) } @@ -248,7 +273,7 @@ impl Worker for CollationNode where ($e:expr) => { match $e { Ok(x) => x, - Err(e) => return future::Either::A(future::err(e)), + Err(e) => return future::Either::A(future::err(Error::Polkadot(e))), } } } @@ -323,17 +348,19 @@ fn compute_targets(para_id: ParaId, session_keys: &[SessionKey], roster: DutyRos /// /// Provide a future which resolves when the node should exit. /// This function blocks until done. -pub fn run_collator( +pub fn run_collator( parachain_context: P, para_id: ParaId, exit: E, key: Arc, - args: Vec<::std::ffi::OsString>, + args: I, version: VersionInfo, ) -> polkadot_cli::error::Result<()> where P: ParachainContext + Send + 'static, E: IntoFuture, E::Future: Send + Clone + 'static, + I: IntoIterator, + ArgT: Into + Clone, { let node_logic = CollationNode { parachain_context, exit: exit.into_future(), para_id, key }; polkadot_cli::run(args, node_logic, version) diff --git a/substrate/polkadot/consensus/src/lib.rs b/substrate/polkadot/consensus/src/lib.rs index 4aee785def..616f821b5b 100644 --- a/substrate/polkadot/consensus/src/lib.rs +++ b/substrate/polkadot/consensus/src/lib.rs @@ -273,8 +273,13 @@ impl bft::Environment for ProposerFactory sign_with.public().into(), )?; + info!("Starting consensus session on top of parent {:?}. Local parachain duty is {:?}", + parent_hash, local_duty.validation); + let active_parachains = self.client.active_parachains(&id)?; + debug!(target: "consensus", "Active parachains: {:?}", active_parachains); + let n_parachains = active_parachains.len(); let table = Arc::new(SharedTable::new(group_info, sign_with.clone(), parent_hash)); let (router, input, output) = self.network.communication_for( diff --git a/substrate/polkadot/consensus/src/shared_table/mod.rs b/substrate/polkadot/consensus/src/shared_table/mod.rs index 21919dd4a4..825c624282 100644 --- a/substrate/polkadot/consensus/src/shared_table/mod.rs +++ b/substrate/polkadot/consensus/src/shared_table/mod.rs @@ -143,6 +143,7 @@ impl SharedTableInner { fetch_block_data, fetch_extrinsic, evaluate: checking_validity, + ensure_available: checking_availability, }) } } @@ -206,6 +207,7 @@ struct Work { fetch_block_data: future::Fuse, fetch_extrinsic: Option>, evaluate: bool, + ensure_available: bool, } /// Primed statement producer. @@ -235,31 +237,35 @@ impl Future for PrimedStatementProducer }); let hash = work.candidate_receipt.hash(); + + debug!(target: "consensus", "Making validity statement about candidate {}: is_good? {:?}", hash, is_good); self.inner.produced_statements.validity = match is_good { Some(true) => Some(GenericStatement::Valid(hash)), Some(false) => Some(GenericStatement::Invalid(hash)), None => None, }; + + work.evaluate = false; } } - if let Some(ref mut fetch_extrinsic) = work.fetch_extrinsic { - if let Async::Ready(extrinsic) = fetch_extrinsic.poll()? { + if let Async::Ready(Some(extrinsic)) = work.fetch_extrinsic.poll()? { + if work.ensure_available { + let hash = work.candidate_receipt.hash(); + debug!(target: "consensus", "Claiming candidate {} available.", hash); + + // TODO: actually wait for block data and then ensure availability. self.inner.produced_statements.extrinsic = Some(extrinsic); + self.inner.produced_statements.availability = + Some(GenericStatement::Available(hash)); + + work.ensure_available = false; } } - let done = self.inner.produced_statements.block_data.is_some() && { - if work.evaluate { - true - } else if self.inner.produced_statements.extrinsic.is_some() { - self.inner.produced_statements.availability = - Some(GenericStatement::Available(work.candidate_receipt.hash())); - - true - } else { - false - } + let done = match (work.evaluate, work.ensure_available) { + (false, false) => true, + _ => false, }; if done { @@ -356,10 +362,25 @@ impl SharedTable { } /// Sign and import a local statement. - pub fn sign_and_import(&self, statement: table::Statement) -> SignedStatement { - let proposed_digest = match statement { - GenericStatement::Candidate(ref c) => Some(c.hash()), - _ => None, + /// + /// For candidate statements, this may also produce a second signed statement + /// concerning the availability of the candidate data. + pub fn sign_and_import(&self, statement: table::Statement) + -> (SignedStatement, Option) + { + let (proposed_digest, availability) = match statement { + GenericStatement::Candidate(ref c) => { + let mut availability = None; + let hash = c.hash(); + + // TODO: actually store the data in an availability store of some kind. + if self.context.is_availability_guarantor_of(&self.context.local_id(), &c.parachain_index) { + availability = Some(self.context.sign_statement(GenericStatement::Available(hash))); + } + + (Some(hash), availability) + } + _ => (None, None), }; let signed_statement = self.context.sign_statement(statement); @@ -370,7 +391,13 @@ impl SharedTable { } inner.table.import_statement(&*self.context, signed_statement.clone()); - signed_statement + + // ensure the availability statement is imported after the candidate. + if let Some(a) = availability.clone() { + inner.table.import_statement(&*self.context, a); + } + + (signed_statement, availability) } /// Execute a closure using a specific candidate. @@ -543,5 +570,6 @@ mod tests { assert!(producer.work.fetch_extrinsic.is_some(), "should fetch extrinsic when guaranteeing availability"); assert!(!producer.work.evaluate, "should not evaluate validity"); + assert!(producer.work.ensure_available); } } diff --git a/substrate/polkadot/network/src/consensus.rs b/substrate/polkadot/network/src/consensus.rs index 4f29899100..e3a1c592e7 100644 --- a/substrate/polkadot/network/src/consensus.rs +++ b/substrate/polkadot/network/src/consensus.rs @@ -176,6 +176,7 @@ impl MessageProcessTask

{ } } ConsensusMessage::ChainSpecific(msg, _) => { + debug!(target: "consensus", "Processing consensus statement for live consensus"); if let Some(Message::Statement(parent_hash, statement)) = Decode::decode(&mut msg.as_slice()) { if ::polkadot_consensus::check_statement(&statement.statement, &statement.signature, statement.sender, &parent_hash) { self.table_router.import_statement(statement); diff --git a/substrate/polkadot/network/src/lib.rs b/substrate/polkadot/network/src/lib.rs index 8fbc6dba3a..dfbaa2ea17 100644 --- a/substrate/polkadot/network/src/lib.rs +++ b/substrate/polkadot/network/src/lib.rs @@ -111,10 +111,36 @@ struct BlockDataRequest { sender: oneshot::Sender, } +// ensures collator-protocol messages are sent in correct order. +// session key must be sent before collator role. +enum CollatorState { + Fresh, + RolePending(Role), + Primed, +} + +impl CollatorState { + fn send_key(&mut self, key: SessionKey, mut f: F) { + f(Message::SessionKey(key)); + if let CollatorState::RolePending(role) = ::std::mem::replace(self, CollatorState::Primed) { + f(Message::CollatorRole(role)); + } + } + + fn set_role(&mut self, role: Role, mut f: F) { + if let CollatorState::Primed = *self { + f(Message::CollatorRole(role)); + } else { + *self = CollatorState::RolePending(role); + } + } +} + struct PeerInfo { collating_for: Option<(AccountId, ParaId)>, validator_key: Option, claimed_validator: bool, + collator_state: CollatorState, } #[derive(Default)] @@ -281,8 +307,8 @@ impl PolkadotProtocol { } } - /// Send a statement to a validator. - fn send_statement(&mut self, ctx: &mut Context, _val: SessionKey, parent_hash: Hash, statement: SignedStatement) { + /// Gossip a consensus statement. + fn gossip_statement(&mut self, ctx: &mut Context, parent_hash: Hash, statement: SignedStatement) { // TODO: something more targeted than gossip. let raw = Message::Statement(parent_hash, statement).encode(); self.consensus_gossip.multicast_chain_specific(ctx, raw, parent_hash); @@ -309,14 +335,14 @@ impl PolkadotProtocol { let old_data = self.live_consensus.as_ref().map(|c| (c.parent_hash, c.local_session_key)); if Some(&consensus.local_session_key) != old_data.as_ref().map(|&(_, ref key)| key) { - for (id, _) in self.peers.iter() + for (id, peer_data) in self.peers.iter_mut() .filter(|&(_, ref info)| info.claimed_validator || info.collating_for.is_some()) { - send_polkadot_message( + peer_data.collator_state.send_key(consensus.local_session_key, |msg| send_polkadot_message( ctx, *id, - Message::SessionKey(consensus.local_session_key) - ); + msg + )); } } @@ -452,12 +478,15 @@ impl PolkadotProtocol { } }; + debug!(target: "p_net", "New collator role {:?} from {}", role, who); + match info.validator_key { None => ctx.report_peer( who, Severity::Bad("Sent collator role without registering first as validator"), ), Some(key) => for (relay_parent, collation) in self.local_collations.note_validator_role(key, role) { + debug!(target: "p_net", "Broadcasting collation on relay parent {:?}", relay_parent); send_polkadot_message( ctx, who, @@ -481,38 +510,41 @@ impl Specialization for PolkadotProtocol { } }; + let validator = status.roles.contains(substrate_network::Roles::AUTHORITY); + let send_key = validator || local_status.collating_for.is_some(); + + let mut peer_info = PeerInfo { + collating_for: local_status.collating_for, + validator_key: None, + claimed_validator: validator, + collator_state: CollatorState::Fresh, + }; + if let Some((ref acc_id, ref para_id)) = local_status.collating_for { - if self.collator_peer_id(acc_id.clone()).is_some() { + if self.collator_peer(acc_id.clone()).is_some() { ctx.report_peer(who, Severity::Useless("Unknown Polkadot-specific reason")); return } let collator_role = self.collators.on_new_collator(acc_id.clone(), para_id.clone()); - send_polkadot_message( + + peer_info.collator_state.set_role(collator_role, |msg| send_polkadot_message( ctx, who, - Message::CollatorRole(collator_role), - ); + msg, + )); } - let validator = status.roles.contains(substrate_network::Roles::AUTHORITY); - let send_key = validator || local_status.collating_for.is_some(); - - self.peers.insert(who, PeerInfo { - collating_for: local_status.collating_for, - validator_key: None, - claimed_validator: validator, - }); - - self.consensus_gossip.new_peer(ctx, who, status.roles); if let (true, &Some(ref consensus)) = (send_key, &self.live_consensus) { - send_polkadot_message( + peer_info.collator_state.send_key(consensus.local_session_key, |msg| send_polkadot_message( ctx, who, - Message::SessionKey(consensus.local_session_key) - ); + msg, + )); } + self.peers.insert(who, peer_info); + self.consensus_gossip.new_peer(ctx, who, status.roles); self.dispatch_pending_requests(ctx); } @@ -520,14 +552,14 @@ impl Specialization for PolkadotProtocol { if let Some(info) = self.peers.remove(&who) { if let Some((acc_id, _)) = info.collating_for { let new_primary = self.collators.on_disconnect(acc_id) - .and_then(|new_primary| self.collator_peer_id(new_primary)); + .and_then(|new_primary| self.collator_peer(new_primary)); - if let Some(new_primary) = new_primary { - send_polkadot_message( + if let Some((new_primary, primary_info)) = new_primary { + primary_info.collator_state.set_role(Role::Primary, |msg| send_polkadot_message( ctx, new_primary, - Message::CollatorRole(Role::Primary), - ) + msg, + )); } } @@ -592,12 +624,12 @@ impl Specialization for PolkadotProtocol { for collator_action in self.collators.maintain_peers() { match collator_action { Action::Disconnect(collator) => self.disconnect_bad_collator(ctx, collator), - Action::NewRole(account_id, role) => if let Some(collator) = self.collator_peer_id(account_id) { - send_polkadot_message( + Action::NewRole(account_id, role) => if let Some((collator, info)) = self.collator_peer(account_id) { + info.collator_state.set_role(role, |msg| send_polkadot_message( ctx, collator, - Message::CollatorRole(role), - ) + msg, + )) }, } } @@ -622,6 +654,7 @@ impl PolkadotProtocol { Some((ref acc_id, ref para_id)) => { let structurally_valid = para_id == &collation_para && acc_id == &collated_acc; if structurally_valid && collation.receipt.check_signature().is_ok() { + debug!(target: "p_net", "Received collation for parachain {:?} from peer {}", para_id, from); self.collators.on_collation(acc_id.clone(), relay_parent, collation) } else { ctx.report_peer(from, Severity::Bad("Sent malformed collation")) @@ -633,27 +666,28 @@ impl PolkadotProtocol { fn await_collation(&mut self, relay_parent: Hash, para_id: ParaId) -> oneshot::Receiver { let (tx, rx) = oneshot::channel(); + debug!(target: "p_net", "Attempting to get collation for parachain {:?} on relay parent {:?}", para_id, relay_parent); self.collators.await_collation(relay_parent, para_id, tx); rx } // get connected peer with given account ID for collation. - fn collator_peer_id(&self, account_id: AccountId) -> Option { + fn collator_peer(&mut self, account_id: AccountId) -> Option<(NodeIndex, &mut PeerInfo)> { let check_info = |info: &PeerInfo| info .collating_for .as_ref() .map_or(false, |&(ref acc_id, _)| acc_id == &account_id); self.peers - .iter() - .filter(|&(_, info)| check_info(info)) - .map(|(who, _)| *who) + .iter_mut() + .filter(|&(_, ref info)| check_info(&**info)) + .map(|(who, info)| (*who, info)) .next() } // disconnect a collator by account-id. - fn disconnect_bad_collator(&self, ctx: &mut Context, account_id: AccountId) { - if let Some(who) = self.collator_peer_id(account_id) { + fn disconnect_bad_collator(&mut self, ctx: &mut Context, account_id: AccountId) { + if let Some((who, _)) = self.collator_peer(account_id) { ctx.report_peer(who, Severity::Bad("Consensus layer determined the given collator misbehaved")) } } @@ -668,13 +702,19 @@ impl PolkadotProtocol { targets: HashSet, collation: Collation, ) { + debug!(target: "p_net", "Importing local collation on relay parent {:?} and parachain {:?}", + relay_parent, collation.receipt.parachain_index); + for (primary, cloned_collation) in self.local_collations.add_collation(relay_parent, targets, collation.clone()) { match self.validators.get(&primary) { - Some(who) => send_polkadot_message( - ctx, - *who, - Message::Collation(relay_parent, cloned_collation), - ), + Some(who) => { + debug!(target: "p_net", "Sending local collation to {:?}", primary); + send_polkadot_message( + ctx, + *who, + Message::Collation(relay_parent, cloned_collation), + ) + }, None => warn!(target: "polkadot_network", "Encountered tracked but disconnected validator {:?}", primary), } diff --git a/substrate/polkadot/network/src/router.rs b/substrate/polkadot/network/src/router.rs index ff90502a31..8d6bc18540 100644 --- a/substrate/polkadot/network/src/router.rs +++ b/substrate/polkadot/network/src/router.rs @@ -25,7 +25,7 @@ use polkadot_api::{PolkadotApi, LocalPolkadotApi}; use polkadot_consensus::{SharedTable, TableRouter, SignedStatement, GenericStatement, StatementProducer}; use polkadot_primitives::{Hash, BlockId, SessionKey}; -use polkadot_primitives::parachain::{BlockData, Extrinsic, CandidateReceipt, Id as ParaId}; +use polkadot_primitives::parachain::{BlockData, Extrinsic, CandidateReceipt}; use futures::prelude::*; use tokio::runtime::TaskExecutor; @@ -89,14 +89,16 @@ impl Clone for Router

{ impl Router

{ /// Import a statement whose signature has been checked already. pub(crate) fn import_statement(&self, statement: SignedStatement) { + trace!(target: "p_net", "importing consensus statement {:?}", statement.statement); + // defer any statements for which we haven't imported the candidate yet - let (c_hash, parachain_index) = { + let c_hash = { let candidate_data = match statement.statement { - GenericStatement::Candidate(ref c) => Some((c.hash(), c.parachain_index)), + GenericStatement::Candidate(ref c) => Some(c.hash()), GenericStatement::Valid(ref hash) | GenericStatement::Invalid(ref hash) | GenericStatement::Available(ref hash) - => self.table.with_candidate(hash, |c| c.map(|c| (*hash, c.parachain_index))), + => self.table.with_candidate(hash, |c| c.map(|_| *hash)), }; match candidate_data { Some(x) => x, @@ -115,6 +117,7 @@ impl Router

{ }; // prepend the candidate statement. + debug!(target: "consensus", "Importing statements about candidate {:?}", c_hash); statements.insert(0, statement); let producers: Vec<_> = self.table.import_remote_statements( self, @@ -122,17 +125,16 @@ impl Router

{ ); // dispatch future work as necessary. for (producer, statement) in producers.into_iter().zip(statements) { - let producer = match producer { - Some(p) => p, - None => continue, // statement redundant - }; - self.knowledge.lock().note_statement(statement.sender, &statement.statement); - self.dispatch_work(c_hash, producer, parachain_index); + + if let Some(producer) = producer { + trace!(target: "consensus", "driving statement work to completion"); + self.dispatch_work(c_hash, producer); + } } } - fn dispatch_work(&self, candidate_hash: Hash, producer: StatementProducer, parachain: ParaId) where + fn dispatch_work(&self, candidate_hash: Hash, producer: StatementProducer) where D: Future + Send + 'static, E: Future + Send + 'static, { @@ -160,13 +162,13 @@ impl Router

{ // propagate the statements if let Some(validity) = produced.validity { - let signed = table.sign_and_import(validity.clone()); - route_statement(&*network, &*table, parachain, parent_hash, signed); + let signed = table.sign_and_import(validity.clone()).0; + network.with_spec(|spec, ctx| spec.gossip_statement(ctx, parent_hash, signed)); } if let Some(availability) = produced.availability { - let signed = table.sign_and_import(availability); - route_statement(&*network, &*table, parachain, parent_hash, signed); + let signed = table.sign_and_import(availability).0; + network.with_spec(|spec, ctx| spec.gossip_statement(ctx, parent_hash, signed)); } }); @@ -182,11 +184,15 @@ impl TableRouter for Router

{ fn local_candidate(&self, receipt: CandidateReceipt, block_data: BlockData, extrinsic: Extrinsic) { // give to network to make available. let hash = receipt.hash(); - let para_id = receipt.parachain_index; - let signed = self.table.sign_and_import(GenericStatement::Candidate(receipt)); + let (candidate, availability) = self.table.sign_and_import(GenericStatement::Candidate(receipt)); self.knowledge.lock().note_candidate(hash, Some(block_data), Some(extrinsic)); - route_statement(&*self.network, &*self.table, para_id, self.parent_hash, signed); + self.network.with_spec(|spec, ctx| { + spec.gossip_statement(ctx, self.parent_hash, candidate); + if let Some(availability) = availability { + spec.gossip_statement(ctx, self.parent_hash, availability); + } + }); } fn fetch_block_data(&self, candidate: &CandidateReceipt) -> BlockDataReceiver { @@ -217,32 +223,6 @@ impl Future for BlockDataReceiver { } } -// get statement to relevant validators. -fn route_statement(network: &NetworkService, table: &SharedTable, para_id: ParaId, parent_hash: Hash, statement: SignedStatement) { - let broadcast = |i: &mut Iterator| { - let local_key = table.session_key(); - network.with_spec(|spec, ctx| { - for val in i.filter(|&x| x != &local_key) { - spec.send_statement(ctx, *val, parent_hash, statement.clone()); - } - }); - }; - - let g_info = table - .group_info() - .get(¶_id) - .expect("statements only produced about groups which exist"); - - match statement.statement { - GenericStatement::Candidate(_) => - broadcast(&mut g_info.validity_guarantors.iter().chain(g_info.availability_guarantors.iter())), - GenericStatement::Valid(_) | GenericStatement::Invalid(_) => - broadcast(&mut g_info.validity_guarantors.iter()), - GenericStatement::Available(_) => - broadcast(&mut g_info.availability_guarantors.iter()), - } -} - // A unique trace for valid statements issued by a validator. #[derive(Hash, PartialEq, Eq, Clone, Debug)] enum StatementTrace { diff --git a/substrate/polkadot/parachain/test-chains/basic_add/Cargo.toml b/substrate/polkadot/parachain/test-chains/basic_add/Cargo.toml deleted file mode 100644 index f799cf6b6b..0000000000 --- a/substrate/polkadot/parachain/test-chains/basic_add/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "basic_add" -version = "0.1.0" -authors = ["Parity Technologies "] -description = "Test parachain which adds to a number as its state transition" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -polkadot-parachain = { path = "../../", default-features = false } -wee_alloc = "0.4.1" -tiny-keccak = "1.4" -pwasm-libc = "0.2" - -[features] -default = ["std"] -std = ["polkadot-parachain/std"] - -[profile.release] -panic = "abort" -lto = true - -[workspace] -members = [] diff --git a/substrate/polkadot/parachain/test-chains/basic_add/build.sh b/substrate/polkadot/parachain/test-chains/basic_add/build.sh deleted file mode 100755 index f25f775d43..0000000000 --- a/substrate/polkadot/parachain/test-chains/basic_add/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Make LLD produce a binary that imports memory from the outside environment. -export RUSTFLAGS="-C link-arg=--import-memory" - -cargo +nightly build --target=wasm32-unknown-unknown --release --no-default-features - -for i in basic_add -do - wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm -done diff --git a/substrate/polkadot/parachain/test-chains/basic_add/src/lib.rs b/substrate/polkadot/parachain/test-chains/basic_add/src/lib.rs deleted file mode 100644 index ff9006c8c2..0000000000 --- a/substrate/polkadot/parachain/test-chains/basic_add/src/lib.rs +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Basic parachain that adds a number as part of its state. - -#![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr( - not(feature = "std"), - feature( - alloc, core_intrinsics, lang_items, panic_implementation, core_panic_info, - alloc_error_handler - ) -)] - -#[cfg(not(feature = "std"))] -extern crate alloc; - -extern crate polkadot_parachain as parachain; -extern crate wee_alloc; -extern crate tiny_keccak; -extern crate pwasm_libc; - -use parachain::codec::{Decode, Encode, Input, Output}; - -#[cfg(not(feature = "std"))] -mod wasm; - -#[cfg(not(feature = "std"))] -pub use wasm::*; - -// Define global allocator. -#[cfg(not(feature = "std"))] -#[global_allocator] -static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; - -// Head data for this parachain. -#[derive(Default, Clone)] -struct HeadData { - // Block number - number: u64, - // parent block keccak256 - parent_hash: [u8; 32], - // hash of post-execution state. - post_state: [u8; 32], -} - -impl Encode for HeadData { - fn encode_to(&self, dest: &mut T) { - dest.push(&self.number); - dest.push(&self.parent_hash); - dest.push(&self.post_state); - } -} - -impl Decode for HeadData { - fn decode(input: &mut I) -> Option { - Some(HeadData { - number: Decode::decode(input)?, - parent_hash: Decode::decode(input)?, - post_state: Decode::decode(input)?, - }) - } -} - -// Block data for this parachain. -#[derive(Default, Clone)] -struct BlockData { - // State to begin from. - state: u64, - // Amount to add (overflowing) - add: u64, -} - -impl Encode for BlockData { - fn encode_to(&self, dest: &mut T) { - dest.push(&self.state); - dest.push(&self.add); - } -} - -impl Decode for BlockData { - fn decode(input: &mut I) -> Option { - Some(BlockData { - state: Decode::decode(input)?, - add: Decode::decode(input)?, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use parachain::ValidationParams; - - const TEST_CODE: &[u8] = include_bytes!("../wasm/test.wasm"); - - fn hash_state(state: u64) -> [u8; 32] { - ::tiny_keccak::keccak256(state.encode().as_slice()) - } - - fn hash_head(head: &HeadData) -> [u8; 32] { - ::tiny_keccak::keccak256(head.encode().as_slice()) - } - - #[test] - fn execute_good_on_parent() { - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(0), - }; - - let block_data = BlockData { - state: 0, - add: 512, - }; - - let ret = parachain::wasm::validate_candidate(TEST_CODE, ValidationParams { - parent_head: parent_head.encode(), - block_data: block_data.encode(), - }).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data[..]).unwrap(); - - assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, hash_head(&parent_head)); - assert_eq!(new_head.post_state, hash_state(512)); - } -} diff --git a/substrate/polkadot/parachain/tests/basic_add.rs b/substrate/polkadot/parachain/tests/adder.rs similarity index 98% rename from substrate/polkadot/parachain/tests/basic_add.rs rename to substrate/polkadot/parachain/tests/adder.rs index 566a6efc3f..d93b2d46a3 100644 --- a/substrate/polkadot/parachain/tests/basic_add.rs +++ b/substrate/polkadot/parachain/tests/adder.rs @@ -76,7 +76,7 @@ impl Decode for BlockData { } } -const TEST_CODE: &[u8] = include_bytes!("res/basic_add.wasm"); +const TEST_CODE: &[u8] = include_bytes!("res/adder.wasm"); fn hash_state(state: u64) -> [u8; 32] { ::tiny_keccak::keccak256(state.encode().as_slice()) diff --git a/substrate/polkadot/parachain/tests/res/adder.wasm b/substrate/polkadot/parachain/tests/res/adder.wasm new file mode 100644 index 0000000000000000000000000000000000000000..93f354400f5e85e8be3c700daa76034ea0a023df GIT binary patch literal 29853 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 literal 0 HcmV?d00001 diff --git a/substrate/polkadot/parachain/tests/res/basic_add.wasm b/substrate/polkadot/parachain/tests/res/basic_add.wasm deleted file mode 100755 index c32910f0adf97f30e8742c098fbd7fc7068939d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11348 zcmeHNO>7)TcCPB~`Qh{oXDE>pB}%L67A=yNM9mE6myiwhY`hjBJG;p$aS$Y+=cmWy z@K@wWva+(sBz%saR48D+~Xd72!cg`AigEvd(}N0 z%JRa8h@u_y1nKS2Loyza@nbvOM;td2nzb-ZTylpb zeK+O_h0z&Ts+f|u(0bx#MiLMPWW9pD0-zjBdom|o;}z^RXtlENk3G55XO*d96$9^{ z+4GEh-a*f`y#JB6G6sf>zV}fY1FzuC^q!L_9%1S zz&epO?Fengu!XR(2-Faak)7U0w)ZRS121~tleDeC7XYv%lthoV=6bUtYv)X1|E(#l zP-ey~q~l2l!2#b&FvsA-HNlA^FeE+e7K!1AEpd!3pbFUn>6$G91PK|$ml5)1yC$F* z{7$pEj3*pZ8Q4MN^M>W}Te>2WSY{HBUk2hpBo?hE`2ZI2q|B_1ZX_Aw2ze+P+qE(R z*dSQ%;T@onp4s;f4`t7dL6zppjQ2N(7GAvEy&D3YAAD!HKG%0ml8H%5#-4|FpyEA3 z4qcGaL!zP8XNZoFJC;pm#w0&UM>JbZGm|gve=($Sz=j6H5fwoKe!J&F=#Y;0=nh86 z9_gR3%o~#v3DOi^E$<<8Ma#e$tdlVbup;lEPy1oim}2{ro^gkalJo>)y`zW|Ha9p6 zt&*=~ERFQx9f(U}yAvZbWIzT>k8uznh~TOa8W96YVxEXMVJs4mli*PUp;4)bGh*A3 zuxm&Y1Xx;>gvWx7f*q4VgrtYB%%^dOF|);J71(xCc<-fi31R9!x$`V!?bW z9UxmU-adj2D z1Cjpe6#93*0dR zkqsIz58R85gW#{#d5kuUfjb*Op00A#7{kwklE%Wob)c_vL1S*_z?0`dYGY>Lz8F9@S@766F>t2>a6#4tOpZN=de;^4V*LT zl3GwNGAQ=~toXb}OFBFc`*qYsHLGXO!Hi#2ml*0CGz@FLqNe!uYT#aiRnIDiUtb8^ zS(x*pno?KwUI*s9pyt%Pew~B;zMx!Qd@*ocSnQ&@%&%7h_aaR8EP}avHiP3ts54a% zExh@jn%2F~L{DAR-7nBRrMn-F;=E^_hWQtb$7a_Qo8pPOUHEgb9681?t54|qr0l7&gEGCZiT6p00P0Avrwj9myP zG4J2xcQc5q%Aj;42G_ARZe=V))EI?Rq%l2&x){(T9UB{LWh1Do6dwD_=-3{h*(ya% zO2sJ&h(rH2Kw&4HsH&HU> zT-iN0#n^$s?nP82m=4!|l~FU7pFjf%eGY$tE|2|EayB+^JT+b0`&VROd@lXM1nH(n z%K$#)5NFpXCbO6#rflyM2#SP%Y?*f`c?}PPPt*Gaa-#&;ba1LWDNi|ZtrYWyr&MZ# z^ruoJ8St`_p~Mo60s13Fgcz7oLI$XDMG#$k18RV*Ap%dmPC`VRi=&OH_(~=T@e`0S zXj21;6A%H5!}~M^kt#HXRG8j#NAK`E$}XdMWrjTyR?9gdkj5AfNr5|1mqr{8cpuwz z%!UoP3D*rf@eo2hnn{G6n8=+Fwtnsj;|AqINQ#k-o5L)Ok}D(1!jRPIEG*Z@l7sKe zgb5g2htn-AJ(h>T(hP22XP|dYA=8VIB`%W zHz*kZdGI9*B6P;shmz1I>@_xTB%vBfi3rAVij3xFG;Lv;k}dX1=$^GoBk7Dx8^WV%GnmoqBKX&z-%RAHbT;$#i>0vo1qgd|XNO$Lbp!XF|;-DGX3B!Uo`q!R4^ z6DZM)eh&Z;U6LCrfwb~pD`r5Aa#q{LT}t|>T$crXzn zb<-rx6a|j778asKC@e}j0iOBc>^26LAUzEQV!{HT48_J-HBUh%$Y!+|knI{oAr&&f z#3btddUFhHfmj4T?;W1i+aNvgLuD3d=G>P!N%m|E{i87~wk#AYIw5w6Gn6>m92Go* z>QiIWHN3+dUJr9zje=IxP*h2LVdrd}-vf78{ve(2JMpxHMj#$~bK~9zhZ1oD&s$+t zlhFQTa8(1)sAzPZ05%iHJju`%4Rg;Ql7L#VJ z%(yX%g;bT}Ac_-woS!O&qK=Ixa(kdN5m~t$!{&q6=xn5#9`^w#?{OmGEF(9?sZ5pt zg2*a$p_wJ#5_EZmD%wC9?meC!A1_ed&u?N``ksv3! zGLYew0qK#i3{Z?wxvZ}Y;FsEBFak`+N^8u8^(8ql!WPx}5VNJl%%`Lvf5gBMFIb7H zPG2SrVUAoTJX5ja<{&3*ga}LEq2oDs`SJPmm~kK<(FZp>j}iywBfeqyOm4Vz#Xw=j z_y}a82sEBh3&wEvO+<=;T!0XICD%3<3=7d`xJX$aITs(j%2bw5NlX4q2#CP&Ov;DmI|13%J-pUPi!hO8{Z= z{*-s&b=V4%jsq9r&!8qv=P5EiJ)Y~i8FbN%9~(#JoW(erTr|$aR8c@GI2i`r2?8^& zGSug+IH$7I=VaONkipXaNu50Fci@@Q8MJ-}J*O1If%vF6C7^5IM2~q$ZHea7>QqDp z4*|?6HFazVn5NWZG(^DGs^(2VNaZF%ID|Qi?Hw)-%Z0sX*xt{=NiytAbVC7eBL5iKglrg*YQv4T@lB@i5*!}+ zR%7U#UXr6DUk)0m_)skuMt(%VsN6dW5VhK8{*B!!|E**0BIRSeQA88e>HJ)Yz*e5J~? zP*o-PWQqdc@eRjgAFZaFR4wBS67e(0yftJLOF3i$M?%5H$U_b)VRZW%LTMb}1eti~ zPN)fG-JThdQ0BQ3$~+^XPvzGa5jm|E5rjqcp_UDv6b+6fwDzokjx9efAFS2lAtA%f zNcP&}7DQ<1Gy{jEXh<`tNJeMK7Qz|SCeaKLgqd;7kU>2&18B)`W&|4T0R^dW29;0< z4Gts7Ex`tLpRk7-bfl9BHt-tx!>Hwkb_+Wi(^`R5Bh2VcL>0_XMP?o@#tlDgj3T5U zE5%vMVSryyj!{6@GpN-#5@5za3ah>nu#0Sm{U;lOzBvTVu`>dl90kpxi9u%x^r$5z zJS6drNOFWb*<*%5$_iXQM?j#aY0K^>@73piJjh+!bsq;wmxSo1e^bjzGadKb| zB1gdr4k^5!r@Rx4g%UB^jhJ!d{|GtZ*hsX1Z|ZeNu_X!)!uzk3H^cBKA=6QW(lOnm zWNaj|P&mPrNVJ8nIaEgJ`;(#Shx8v89Gw$sdxU(F&tnSdBO=mz#UUMuNS}`^BGO8z zS3>ca{43;(MZ_v45wTwQ_5stON{2h1LsY0oD&Q3AsK;{j9R5v~_O&UZGxalxB1Q4H zL0^lg;SReZ@tyMx#U(7hK*T)^O2Ml_&}F5hTS~e&MMG|kdp(11426B=dE02u^A`Ue zzEU~69_vP6{E)h-a6R_(`;TZ4V}nE8nqg~% zt!~6&D(r;&42`s+K}s@q)O^gGL{v)^Cb^tb01)b*Ft{$5+Z zT>B%e+rRc!^WL?^c60BooojpeQh&d{_uv}VTzhN1zjn8^*xuQ?TJYQLO0iz=wCaAl zR$RK)U*CRkbpxZ#jjM&l(qfT!Y_7K!_x4w|`4<3ceS7zAU*VSk_&q?Yxw*O1zP8uA zzk1JaV^O=g+ib7*AE=#s{$6);2R|dwyLOv<{&ruj`OS{%?(A(f`-{<33m`TaU^FA} zhf7ZT?WdLy^LY6j?Hg!+h))b3QYD7?W1uy|exzb*XMz}lW6|~ zz-XUBQ#x_Qv}5Tc+{TwD_ltwcXtEtFcmA9|o_x;sy{~NyV zQ6#-Sx8HB}*V`|v=Duq0>|tlP;?>O^1Y2GNxZ&VhyHF^$YJQ=aFSa_JX509)>zC$Q z>ba1cUj`b1>-ZtSAN-)bxwC(F&wu9~(A=!&YxSC6suxS;a;MfZOX0F1yHU7bjlw;4 zRqFM&pKlh5^?aw^>~yR-I#pKnsj|GR+b$O7+m-54t5D0AJFRlT&&L*?v#?mMkn}3` zLcZErYAw~;&2pz0FKOZIZ?3l?BW_mli#7l4Rh);bbUqUOZ2{g4-#DdxDfehJT|s$a<$#{T@b!n1|n>M@@E^}ir1>oi-n zLa|%%yRCfD?^IH|zZLlXwVk`0oz*QL?5{REy=EI{xaNnj?i0pht5qwv>eY6=3c2O& zTdRNi`}Lu43S~B#)$aNpeq7jH?-#0Tt!AarF1OmQc8|gZ;Of#a8A}jxtLUS#57p z(gZrckGF5r%W+*@QFASJiy^_w%g0yzMs2p5Ex%b^>J*n+wRX3&G=BegM8UIqM&j1Z zw@byUpKoLrU-xcp)!vv}Yzfi8#3hh=Q53A1S{!YRMO7+#**KW_U`WF|Y3~^Bh zNSe7l`|a7;yT$yhH~Z@CS^5+Tyc)kTg`SJG)!Dn%7M9=lzD;m1prYNb}oS8Ih@rBax9BMQ{WQkR!0Lf@^i-uLgekQfuj_D+Z9 zD3ml?n=r8NhdsD6W-tqzE0+rOO1D<)R!V-mS}C2l`uvEp+T9{=Z&&iADlEF3ujTWd zPWdFVZi?wUyOhQ+FZ*xr`fa#{PUjIFY87&(YHevLU+H$+lVAQ#?$q!nxu=G|$URLz T`)%(&n5K5$@1NoKt=<0xZl!fm diff --git a/substrate/polkadot/runtime/src/parachains.rs b/substrate/polkadot/runtime/src/parachains.rs index 4ac5f3f2a1..5629f440b5 100644 --- a/substrate/polkadot/runtime/src/parachains.rs +++ b/substrate/polkadot/runtime/src/parachains.rs @@ -194,8 +194,8 @@ impl Executable for Module { #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct GenesisConfig { - /// The initial parachains, mapped to code. - pub parachains: Vec<(Id, Vec)>, + /// The initial parachains, mapped to code and initial head data + pub parachains: Vec<(Id, Vec, Vec)>, /// Phantom data. #[serde(skip)] pub phantom: PhantomData, @@ -218,18 +218,21 @@ impl runtime_primitives::BuildStorage for GenesisConfig use std::collections::HashMap; use codec::Encode; - self.parachains.sort_unstable_by_key(|&(ref id, _)| id.clone()); - self.parachains.dedup_by_key(|&mut (ref id, _)| id.clone()); + self.parachains.sort_unstable_by_key(|&(ref id, _, _)| id.clone()); + self.parachains.dedup_by_key(|&mut (ref id, _, _)| id.clone()); - let only_ids: Vec<_> = self.parachains.iter().map(|&(ref id, _)| id).cloned().collect(); + let only_ids: Vec<_> = self.parachains.iter().map(|&(ref id, _, _)| id).cloned().collect(); let mut map: HashMap<_, _> = map![ Self::hash(>::key()).to_vec() => only_ids.encode() ]; - for (id, code) in self.parachains { - let key = Self::hash(&>::key_for(&id)).to_vec(); - map.insert(key, code.encode()); + for (id, code, genesis) in self.parachains { + let code_key = Self::hash(&>::key_for(&id)).to_vec(); + let head_key = Self::hash(&>::key_for(&id)).to_vec(); + + map.insert(code_key, code.encode()); + map.insert(head_key, genesis.encode()); } Ok(map.into()) @@ -280,7 +283,7 @@ mod tests { type Parachains = Module; - fn new_test_ext(parachains: Vec<(Id, Vec)>) -> runtime_io::TestExternalities { + fn new_test_ext(parachains: Vec<(Id, Vec, Vec)>) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap(); t.extend(consensus::GenesisConfig::{ code: vec![], @@ -301,8 +304,8 @@ mod tests { #[test] fn active_parachains_should_work() { let parachains = vec![ - (5u32.into(), vec![1,2,3]), - (100u32.into(), vec![4,5,6]), + (5u32.into(), vec![1,2,3], vec![1]), + (100u32.into(), vec![4,5,6], vec![2]), ]; with_externalities(&mut new_test_ext(parachains), || { @@ -315,8 +318,8 @@ mod tests { #[test] fn register_deregister() { let parachains = vec![ - (5u32.into(), vec![1,2,3]), - (100u32.into(), vec![4,5,6]), + (5u32.into(), vec![1,2,3], vec![1]), + (100u32.into(), vec![4,5,6], vec![2,]), ]; with_externalities(&mut new_test_ext(parachains), || { @@ -340,8 +343,8 @@ mod tests { #[test] fn duty_roster_works() { let parachains = vec![ - (0u32.into(), vec![]), - (1u32.into(), vec![]), + (0u32.into(), vec![], vec![]), + (1u32.into(), vec![], vec![]), ]; with_externalities(&mut new_test_ext(parachains), || { diff --git a/substrate/polkadot/runtime/wasm/Cargo.lock b/substrate/polkadot/runtime/wasm/Cargo.lock index b90d8e14e8..a2c3b0413a 100644 --- a/substrate/polkadot/runtime/wasm/Cargo.lock +++ b/substrate/polkadot/runtime/wasm/Cargo.lock @@ -730,7 +730,7 @@ dependencies = [ "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -846,7 +846,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", - "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1107,7 +1107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1231,7 +1231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4a6d379e9332b1b1f52c5a87f2481c85c7c931d8ec411963dfb8f26b1ec1e3" +"checksum wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "522fe3fdd44a56f25cd5ddcd8ccdb1cf2e982ceb28fcb00f41d8a018ae5245a8" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index b04b146ea1c7b828cb50c7497aa5c9a1879473c5..74088d063a466b7525c24f58eeb55360060d15f7 100644 GIT binary patch delta 44410 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 delta 44461 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 diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index fa48cfe95fb570990592018a817366eee413b086..c36c36e1bb808957f24b335d6690f52f2d4fc79f 100755 GIT binary patch delta 44797 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 delta 44592 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 O2u76{b^} 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 diff --git a/substrate/polkadot/service/src/lib.rs b/substrate/polkadot/service/src/lib.rs index 6d2c4aee15..10349d94dd 100644 --- a/substrate/polkadot/service/src/lib.rs +++ b/substrate/polkadot/service/src/lib.rs @@ -212,7 +212,7 @@ pub fn new_full(config: Configuration, executor: TaskExecutor) consensus_net, service.extrinsic_pool(), executor, - ::std::time::Duration::from_millis(4000), // TODO: dynamic + ::std::time::Duration::from_secs(4), // TODO: dynamic key, )) } else { @@ -302,13 +302,13 @@ impl network::TransactionPool for TransactionPoolAdapter match *e.kind() { transaction_pool::ErrorKind::AlreadyImported(hash) => Some(hash[..].into()), _ => { - debug!("Error adding transaction to the pool: {:?}", e); + debug!(target: "txpool", "Error adding transaction to the pool: {:?}", e); None }, } } } else { - debug!("Error decoding transaction"); + debug!(target: "txpool", "Error decoding transaction"); None } } diff --git a/substrate/polkadot/parachain/test-chains/.gitignore b/substrate/polkadot/test-parachains/.gitignore similarity index 100% rename from substrate/polkadot/parachain/test-chains/.gitignore rename to substrate/polkadot/test-parachains/.gitignore diff --git a/substrate/polkadot/test-parachains/README.md b/substrate/polkadot/test-parachains/README.md new file mode 100644 index 0000000000..4661007f76 --- /dev/null +++ b/substrate/polkadot/test-parachains/README.md @@ -0,0 +1,5 @@ +# Test Parachains + +Each parachain consists of three parts: a `#![no_std]` library with the main execution logic, a WASM crate which wraps this logic, and a collator node. + +Run `build.sh` in this directory to build all registered test parachains and copy the generated WASM to the `parachain/tests/res` folder. diff --git a/substrate/polkadot/test-parachains/adder/Cargo.toml b/substrate/polkadot/test-parachains/adder/Cargo.toml new file mode 100644 index 0000000000..1ff06689dd --- /dev/null +++ b/substrate/polkadot/test-parachains/adder/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "adder" +version = "0.1.0" +authors = ["Parity Technologies "] +description = "Test parachain which adds to a number as its state transition" + +[dependencies] +polkadot-parachain = { path = "../../parachain/", default-features = false } +tiny-keccak = "1.4" diff --git a/substrate/polkadot/test-parachains/adder/collator/Cargo.toml b/substrate/polkadot/test-parachains/adder/collator/Cargo.toml new file mode 100644 index 0000000000..97ae48cd25 --- /dev/null +++ b/substrate/polkadot/test-parachains/adder/collator/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "adder-collator" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +adder = { path = ".." } +polkadot-parachain = { path = "../../../parachain" } +polkadot-collator = { path = "../../../collator" } +polkadot-primitives = { path = "../../../primitives" } +ed25519 = { path = "../../../../substrate/ed25519" } +parking_lot = "0.4" +ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } +futures = "0.1" +exit-future = "0.1.2" diff --git a/substrate/polkadot/test-parachains/adder/collator/src/main.rs b/substrate/polkadot/test-parachains/adder/collator/src/main.rs new file mode 100644 index 0000000000..a20e64b230 --- /dev/null +++ b/substrate/polkadot/test-parachains/adder/collator/src/main.rs @@ -0,0 +1,145 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Collator for polkadot + +extern crate adder; +extern crate polkadot_parachain as parachain; +extern crate polkadot_primitives as primitives; +extern crate polkadot_collator as collator; +extern crate ed25519; +extern crate parking_lot; +extern crate ctrlc; +extern crate futures; +extern crate exit_future; + +use std::cell::RefCell; +use std::collections::HashMap; +use std::sync::Arc; + +use adder::{HeadData as AdderHead, BlockData as AdderBody}; +use ed25519::Pair; +use parachain::codec::{Encode, Decode}; +use primitives::parachain::{HeadData, BlockData, Id as ParaId, Message}; +use collator::{InvalidHead, ParachainContext, VersionInfo}; +use parking_lot::Mutex; + +const GENESIS: AdderHead = AdderHead { + number: 0, + parent_hash: [0; 32], + post_state: [1, 27, 77, 3, 221, 140, 1, 241, 4, 145, 67, 207, 156, 76, 129, 126, 75, 22, 127, 29, 27, 131, 229, 198, 240, 241, 13, 137, 186, 30, 123, 206], +}; + +const GENESIS_BODY: AdderBody = AdderBody { + state: 0, + add: 0, +}; + +#[derive(Clone)] +struct AdderContext { + db: Arc>>, +} + +/// The parachain context. +impl ParachainContext for AdderContext { + fn produce_candidate>( + &self, + last_head: HeadData, + _ingress: I, + ) -> Result<(BlockData, HeadData), InvalidHead> + { + let adder_head = AdderHead::decode(&mut &last_head.0[..]) + .ok_or(InvalidHead)?; + + let mut db = self.db.lock(); + + let last_body = if adder_head == GENESIS { + GENESIS_BODY + } else { + db.get(&adder_head) + .expect("All past bodies stored since this is the only collator") + .clone() + }; + + let next_body = AdderBody { + state: last_body.state.overflowing_add(last_body.add).0, + add: adder_head.number % 100, + }; + + let next_head = ::adder::execute(adder_head.hash(), adder_head, &next_body) + .expect("good execution params; qed"); + + let encoded_head = HeadData(next_head.encode()); + let encoded_body = BlockData(next_body.encode()); + + println!("Created collation for #{}, post-state={}", + next_head.number, next_body.state.overflowing_add(next_body.add).0); + + db.insert(next_head.clone(), next_body); + Ok((encoded_body, encoded_head)) + } +} + +fn main() { + let key = Arc::new(Pair::from_seed(&[1; 32])); + let id: ParaId = 100.into(); + + println!("Starting adder collator with genesis: "); + + { + let encoded = GENESIS.encode(); + println!("Dec: {:?}", encoded); + print!("Hex: 0x"); + for byte in encoded { + print!("{:02x}", byte); + } + + println!(); + } + + // can't use signal directly here because CtrlC takes only `Fn`. + let (exit_send, exit) = exit_future::signal(); + + let exit_send_cell = RefCell::new(Some(exit_send)); + ctrlc::CtrlC::set_handler(move || { + if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { + exit_send.fire(); + } + }); + + let context = AdderContext { + db: Arc::new(Mutex::new(HashMap::new())), + }; + + let res = ::collator::run_collator( + context, + id, + exit, + key, + ::std::env::args(), + VersionInfo { + version: "", + commit: "", + executable_name: "adder-collator", + description: "collator for adder parachain", + author: "parity technologies", + } + ); + + if let Err(e) = res { + println!("{}", e); + } +} diff --git a/substrate/polkadot/test-parachains/adder/src/lib.rs b/substrate/polkadot/test-parachains/adder/src/lib.rs new file mode 100644 index 0000000000..aa23dea777 --- /dev/null +++ b/substrate/polkadot/test-parachains/adder/src/lib.rs @@ -0,0 +1,110 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Basic parachain that adds a number as part of its state. + +#![no_std] + +extern crate polkadot_parachain as parachain; +extern crate tiny_keccak; + +use parachain::codec::{Decode, Encode, Input, Output}; + +/// Head data for this parachain. +#[derive(Default, Clone, Hash, Eq, PartialEq)] +pub struct HeadData { + /// Block number + pub number: u64, + /// parent block keccak256 + pub parent_hash: [u8; 32], + /// hash of post-execution state. + pub post_state: [u8; 32], +} + +impl HeadData { + pub fn hash(&self) -> [u8; 32] { + ::tiny_keccak::keccak256(&self.encode()) + } +} + +impl Encode for HeadData { + fn encode_to(&self, dest: &mut T) { + dest.push(&self.number); + dest.push(&self.parent_hash); + dest.push(&self.post_state); + } +} + +impl Decode for HeadData { + fn decode(input: &mut I) -> Option { + Some(HeadData { + number: Decode::decode(input)?, + parent_hash: Decode::decode(input)?, + post_state: Decode::decode(input)?, + }) + } +} + +/// Block data for this parachain. +#[derive(Default, Clone)] +pub struct BlockData { + /// State to begin from. + pub state: u64, + /// Amount to add (overflowing) + pub add: u64, +} + +impl Encode for BlockData { + fn encode_to(&self, dest: &mut T) { + dest.push(&self.state); + dest.push(&self.add); + } +} + +impl Decode for BlockData { + fn decode(input: &mut I) -> Option { + Some(BlockData { + state: Decode::decode(input)?, + add: Decode::decode(input)?, + }) + } +} + +pub fn hash_state(state: u64) -> [u8; 32] { + ::tiny_keccak::keccak256(state.encode().as_slice()) +} + +/// Start state mismatched with parent header's state hash. +#[derive(Debug)] +pub struct StateMismatch; + +/// Execute a block body on top of given parent head, producing new parent head +/// if valid. +pub fn execute(parent_hash: [u8; 32], parent_head: HeadData, block_data: &BlockData) -> Result { + debug_assert_eq!(parent_hash, parent_head.hash()); + + if hash_state(block_data.state) != parent_head.post_state { + return Err(StateMismatch); + } + + let new_state = block_data.state.overflowing_add(block_data.add).0; + + Ok(HeadData { + number: parent_head.number + 1, + parent_hash, + post_state: hash_state(new_state), + }) +} diff --git a/substrate/polkadot/parachain/test-chains/basic_add/src/src b/substrate/polkadot/test-parachains/adder/src/src similarity index 100% rename from substrate/polkadot/parachain/test-chains/basic_add/src/src rename to substrate/polkadot/test-parachains/adder/src/src diff --git a/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml b/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml new file mode 100644 index 0000000000..087b937b64 --- /dev/null +++ b/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "adder-wasm" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +adder = { path = ".." } +polkadot-parachain = { path = "../../../parachain", default-features = false } +wee_alloc = { version = "0.4.1" } +pwasm-libc = { version = "0.2" } +tiny-keccak = "1.4" + +[lib] +crate-type = ["cdylib"] + +[target.release] +panic = "abort" +lto = true + +[workspace] diff --git a/substrate/polkadot/parachain/test-chains/basic_add/src/wasm.rs b/substrate/polkadot/test-parachains/adder/wasm/src/lib.rs similarity index 60% rename from substrate/polkadot/parachain/test-chains/basic_add/src/wasm.rs rename to substrate/polkadot/test-parachains/adder/wasm/src/lib.rs index 1007113188..0e16142647 100644 --- a/substrate/polkadot/parachain/test-chains/basic_add/src/wasm.rs +++ b/substrate/polkadot/test-parachains/adder/wasm/src/lib.rs @@ -14,12 +14,30 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Defines WASM module logic. +//! WASM validation for adder parachain. -use core::{intrinsics, panic, alloc}; -use parachain::{self, ValidationResult}; +#![no_std] + +#![feature( + alloc, core_intrinsics, lang_items, panic_implementation, core_panic_info, + alloc_error_handler +)] + +extern crate alloc; +extern crate wee_alloc; +extern crate pwasm_libc; +extern crate adder; +extern crate polkadot_parachain as parachain; +extern crate tiny_keccak; + +// Define global allocator. +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +use core::{intrinsics, panic}; +use parachain::ValidationResult; use parachain::codec::{Encode, Decode}; -use super::{HeadData, BlockData}; +use adder::{HeadData, BlockData}; #[panic_implementation] #[no_mangle] @@ -31,7 +49,7 @@ pub fn panic(_info: &panic::PanicInfo) -> ! { #[alloc_error_handler] #[no_mangle] -pub fn oom(_: alloc::Layout) -> ! { +pub fn oom(_: ::core::alloc::Layout) -> ! { unsafe { intrinsics::abort(); } @@ -39,8 +57,6 @@ pub fn oom(_: alloc::Layout) -> ! { #[no_mangle] pub extern fn validate(offset: usize, len: usize) -> usize { - let hash_state = |state: u64| ::tiny_keccak::keccak256(state.encode().as_slice()); - let params = unsafe { ::parachain::load_params(offset, len) }; let parent_head = HeadData::decode(&mut ¶ms.parent_head[..]) .expect("invalid parent head format."); @@ -48,14 +64,10 @@ pub extern fn validate(offset: usize, len: usize) -> usize { let block_data = BlockData::decode(&mut ¶ms.block_data[..]) .expect("invalid block data format."); - assert_eq!(hash_state(block_data.state), parent_head.post_state, "wrong post-state proof"); - let new_state = block_data.state.saturating_add(block_data.add); + let parent_hash = ::tiny_keccak::keccak256(¶ms.parent_head[..]); - let new_head = HeadData { - number: parent_head.number + 1, - parent_hash: ::tiny_keccak::keccak256(¶ms.parent_head[..]), - post_state: hash_state(new_state), - }; - - parachain::write_result(ValidationResult { head_data: new_head.encode() }) + match ::adder::execute(parent_hash, parent_head, &block_data) { + Ok(new_head) => parachain::write_result(ValidationResult { head_data: new_head.encode() }), + Err(_) => panic!("execution failure"), + } } diff --git a/substrate/polkadot/test-parachains/build.sh b/substrate/polkadot/test-parachains/build.sh new file mode 100755 index 0000000000..d53869f2d4 --- /dev/null +++ b/substrate/polkadot/test-parachains/build.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e + +# Make LLD produce a binary that imports memory from the outside environment. +export RUSTFLAGS="-C link-arg=--import-memory -C lto=fat -C panic=abort" + +for i in adder +do + cd $i/wasm + cargo +nightly build --target=wasm32-unknown-unknown --release --no-default-features --target-dir target + wasm-gc target/wasm32-unknown-unknown/release/$i'_'wasm.wasm target/wasm32-unknown-unknown/release/$i.wasm + cp target/wasm32-unknown-unknown/release/$i.wasm ../../../parachain/tests/res/ + rm -rf target + cd ../.. +done diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index bd930a1e4cc7abbb9e55e31ad36b3273ea1232eb..a4a5c76018e4af1babe5c0d0eb78dae19dc6a37c 100644 GIT binary patch delta 5306 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 ConsensusGossip where B::Header: HeaderT { /// Handles incoming chain-specific message and repropagates pub fn on_chain_specific(&mut self, protocol: &mut Context, who: NodeIndex, message: Vec, parent_hash: B::Hash) { + debug!(target: "gossip", "received chain-specific gossip message"); if let Some((hash, message)) = self.handle_incoming(protocol, who, ConsensusMessage::ChainSpecific(message, parent_hash)) { + debug!(target: "gossip", "handled incoming chain-specific message"); // propagate to other peers. self.multicast(protocol, message, Some(hash)); } @@ -245,6 +247,7 @@ impl ConsensusGossip where B::Header: HeaderT { peer.known_messages.insert(hash); if let Some((sink, parent_hash)) = self.message_sink.take() { if parent == parent_hash { + debug!(target: "gossip", "Pushing relevant consensus message to sink."); if let Err(e) = sink.unbounded_send(message.clone()) { trace!(target:"gossip", "Error broadcasting message notification: {:?}", e); } diff --git a/substrate/substrate/test-runtime/wasm/Cargo.lock b/substrate/substrate/test-runtime/wasm/Cargo.lock index e78284183a..428dd7a76b 100644 --- a/substrate/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/substrate/test-runtime/wasm/Cargo.lock @@ -678,7 +678,7 @@ dependencies = [ "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -910,7 +910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1034,7 +1034,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4a6d379e9332b1b1f52c5a87f2481c85c7c931d8ec411963dfb8f26b1ec1e3" +"checksum wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "522fe3fdd44a56f25cd5ddcd8ccdb1cf2e982ceb28fcb00f41d8a018ae5245a8" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index d449d647e20ce85a16875b1fef48233682c9a83d..a8308fbcaacfb4554993b55e292fcbaee8f0c38d 100644 GIT binary patch delta 9451 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