From daba53533ca68fb7c8180b0800d31cb885512a8e Mon Sep 17 00:00:00 2001 From: bader y Date: Fri, 13 Dec 2024 09:26:04 -0500 Subject: [PATCH] Tutorials: Update parachain tutorial (#234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updates so far * Add finishing touches * comments * Apply suggestions from code review Co-authored-by: Nicolás Hussein <80422357+nhussein11@users.noreply.github.com> * change to chain-spec-builder * Update tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> * feedback * replace parachain-template-node * fix most instructions * few things --------- Co-authored-by: Nicolás Hussein <80422357+nhussein11@users.noreply.github.com> Co-authored-by: Iulian Barbu <14218860+iulianbarbu@users.noreply.github.com> --- .../acquire-a-testnet-slot-2.html | 7 -- .../deploy-on-paseo-3.html | 8 ++ .../prepare-parachain-3.html | 10 +- .../prepare-parachain-4.html | 19 +++- .../prepare-parachain-5.html | 20 ---- .../acquire-a-testnet-slot-10.webp | Bin 0 -> 17120 bytes .../acquire-a-testnet-slot-9.webp | Bin 0 -> 56782 bytes tutorials/polkadot-sdk/parachains/.pages | 1 + .../parachains/connect-to-relay-chain/.pages | 7 +- .../prepare-parachain.md | 49 ++++----- .../prepare-relay-chain.md | 13 +-- .../parachains/deploy-to-relay-chain/.pages | 4 + .../deploy-on-paseo.md} | 101 +++++++++++------- .../parachains/deploy-to-relay-chain/index.md | 25 +++++ 14 files changed, 146 insertions(+), 118 deletions(-) delete mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html create mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html delete mode 100644 .snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html create mode 100644 images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp create mode 100644 images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-9.webp create mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages rename tutorials/polkadot-sdk/parachains/{connect-to-relay-chain/acquire-a-testnet-slot.md => deploy-to-relay-chain/deploy-on-paseo.md} (59%) create mode 100644 tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html deleted file mode 100644 index 19e9bba40..000000000 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html +++ /dev/null @@ -1,7 +0,0 @@ -
- ./target/release/parachain-template-node build-spec --chain plain-parachain-chainspec.json --disable-default-bootnode --raw > raw-parachain-chainspec.json -
- 2024-09-11 09:48:15 Building chain spec - 2024-09-11 09:48:15 assembling new collators for new session 0 at #0 - 2024-09-11 09:48:15 assembling new collators for new session 1 at #0 -
diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html new file mode 100644 index 000000000..2bf570722 --- /dev/null +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html @@ -0,0 +1,8 @@ +
+ polkadot-omni-node key generate-node-key --base-path /tmp/parachain/pubs-demo --chain raw-parachain-chainspec.json +
+ 2024-09-11 09:48:15 Building chain spec + Generating key in "/tmp/parachain/pubs-demo/chains/live/network/secret_ed25519" + 12D3KooWJH816dWizsft7MXVrv1nH3dHnGsHxD1qdyQm9mMAbo7Z +
+ \ No newline at end of file diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html index 48ed76714..6b10cbea1 100644 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html @@ -1,11 +1,5 @@
- ./target/release/parachain-template-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json - - 2024-09-10 14:34:58 Building chain spec - 2024-09-10 14:34:59 assembling new collators for new session 0 at #0 - 2024-09-10 14:34:59 assembling new collators for new session 1 at #0 + polkadot-omni-node export-genesis-state --chain raw-parachain-chainspec.json para-2000-genesis-state + 2024-09-10 14:41:13 🔨 Initializing Genesis block/state (state: 0xb089…1830, header-hash: 0x6b0b…bd69)
diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html index c5bb4cef7..3f7098e42 100644 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html +++ b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html @@ -1,5 +1,20 @@
- ./target/release/parachain-template-node export-genesis-state \ --chain raw-parachain-chainspec.json para-2000-genesis-state - 2024-09-10 14:41:13 🔨 Initializing Genesis block/state (state: 0xb089…1830, header-hash: 0x6b0b…bd69) + polkadot-omni-node \ + --charlie \ + --collator \ + --force-authoring \ + --chain raw-parachain-chainspec.json \ + --base-path /tmp/charlie-parachain/ \ + --unsafe-force-node-key-generation \ + --port 40333 \ + --rpc-port 8844 \ + -- \ + --chain INSERT_RELAY_CHAIN_PATH/local-raw-spec.json \ + --port 30333 \ + --rpc-port 9946 + + 2024-09-10 16:26:30 [Parachain] PoV size { header: 0.21875kb, extrinsics: 3.6103515625kb, storage_proof: 3.150390625kb } + 2024-09-10 16:26:30 [Parachain] Compressed PoV size: 6.150390625kb + 2024-09-10 16:26:33 [Relaychain] 💤 Idle (2 peers), best: #1729 (0x3aa4…cb6b), finalized #1726 (0xff7a…4352), ⬇ 9.1kiB/s ⬆ 3.8kiB/s
diff --git a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html b/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html deleted file mode 100644 index d02f4ce36..000000000 --- a/.snippets/code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html +++ /dev/null @@ -1,20 +0,0 @@ -
- ./target/release/parachain-template-node \ - --charlie \ - --collator \ - --force-authoring \ - --chain raw-parachain-chainspec.json \ - --base-path /tmp/charlie-parachain/ \ - --unsafe-force-node-key-generation \ - --port 40333 \ - --rpc-port 8844 \ - -- \ - --chain INSERT_RELAY_CHAIN_PATH/local-raw-spec.json \ - --port 30333 \ - --rpc-port 9946 - - 2024-09-10 16:26:30 [Parachain] PoV size { header: 0.21875kb, extrinsics: 3.6103515625kb, storage_proof: 3.150390625kb } - 2024-09-10 16:26:30 [Parachain] Compressed PoV size: 6.150390625kb - 2024-09-10 16:26:33 [Relaychain] 💤 Idle (2 peers), best: #1729 (0x3aa4…cb6b), finalized #1726 (0xff7a…4352), ⬇ 9.1kiB/s ⬆ 3.8kiB/s - -
diff --git a/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp b/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp new file mode 100644 index 0000000000000000000000000000000000000000..2222c3b3bcd5ef5b58d7c574c33f8d3b17caeda5 GIT binary patch literal 17120 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

xY^ z>N~|k%ZNUV1eW4qYb~F!{rIv>KcSNiFmhR()bI*@aCRe*dERFsQf90mwD~Ss)uJF4 zx&+75G;QyFwY||}W~xXy2XRnqQ6Qi?+(`QW2sUVR%>08GlUD1|S*M4vUI;$NFR~s? zz2bCmbXt88-uNfqdvFNBr|3~A@$-t3iXR`Pz)O>K)mg^mfo<~lVGy#lIxrqH= z_+KFyV%UkM)KpA&@|uYCqSlCQEfKlOx+?W6Yyy4viAd~#X6Of8{g-xs_@fC}*G$pB zW%6dz0dguw5 zCgVk0rd9&)mW4@>Kj9>wX#bR^fJIS-1`c&bZ?d3bn|wO|8>KQ zX#r|LPK-Yx$rJK;VX5>^+wbaTl5Y-NR^I78EtpYHKzep9D23R}XwI)N%q>SR9I^ti zV@H?HfO*p5P@A%!Qi}ZjXK&;ai1PIuCnAHPdLKYF!dO5Zd(S^j!N_eFO~Ff&y4f2; z8=LL>n077cAn%_v3BC0Jr{V^dl_~mG)cl}_u0%n}LEvP~!2BvMHoq10)+Sae2}l1b ziXWwgfJ3zQWOY}6Lp(zW8>D&o}*oH0_V%ldo@ z9a2>Z9jsua7GhK@x`kGm7@}w&v|C>$h|NokUlQiN9v_cC8b&)jg|1$t7nv*ZwqhCB za=7tcCg?EGmOTd;Pnc6RGzAP&w(`yjd=a6_} zTd-SP%=H4dG$zgr0Qls}i3OXLRq;N5b)G=nRO_~?LM*!NPnPe%{3A}Vr&`R9QmiN> zki;%L><=IlT9e;E+cjENx%Wb9e2{2ond!`#knRn4mAg1Ms=PRy7FEHi=IQ)}K)@4# zrtSyys_?vxQA@JYCr-3zC+vsRMrupEFQ6|>D(mQn)xLWP>c9ifNrv1-cB%-zaNvHH zUgbcQ&r6wVtbttApqqa^o@X228-14-U!SKAEs>$ms+q1nPsOqQG)n5hC>{&EAE1B- z?Di_o=fccLI%`s!z=Ea_?JY*fU-W3ghuVoh+=Qyu7g%3ID#-}I2HY~n{p9;kb?QLq za~;U0syy{EghoD{QDH5W(HoXG5m2@T>0ms@-+Y}}z-i}~pQFd_CTkgYPp=;og4Ou_ zc^&dR_5gpm;$Lc&KmEty5jbDZDT_ukb+00K?@fIyJ49t)<}(OF0P5d1QUjSw2QG=0 zjF%6yJdWLLmCLD0f?zNcg4ZzCp{TzgWWh#~VT%VU*pwb#TpG77e@K{nVLLqnG1rZ` zcQSvZa6-Y51vu@VQATY;Q+H3(lXk6fJo0+nl)B!kY;_%AcVSsSA1>u2j`{1P;9}@D zp8u-vzp+d#$wEvg8S0&_(4)(}bFq#CYSpz!%Bj2nBo$v1gJS6J-Vjw;+^ksRLhs(3 zG$AmFH!F}@&_YtzY>_E?AUDdw=5Uv<*yJ#9co?;d#Ik&0Al&X#e$$ZsT^c;Y$AI$b zaxRiNEs%w34q~+vs`gm)-D@Z6@562n`4g4y)go_Y`SU2J9|_X>8m;g^YY$b$j-wRe zCVHT7y847ll~IzYeRr?3bI%WRgL*VOt5@-SEPUkb72cJC$1~&C&FC^7uADEM$TP!y z1Q^UMiGUPH3Cm+DEh_;?9GY78LZDh;b3cM=j$+edk558eB_r{CjO zcdg~1Zh&W)f`^YZq1AYbIsL&u6ZQ!>gWj;a*dcY$1%lcY>}7+wi|YW=ZXH&XMbn4R zT8a4#!xpyEObh9Slg)dWRF##m4oz*l8|2fTAw!F??hfk*>&ajqEMnv1=25*6!36SR z%9{bNWfL)q1!s|(V$0Nt`zlU1lUL~o58+Xf!$#0)gj#5srDfIVxKj_Xx$C1qHC00T zo;T9FFYBpR7qQf#ZYF*YELX)Y1$Cw4aN}bCI#M3Y8Hf>5s_@1)CimmHlQRJ87oYYz z?W_mDUc;?B_k3x_)7?(2Df@8&2(NbTP+z+L;0qTCwchyQrcDf9fkv?aK-qa2;YfLY z_PF(LHhJ~~91C9#WudfG`p!C(bPAI5{J*FMn)^icd%-m)c62T_eAg$)k4?b3xk$pgnlBC4G}QHEh#UWZ_BgzkINg$6 z|GfO&h}zksR&$e=;YpB;vkBlPZcoer&~I{N;Og7!FZHmVgVhRm0#P4ku!q#&xtLGue z$Xmgh(AYU3KVq!eXMDD?NauB`FbG{xnD+j}cB}$d-U%&3SL8uv?*~)4wPR=7ehCvD zp+Nd~>Q3I-VsYM6?VGWe*X4#0Z2rzioxDj?!0H|&`u~3e%)`fhMt2Q3sY_-Yu{z*- zocQ}#MPs|eUo(l=szu+dQ3U+8eX(UscAu2e#=cIPZh>HQVDFhz8(_AQT1hH#Y)RwnW;3fdcSPp{G?o zgydN3*xsV}GuHeKMdJsXqsZ*F#o<&mlGEeu*(1BHkC+i)o^da6tfC{~^cwroM3?)- zAjiacEmH7cm7rfSneli=Br~mNQ#y2gI#j(!=G0Mt)kBf&vk?Pxv7ypUVWRRN_axAh z;p+_r9jQDX{klCGS*ZmAXHg8$%@7I57>K_r)!kX-=`O98{2wrBUD{*~&wSp`bY7?g zjCB=<>63zYqfu_xR5*ybu2uaLTTx}jYp-oKo)SF7j?L^#UzU@1O#|}D;}fhFe07KG z32vHi;775FGY&2tC@UbVxqDVODL@iTx~1 zWW%(=Snw`5f9}eFK_GAWvQ#Pm=j2z0BZ=Jz?;**)6ue}x4&GgYBcS*VFk%<+A={Rp zD!?9m9P6tGU#y9w^`E;%4ri+4u}Odd)MuzMaB1hZb@F)@y7vgbJb>=1li#2iSTim# zZ9~73AhM*NqRV~bn>}-)MIlhIdY&kgA>MvvVMw8uLEDP4EQBl=t^zj{VhGB8{tR0C zzKb=dB=NF@97TC)LuY8gsrT&9cL^R$Rm5Nu{QYQ5QDERw&1`Ar@XmGY;(ogP-Bu*L zg3&Uio}*d?ea3^Ni#$e@_{B7MWje=af5^~a;L z(_{rcQJ!ruR1b0^Tpg`uB+vB1DMF07r@H7hu=__+?|zxf2OhqB1B3tx))M8aru8^Q z{j(4}*S;o-YJ40vt;EPIpu5Y41MFskGo$g6vUQAuS!_sJjR91yr+_e8mR>flPG^`sQaNOo(Gu z+^7WjeQ0}jrV~f({YTQ?)9A9t5F#!^e?;*mUR7tCyJ9tmVEFRMVC!tIq04_j5_RRVgjD|clmJi=476tV^^xl!kv->C0y-Ks9{_{_~Z5+pP~P_ zZaIjQrNi-3$3}_rHRSPkcyZr))L`x zc74QO1D18|;}&h_nwAa`KqYUcMIvm#;%@TX7a%9nsJfT$unr{6xx2|lQ)ea%sWW-p z4!9I-o9elU@)@ALoRgwumqxY~*gSoeYlnLYgpEG3)rX+5ojw9Uu4r)30Eh2>7j^Hf zONwhKl3z9QT*08Sun!+1I@s1z+V7AMq z@YBmp{iSLAj0KcBkYhvGaU?ik{$&QT^}+6%0Y|og^E22n70nIUqhG?MW5&!fC{mr9 z)?uk%=CA}qGaIZ(aBCub&ihxpl3~%pg)dhl5erWu8T$5ea0o=3Cj4auyiqU_-X+n7 zoHyV+6Jz^@8Kmiii_K%0nueGTeJ4w+<-Pr=SvBqmH3haDhk#HsX7ppGu+-h1b=K_xo8 zJEE(9xcQVp4_)LMmU(=1>#C@foOu54t1)OuVe~TXz4Py8N319`TRfO#=`fPi=zk3D zSCd=83QZCc!^E!4Z$Q(6EnA?1uvk-cIj>hhRc)H;2D_;w^{p)k;T_jIWTklbp@#n3~7BBWXrX&Riu|=s;0UQ$pBm$^97yj*5U-swr z*R4zEzV)ozg*+Baibpr74jfB{dcuJ$Fqlv6mftsV^41FHM1ZvJmpPF*pWm+Fggy+5 zap@B1_Y^I}wyoM$t9tNreKlPjcjHa84{>XGJ|C^;lZ74CV>t*=e68eHsHnuyxQzrr z4Of)AL~-QmVj!XRcIi?XO%w_@-$`!Cfy4!mx7`Ti1ap#S(Lwp<19PkbgoX|1C6VF; zi&eD2B4ht4K6)U)w`{qJMa_>Ek#B+JcgfZob`?EF@HI{LgquKOW^^R?bBL)bc<9VL z$fb*t*5GW=d0=9rHx0Ue5ZRHr8(M`?+T*Aju>qF%c#+#^LRPM~Pd~5#F*rRGUHXS3 z3g(UGI=e^fz5eB`7Qnv>z~BFto?e|xd2}2|aj%?cd6LD5e!| zNhKH^pa4CGiV@B8XU2nfZ=T;bK*hF5y4E%}i3=w%4%J8rEW`Fs*$W79agL+nb@uzk z6EjncddE)YVTnN!uC2V*9X#r&J2%A_Hpu`l2x`&bz}8mp^@Tj*yoS21ltaE4{u^e| z1jar4>xrbH(%rH;g5eG@MoSJzn=H7*Dfw9I z-VL(Lj@|1JB+_t?shHncX<_~1Vhkfiq6kUg^Ki;F7@On01O+nx9PUw|HYbFq$Ex+P z%|Y;ubAAto&Sq?aQ*6OURqWjt0u)1(-E!h9X*kx_iZYbgQHR^D%Jm^oTnmOJvhV5r z39bg$_uY!Ys_EHO9{TmucANj`qU(h0NTG56_f=93-A89?pv_1*hn zomW|}hmY&@E=V1vx|nqFu=1_5&EKZ4!B?<0H;Sumz~u=`yFc1Db>0-Bq*c9>^?x7Q z8tY1)P0+{Z;4H8~nCYXYhCzp$iWKMW#H4K2dCFqOnjx^&x1Zo+^4@JYpcmlISDLo^ zxw*FByLK64&0`T!GIo#H*|1mzMGw~ql$4|~4jv9SU9GVt)3OEd*2B%(R(YyXf*f*i z>V&y9i~s6yQF7Lo#HPpWft>x*HuH$za3@=Zb|@?}k#)fWp}|2PJ$SmyB)CQ$8jI>M zs|g+r1OiLEq66}#Fn?c?fYPmnB5Gb@E6_5K6V}BV;0-a#bEML%zYke}W-&R(%Zv%C z*qJ}O=Vw}D$Mul3r2{i$>8QlC-214n$#QsG*RU!b)p&M3FQZq=`bGQkNvRqMd6Pk7 zIZ_2V+Z5v5(^TtHJwaW<)onf?h|>ZBPcO258>J@kYZ~sJGQqb|No{=>9_}#Kaq$*R z_t)|J|9+jpLNQ3#HFTC2<3G9}d#_|sYl*7~-@|NTW%b5^#sLrh-bdtY2Eg;8?Mt!AQx1)jjd9Nvph#m+-)>fkR#^E~oqQ3l)^`e0B}p!8vB zrw?ic!%gUo!?^{kB<168UnvZAjaqbyJk!Ag9>cASmTNw~;O9d}0c06-=}gASN!0^* z;NIxZjCZ+lJn>jCW9q9_@DtC^bw98LS&tG!OLU8k(_dX$*I2-a7WmF?^#>jHw}y2k zP-KMDR)-7TOTlMLYTX&UmyT6r5u>YwQ9+&pFaL)P7avGG@=Q(7VU&LVEsDFRza4%8&bAy#1-X&%=8c+Mo} z&ViNlTc}1?K2;~}%R|8qBqG#(XWiE4K&&HK_8cj9QPppLVzuc%cFr&AoV%fs`WP{r z3G>jLZ#s}e@?%tTt+|9Lq*f7^e0ciLB&1@0)o%Rr7|S9Shyye5ii6Ss;Z>|v^tND} zZ$Wz0l54p!(OlsqNOSIqFi+5upMm|dIfw-j*Y5^KZn}3TSOa$nMO-#b{C)XGJqwPn zQMH9bU2|`q&f7SK9kw&{D0zsYcWl7)e0L&2I@OVS%DH5HWitWUxxTAQNn1z!PX}-q z@t3rbJpzdhhA9E#vTMhkMgk)GY0_9|X-+0Ku~wzbD5{W-YwD=pNO=Dv6tr^0Rd0~& zKb?1E)UJE+1Iy`CR=yPzEc3xxq#=O2mFi6mDfzdqWt4eIkH|CGTEVFal{qgrSCm$U zK4^~?tTwqgq(|O9R(#@Sbj7=E@JT#jY_hxZ&Yrf!vRi9B7@Ft=H#R=8B%RsSA>?7u zqF2pS_tl6kKR>N zVTI+1;2&S>eem=%Qv-{}K4;_euf!*YiSBEs=?Cj_{2~Ha5s3BBjvOaUonS6SE<86l zCGDBEt%)7sitTSGq^m!-^HhAPTsW9rK2_HhLIhfdBALUg!yB>ii*#x9(cOl7#eA90b7=A+_5ty2qIF&8H zbPaz!Jgod+n#;gLyVW~|QtErTH>{;F#c|F_Y9{}%}g?pT@mtJRIn7cPP6 zlLmsjsVlGD+M>@JBB#{{8*MGYoQ1vaFK?9m{gMm%P)Z&d_@eiJYMQf;%$EO_R>zOb{~7f3{)AQYlh3+2vm(tf|HAVKjrS!0Ow==0lq7zrDfMd* zI`6^!M6n|c$xLP-R211b^}{ysDbxSO+dBp65;X0i@7Oli*tTukwzbB#?U^;UZQJ&& zv2A;=@7w3%T>KX&&W_l5Q5}`ho!wR0kx^0kR6e;g4R z;34X;r>2^c8FPwb&ad_nQRrcR{`=Vci}aE`(2km6sA_UXHW;MBDZ*Y0@YE7dt0?A? z?3V0uLeOl)e$Eyz)Y1$OydYgcF)3G1&roDoY88+jsA*n`fEvA>j^F88`^#;{eA6Po zwn4bf-ccSjeLGQD9t*_n{cUI3x97h>(Y3m;tBE1-kwe`7Tu%98ItS_0aJD5yF&vpDn*lsPbKFUsGbn$dLg z&Ko{RgVjnsMj7H2(3rDWxVPCp6GYc3uHN;yVvBKe?!F zzgIjA4%ck+Ygk?N90ObZ?*MyS^#&ZpKUG%84-K!{GKMy&H~WrlzMq9(Z%XR8&iyRj4zVQS56TW6Hz!!k|T}DuDT= zvVoOa*WPN;T#E?Ainv?X)hORt%DlFs>HWuR0M=YQ|3Ohum2o|Wun97Xf^C(!+E6oZ z7gHWyp>HSb&td~k!5N+w7rCHc=!qn@Pbd+835bo1NYaiMRhtm26Xha3gpvSbnYG+< zrspeVahSnnH;Sl|t5(oHCa)@_v8;B7)NzHD4h{AVM^mzY2fQJ+8v$KxNVV%dyvakWD{ zR_!hRYC)*%wV>TKp;PJB5FdMy<|NJ#0*M?btrsN}-u>@%h@@c!TRsW|Jof#!`#&}o zFrU_cRyOqnl7iq{pb8ru278QCZ#Vel(;(Byxt5!2^5&Icyzb{>3ZdXP(FRa$!o zEq0Vs!GhX~xeWWpf|d@~kfuIDmCNJVU_^pLGt_l0^Myth<$LMt{j)xH&vZGC52IuE zZ?L?>J}n<{J^|+#*J6#S-m?xe=(&P`Be$2Mc`q8va|cxh`svD$UMGW~e= zKP*5jUa!}+1SGo2-8Ml>iKJ-D5Fz{BFQ!f-ImyxLxSACfnqb*;4UCz?7>=rUb zVO=*W9}H)_`qO`lV&*Rb)^Aj&p7V5ck+jI%&Ht5tIU?aoBC^cP!Eb+8sc z2h!x_T;Dw5s8GTu1W_RQtsuHt9EamO(>#;OZ7C5tUvf2=VO>&7#@F@-)DutIA1PzkU)^DZVwzhp;?_I|jh0&_kAHL&ufX!ah;YkOj8ioy znM2j6!fDQaZZDvWc~6{Z246siO<6(?6}j$ZRuJRk_uUX$Yn|S*Ek6A&>la=aPRfY? za_>Ak0?A24Ktl2T9EHLY&}YivMQHFzcVNjSK;Sr2~?I6?xa+!w}&C zKCr7g(RlM>yzYS}_I9ug%FE{B%e;Df=ZG)pn;?^FNMB|eDJx2$5{*OE?L@G>wYY z3CwSm2>Us=Q~tBEvDGiCSc;E$PKKVidD_yHfq9vi%U|QC8<$%7Bbwskf@GL_G!+j| z`c1@I2&aqR*sCOYk*e;+xi5e;Gd7tIc$pu;{-vkvZ`*HqCvpC;hEz8_9E~uv_I1~ zul?MX*0Wkgk=E<#uTN>B`RsqGI6X=Cv}LbUsS#K+t;O$-Jx9@CI!DP0#;+0sUsGV9 zBc(1VY1HRf^oA-AG3t4+gtT^`fhw*)E6MB)M|gx|tiI-ep(AVp0CV%vBL=#)5*Ga0 zBWct#$BRAF^j>ekyi0y+da3m3i21c3Yq}i#^KS147Xpz(lrE&O$1ZPH?{V+W1->6Y zVjha(wGqj3p4v`Q?*xNG=48vP;O;v^2`uRDb_40r%ZL7l>sEcspub^l?x)__k4W|% zH?mNkaej(oS%Zm(4+@0p!u1|3Dj7AcCU8%X40oaP)?)bq^|#O^y@e$1Ut@|&hz8!Q zb?e}pF(_jNN@UdS#Q@IA9Z}yHIE6&kZi|Psx^goB1KS0#PJNdWevtZ3leRePis^3K zlFx3QW95^-M}l3{k!-{xA}T4kmVi5IWZV-taCnAiGsuF?w%>-EabgkpGVaiIDTZ=78pKRzpyg zH6q*_JjHCJ0Mq^-h)b?2CIOUZ?V-XC-6tfk_9qoj?=|H%IQF~=Yr7XyLMn-WGtR!I z1(%0Op|)Jrsh@M8OHe==1GFT`UseP$nu5UksA!C6ogZB!qm7 zh`AHxfifk1*&IDP3e_$7h#nR?;*Fq?qEp@l*G(QEjw_L_;TcV3(UUF#ThkV`t|wz3 zI!~aXPpXeVfxI21zWeU>LPGYB#f8-0is6fQE)Ay=yVgD98=XNOmr;_e@zF7ycnI3D z$JDq|liT)6I%K}xo;+8>eYDD%A^S-eak{joo_;~zV%TEunr;d_v|-(7nyUuKn9Ia)!4@-QVTw|-@plyZEak$Kre7{K!uJhbbcVkZ&!4!hfmibdc?I!V=x}dI}4+ zinlIgSm+WMEt)hvX70d6-ZDKeJ!|alRDn6yh}ms7R?(Q0Y+>=UIH&#kFR%~4vYOhPKf%3xxRvw zGfCbziA%WUUW<%Wb54dBe0w6;K7i?0$|4=$@{n&7ffc22V6GH413oULU!*P{wVCqa za&{oz4B6E)Lm|dFmAo#x5#@@?m1ZQRD$SSz&2Q(hlz4=2L0E81$p?R7Bp9X3D%7WB z3fHc>_JzfBq~K)Ys8Z7Qit%dPVTV)ni!vsDr8@e@ta#e=zU$8o9Jhw**W->moDy$h zrYEHFB!oHEA90fj&xmqN^hfXRmnJCNg0ntR4)_mG?i7h*(IT7svcry=ps!>;;Y&S$nV5NDn}v2LWe*B5qRKBNGF(=T~chQ}Eff4^z-1gC0&cZhpw zvz;^uQzNERkS?Byolj0u*eDxYYpq*?3oc7YkMxCYb+evzPIixtsk`_M1xndiMDG*ITZWnt%QKR1AfM2NveKfz6C$AM@Iv6`l{WMDpsKs{=@^*&HxP) zF)!85ZIyiH`|3RP#7D4nJUbE96$YlP2+ z!~pVZcX%pAKS#1YgF+x(^u;6byk%%q8Oa>A2NT_)-S#=lO|-~IXX*#I5B6&bbxm5c zp&FfQCfLzWkt(~#5^`RQ#fb$+7OE-7Nx3#OI=dTGm6vCfY}v>nqv{1ZN-f9{{qZSyy%}hexlfhnbnEckqkpLg zeT4MhZD+c#Qs@rQ1xO<;mFj6Iwj zkp)bs54j_%Q{3X`$K~4dbX4pJXJcO zT`P`(ZP>|qwKd#|TR{Q0Y^26BQHHRdHxK5XO*j&g^+l`VhKG?oBf5X7r`zQjyte+UP3+dD+6WDXun{&k zHkgdYK!kd~2{Ru=o`N?Wzt5RH;l)7l6ai^bK4#~oVH4rpL5Y@exWykatVvjF>WZWh z1^>zsO1LVuw=bGFW#+tDU_YFKE@8PhVy{nHz~!T}>)xObF9on(L%=`Dc}2-h@!(0E zd5TP`38O^h+^3iLaNT^|T*(tX({o}Op_Yym8Oi+{GZK0%!@nw!kfSq=3CBXhFwSTF zE@tGJl`&M+SO(|RKawa-){23gc{>JN0skJ9Me?l^I7Bb#txmNMC&YB+v|J7qL-@pG z_+Ynew}gHX-C5$|Yy-ovJL?^(-vfm;S9OdcA2j;;wUT1-L;yo?VCM)QQGJ2cfvtF- zIkU#>M-fqb=nznr+ILBu6KJRzaTS)s%izSnyt9?n2%t1Pqbp~eKB%8to2#H2hiUFZ*dHM<2AkuCl%oSksn8@AGTd2 z1=Ar^&b|vUOjYoj!*Q1v3u8GuN6ucWkJ1z=iBG&=Ann0ZGO=$Yc?<&N3I65~W&SlD zGl7vZA9X3^LtZ689U>I{`T_2MqY{LualDUduTG*A4Vy%|YOgBliJs%)yp@x zGF7+(gRJGtG5`X@W0X(mPvOT532CtK4%F~yEiO%SKm&;dYC2-BX4K ziKvp^Lo|tk%h6nzQtx+N#t#@P7cTc^n5Iquo%0#;GONp*(=o7TV`2mDLtr-06Afgw z#p+ws6*`Qt30j3gJ8fyd7>9m12}5~XnkeFg_?7xiokJaF8o){J3bLn$SPX|k%S^GY z@Q1GZxj>WuEux0Pa&kiLH#_i}P0NMnLeRJ48675Osar~rVhQF8YwITQKHUQuc7LBm} zXqPzuuZN^5IHW$vIqN}^aM988pD}$A8c+3?Ijjxv>-`j?}BXTMIBDV}7CGM$w zO1xu*q*B{3Fke-Te12YcA=GSTLzRCpaxE26SjPTYRn+$Y=4N-KD$)8itg=^8ZSUnidMO z*UA>|f2?raD+PBtSgj4{>i&fZP`I4o+(p`_JZ_Y>Z-ozyg!%Ocv)7s7QW>O8FXnB? z@;iZ7&Vo&m2K5ts>fgBqAO-Aw3$>1ZkZ_=NDh1yd+esm?h7Db+c*$MRB+Rn- z(T?LkgC0hWf{7tWAV?yZjNX+ouP?aQC!YuSUh5v5D5a7*ua{6!dHdRmd%-D`kJ-6@A}o9G?M&GLjDPS zSDP$t!%q*&6Oen3sOayb^Y*Io189>|QK@#*WwPHLYIb?=IidXWe9b3`k3JiMr~mdC zkIu&qhtezxqbj_btX)tk6UmRpwFmtg2a5l4krHO<`j#nygy$XqI)?7wfgJS%0_Ybf zj~c>Wpw>^3hbOuv!QS2todAy2v7ma40$8e`#oV$^~EC%m_r2K7u zn#w|II3QbAQE;{!d<2a$hueoRv|wP>xc>HjKT6S!o91^145y-tpAhCLx6wG8OIEeq z^P9h{7~RuuTJUP!2ka|otRV(Ao1wGoGjc1WQwLg`{UhH>1if)0-2LNxGGj_p&ZZ>C z`Ok+0DZbT5ga84Y!GFnzVMsGQYq#+2x@ZFS`%;CHAYOT|B ztK%h$1)?i7E~LX*rpbJ$DiVJf(|(`?O1z2dlp$F**YIwK&#$$29g^`p zADYyCxNAO?^gu!s8LyfZ;=T(1*@_NDrn5505CDVzaY{YYp%@5@y$prJ$9`D>3j@DB zu<|00e(0JJ+6*2hv#CA**|d+5BbMfJ)dO2&*Kb~JA6+{tm%@eh$W|r2IZi<{IezdK zkoO+rclf%?zf#Q|7Z$E4>supIQuD^y^Ydw9wRAoB@ac8Si#j0FAna5dS(0bwdATGp z;0ZOe=b32A_!`u$eP{3LXn_8r)v*`?$ec?4qqB`&Gw@k1c3;+|*W4(m4Gk*Alh#_B zv~%vFt-?B|qZ#3X;J+=eF$x#9 z=;&`^7e>!lF9%p{x8U zFe2tVShG8K_2{2LcyPN0x}kiD&1~ph{|!bCV^UeVG;9}KF#Y7f+D7Y6N3SSe7umPF zWIFZ!tlkFqN{KS>4Et&j{nj{$o(X96NjlA;W^H1$?HiSc4M*suMbR_-q%d_4^jYj4 z;{D(YObGO@6Ucqq0s1sRIsO+6wGgW+3kcNi)mN~|I_U3B&zn9C)LzY%eH-ae8N(%UO(4Ez}M_)QCmKu#O;eWwGAT6g= z7pLIqRj3q!vOf;{^*>+t1oXRYwh?&%Uv=UlPX4sshv#g2VOfze*R7!lf_y+zVxT?! zGGI|sdY9A$C0S>*VT~{A6fa#BrD>O?-=-nGgk*5r_wMnMsa|C?UOmnpxkmfQ?F~;M znhNMIk8AlBu9H*Xt^cWzVqt)P!{#gl`xh8%E< z5cafge|T6u7mRvmcS(>ML4L12AMgl81uq=yA+}{Kl`#uE+g!ATW}o8=Ky*7M;_gz# zf@(aXD4GCJBW`!2U?MI$*Vq?{5ohBi$^)%#mbtK)vX-UyUW-*2izV&k`3uFkm8h3P zwegTDjE6zj1>hdeww5zxJFvI$JBWuG z*JR`y4wy|T#-%zJ-9sfY$i;E41jC{xH0KHK$@?He+BN}yNGFa}JB<~eC28ip6YZ=Xl&Z^wokzEtX|=D|qc8@Hw!MCg$b)hccgC(aAVIMU(fxj= zo21{{jfd@b-VKqg>&)!zgY~x<&6~c5PKOlS{li#YG$wm8j!3w!-*YR4$( zNiD^htiy;0q#rDj|IT%HoZ6&W&xfdAexE!8k1Eg5Uti>}B5JK&umtee`g&khd?Nkl zATaoi|BJVpD2=VA`7EQd1Rn~9)`Ijo+!-9b^TH@Y^&)WO7M|pt{hCCYoRkA})wEF# zrV$>0B<<5eZS!1MRI_F9a0m8@^*D2`{hn)>W0NnE0gyIbjG7cO^O1L3lyd96E{oqG zTb4vE%Xf&L!Dxanq`j6?|HdF*&u7=_|2fu!o8x z{+6^ex(Wes`Pp+o+4?jDG!w1ec6djG-tOEU6}cB={WqGzCo~oc5n*6N4Sk=dt-uur?%2`8z58Z%xdgH4 zm0~2#7@CUGoCg!^Egh#nsCu)j9;A>QLDkh1;Ba*e)%W{o8}A5}F}pEZz1i?-I)-OX zI~Zuv7J9bmRJIl2t(M^u)uYY6?sUApbr>;-95}o|%t~odeBW&5231bJ4 zg{Ne6D6&5KtzGcPrmX%X-h?I7vgohe%`Sal3jZF@RaN*}4Mqn|Z2)%&$ha(9KPC{v z!oAR-Q4$*G?Nb-r@A#dxA=hC!-|C~M#c$x-4Zfnd!*v-VnFakylm4tL#GkD5DXZ#@ z8+k}ilE2JjcF#;lUtp!q$iwZ9ZjZ0l3L;dG?ORnEa~0i&DM`+$ZbbDWRdLG;2tC{3 z{3g{ae$I|yf|gmxpSn|zTTZNQb#hU+-U*k4-<#?cW!KLDZvM&W0cStTwX9hn!?r6} zr{;VisS7N0vI}9wzFMCx)sSw1l7{o~`sQqgg^-hF9Iu1HoAZ1DJ-_4GU-{J*of$wQ z?4ry1kR1oPc$HexFYc(2af=C4J#`os8S{R7GPn_$GC(B{I?ag2a}|i7TbmI9cLgiumRLU&1^1m) z#SwAWm5qd}w}ReBHrZ3tqsAuhI}VBI4ajm6QoI6`HKID5>m-P8B(#KrimyW^e4W-_ z5nh*&&j^K-kPTv20lzONWK1b5kZMm!jTE|}*F}N(#SNN_-h+&7FEDpoFD-XfrV~un zNBcI)lRUr5!An%jG?}7QeQ3WBxht&HRH6P4&vQa{!?%x-8z@i0Q#oI{>JVNiU&Z1`2 zX~U)!MCdWG7&hjPLl@?6k8bR>gm{q5=y=P{jo6qoU9~-ZuP}{&`U;{<6J&{y=p9wM z3_8gB&?{LL&`w})gGb^ggM$;7;a0^m#CUPgz&7zYfSE%*2l#{4L91-Lr(K3~FAi?( z$~+&cm6K7EU}Z5XqCXYh)AfgfumjJNHxY6KCq7@AeXVLE(ZIYtkdc`9*sAqrlV)vw ztvuXP!A8EGQ0kH=rEK2a&v&bxfKNp4x7s`^FPn@;6(J?_+DAGvs+<)>AYBE4ePeUV zgm;H;ygUrnlGLP5*t4kl{OT?OF!{$6ihzK;*ohXvu4I$1q;u2@H;h*5ilQx8G0$u; za6?kfxAdWlY0o<%ho=tL(W&s3`*CHy)aGQ_+neJwXi^fc24tN5{KI ztQtc2OCYG_EV0vw+Y4n0$*tg8%_e&+vT!HRj}bw|vM#@SXy(2p&^?`K$f$gK5~!PA z90Z3E9E?5afn&%w{!l>{&o1z&Mb^DSmLo6BXzf<1z>=GMCGK|6o;u8etUwZlw3?># z^#jhyrix!SEM|uK{p6W!^Up>vflOV<6_>jb!Xxg%h*Fa>4JpL9GvW>)+3vSlYOL-I zfgPWHOo4)rc{dCC{cQ9i-0Ep@*hSBm1y=}J{QDvHP{R_}TkD07pddt%(^v^W=5yT| zj0`E2vokN&GWo-{cjBdIXyJV0E&AX5z8W9$#U~hLJy}n2D&Ow-3zOpS`clUDIS5I? z|K{za3`*&x1-t0lgsDS*?Y#0{`Y3nEzm}4w&eAFN|5^$!ZK4wf2iiItFN+W(ViDZ2 zkxKvR-7kD6w64mU@|IJ`qb<<30A3FfKzP7l0^KoW;1qjM!X+6ldhdPs!>(cjPhxwA z_u^b1+3Jh*JjdG;gsWT3!ODtze)DI0*|x@HnPnWE>^t)#LDnE&oLl?I+Fv~jo1Cqj zIhQ`4+vg?>2QP~yoLq@nRS08&pFh`fU4uv^hzh%B@?#{82Of72IqSzgNJ1oB>|9e+0Sz_Ny|Tg?qrVUxUX zwqf?-neb*k`t!U2Vl5XIkc46TS(H+`?dcm|MxD#~gJ0f9ooQmvLA2`iL5mY7L%!?c+LZwnCUz>qWSVWaVItn@1Mw z&u326VQReABo3qKmRQH&kw_i!uz})JhwxKqRNa-`^j&eh!MA{mhNtS<>eAhcU9y6p zAffiPrK&2GTTitXp2yHb?_;YE8DT=#RHD~7gG}QR00a$Mz?&J z?UWK>54YEhsVv=FrKJH$YT}2xk|+_Tcxho)^x(cjzlqg>_4QOhrh^g7VB5y(ozr5T zs|JwYw;#>=@my3u&>6;)(M>P686~=la|}dJQOfa`z(4IuhV&P9(RI@O zV2R_JsHvaMfb>Ksp7S&_H0lEm3fJ4PUn=2ywddp& z;STc;Wvm-Wy=7W<0Wxf`TRd3}eSlx+&|by%a@vv3G|epuL0hlx%wiCoHv-IT$%4QV z{4LqfVuiu@M86Gq-ffakHeg(fzUM_u57-!cAWWk`3?IbnrmqM$%gS)`Kd{AS1dZf+ zNHhm~hTE5e9Da#p-U^=ys7eEbc4)-*8~})5!@0pJ!rg#N#HBR?Z0;f_9C$Q<>Zk0o z1-Ea#T#L*?Ow2D_u@#v_)otZ!Wm-%Q3mwZ#o?lB2uy1(Fn&9YTfpgO&d~k+}iMa3OFg%iT^N)cHHiu{6Gj`IRUu95|^2=yxJ=ANj;WF z$ODS25W5TXVVI{X29%Ig6PiW%&0R}HxB?2QG1Ft19*$u2Q*ZbA1;x5% zJ`e0Y(BPjWjIL;+Z(Qc?b@I-eUi_M#esX57@QJc)Tg#Jh8NvM2Lm73AY5QcYMaU$0 zIvijfExKlOTcgqJde1z6j@5?KiXD>1S?2!glUThy@)=rCOOY^=&_#?f`t;JhXdQl1 zApBAl(3dg&nXRz)((d=IEOzp7k8eikI-Bm1wa`#a%JW#cN>z@41pW?XtoJ6=!x_9e z$3+B%+^NeOa73uq5RTj=X$*A7g|>D`LkO5#4Hk5H8ljtjsynj*`OSToK8~x3+0h2o zga%P?7m>awO_jS3uQE&5U7<%dkv9DT-D_OIR1decwA+`zkO_v;x?jFf6zQM{d!uMn zamTO{R6iqBFSzrUdLDeNF-h%~?j-7{C2)KJmyDk4_D|8F$&i(7sdu+c#OS)Qagm3^ zc|ib$HgF|-5O0f|mv~S(up$fI^BCLW`W-&HuA`O%+vO5kK?gtCFbdldU6K}r<{?3> znUiCo8b-D1{u5;(&9~*4y;jr+*d(e{4y_O9sX#B)(TwU?nm5vv(uJ@I9pM5tK})x| z!2--zeOsz+(2^2lJh_OCdBU^acrLp7LnMGxbQfsdUMAtKe+ez=?-EY9GuAHSZA>iE z5x}Y?`A(tQ=2ydX4 z)N=nBQFyn75$EF#VbjH3C-?A*?Z~O9-K&t#k?8lmA(k4^Y7!?dM2|aQb_ernG~ydH zFT8&p2=r50t}s@xC?xvO;b39d3?lJU-7^@A3WvPcnm!V({;mshu?-tB?3uvzSf?*y z^KoeY4D!+E^m4gf78mYri*f(d5G?Nz{iScd|GP^6xj#+0+aA_5Uf2dB9T8x z%=xS+Ea#Egh;9**w9g4H92Ni^*r?Gg=&;U_xOH86AvY+pzHd0XuPPC-#b7E~^5Bol zxPKsh?Y7Zrb2Y)C&whBvf}aMQq!a?=6J%V&rOyZp7gx|BL=SgilCYSxtdhzD_lW=d zN+{|>5v5*+rkj(F%^9y>e&l&y;)(fEYYci+>)=SD8R-8Vg}_T*MECxbKP@rZw<1y%?H>ieK6T5HGwtKDT+cAtBrA#g+_ zA7c${#<12}j@52S`OV604L{SDb1FFKQcioE#BaCLj72Io+BU<+&FGj387_ciUg1oTuB+JV(DaEY{1q`cL2CEB9#gva`%ZGynuMh=-w) z#vp6jO<4}3m?(hfq7vM=u-2dhk4dm|J`@?^4g~WMvU5W^7_^QA*3?aM6 z%K^MCO*NwX&V^g0k5=AD7)^9F_4#HW3A6n(k?l|Y9T?JT6SLxhf(r} zMFDPQ4xcS8yNlGG_e@F6JW{`KS;)*AQ~-`fgUpAzToukkxfIg1R^nd)6bo(Pp@~)p z`>rPALsa#))N{`Jb7XC|7&e>g+HplF6X9c2ph`wki}F=EY+Pi$xcJ~BJ8ue53`C(D zV%_3^n_e$Jk+%u3C86C!GT=upgW{B0Z`UB-2F*2docj$)={u;n-o^qvR94ekGFh1` z7nW2AoU^%A4eX8G1WFZQnYgCoS|9f3nHUtk9x6aawXZvxmC3<^CML3V-S$a&BS)*Y zNN?0S!c4QjRYO&B-LIiZqTpI(VJ83!>Z~u1SHn^U{6(G~6!-`K&>S0d1cZ2r4vpu4b;d2=nSZhwy=qAr9mEV+7~BKXa?#8U?zY zVl0Pfr0Y2;{jV02K)aJ|UXQzlhy1#iXuGiUSej1sd9P_?nAx5k1wO)|2$^4gqgW(5 ztMwM*eqcy+$w4hRa4=%XMtZ44lFiab~uNSr55uO`c)XQ6!SNtyxuAaqnxz~_PbDUACEX?QWiT+>S7O}xItRITDC}fM1Gz^e4S{jJuJ!v1FM+g6=tvN@u;81Oa zh_MqH=D(W~WprD3963g3zH9S#92KKdWDtUVV+Vdd<3e*m?MzSM(#4<-ini#6Mxyz}`$#q#wv@BlJ+URs?9nbMJ4n&?yu z4L!Bss5rZ$_prtccz)yj$<-S)xs_v(KT5reBxtmm9L5Z{?a~-E zP*Bw{Rb)FGwz6r=otMENXVyeVVGgDr@@Ii5(oADAG9{wuap4o+0@FzQVTzNl{o0rC{Q^~@)wJ1zGt=XRzs?*t+_c-v4! z;MMS`GkGdD*`LP#zg0xF^+&--9;>O-c##BD%G;{dGRRzDI#qTY;fXB?Vu?lM?~p62 z>UQDb++P8oF-P|ssNS?LK!(u>`~1-FgO|nI&t*iim<}jmBX1-Fh}2SR&zHn#XHW`( zlcgQL(UstENGM6e*;q{lMv{{Mwha3*BRnMqjV$||G(rw?>_On)(rS^Juw$G=*`t+XI2-P-*n*KD6b zo(4$%q}f#>`U#i$lW}JxZ2KYM#`awLaBL=q+XTZK)P}O-coFMZN!}p+U4>=&l}ZwK zyC^cc?=)t$;$E=QQnm-|`3c@L#}GZ{Udbxw;zVS`+ds1Sr=PzXNSCbi@q;EFHe+ao zr8LQBR{XO``PM5m9VF7b$Hy@685VAl-zJ9+tej)nzt{_#SsD^^Ndg<^m|h4<%0ETb zqJZGq7E}VS??_XC{%g!%fo87JY~-D`+e&ZMwT47$;pqJ%U}{-pl6;yhB!%O$7!O{H zO~rI~Lw-OtlnBIpb-y>Ck$FZxrd-M)TKg#A#MEFsGR4#_cHpq`i_e*p0B^pnV*VhO zQyveqBhwd&d&T?`y%fydCXC7EZ)GXIV ze9pb(yJgXawzjtH_H~I@vIEPMZBm4Q05oms7_-f#sZy{xE>zFwU(3?^>4zG-`I(M| z#Q#xZmK!W|egOx9bIauczHX?GI<>V;&P*~{i0ivGMt-M)Yd?5jKeOF>%~fQ0v21b) zYqs&^3=2o$F35AuJBKZ&H;Tb6<%hcA5u&E3p@(2Xgcr&EBp{~QJRRT&Xkjn&@55{S zl0a*G;$4_o!sdPnAGoZWtR;q9UHgj^`W9Bt6x0FD6!#_xc4&EJIkpd)N$5R^hU`sd z|6OR|`M``c=9v*<5~D{(7GEE6%Zp#D?%f}>=tj9mED_>8Hpdr_wPUkvr~kDp;nn3M zJ6;xZX^{(!&S@l{Fr^88d9==RjbdzJ3;zt)&5Ib!_Ny6e90hD#ss1xWm1N0O5jk*p zFe#|0j!`#dLnrhis?i=-Nz@(VxWiRl!Cn`a!W2*6z+MOYB7MwBvwii8i~e@whwXS+ zNl|W2_lW?+vc*}Fs_cmDNtkN>PB4!$q*!f_TaaFxDxeB zzD&6SX_P*Ujv9?e+=MdEiWZ9&L}{p)`glGkS)km?P68Eg;j(*PCEt7`Djpay_$ z^EeZMmy5wshIPTN3-c$b5J3)NQUr>&b}m=n47%~4{ty>PZpL$)lz%r;h-{6F z=A$cvskos+rv&cOl5+Gj+l7b)Fn^l`MnbNsi{=6OF{1Gbm8rp(anKpFx~n+B_Dq|j zmK9KFSh%+(6|%M&tJt23eOARZEFsLA#Wc68@VVd6YVSCy&pguKw+LR^+BzY=rQ2l1t>HuyYQ)Ts0N64u*0)QV$2Q!bOo zs(rB<@Fg;O6Sk^dJMI!i|GvK0nnBx;8Fi*V_1i`@LuS_RujuWPI6{J4;*yvyQRL%k zQ2(mBrmbO(Qs5pIBgbg)j3j_h=oqeSpb}BE7$QFXFQrw1<>5X#Vuy=<*5gdbl^5Rs z3UCFF`ZBYkqkO3yAzq4YZN|0B)_on+DnV2}WTR2lFUxz;xH#h@%h|<_xgguFZcct% z&V?@g!g;Z`Khac|%$e6x7o{C|-G>z{n|OS@dmOT}uxyN1i9dNOXRNYTX#1BKpx2fJ zfXhj(^@Z7m2?;S`WG|8_cu)f#niZL4+CUDE`HP2s=a-bOS;Xo&hVV*&uhtwV{*1;f z&@&B|BNPJ5NeG~-1gnp8{-LAsDNnKn#B-p>zE8Khl#kA>Z0AxiGKHeUPO2I(mPTJ@ z{+SH|*)_S#4{r}23y@yY8bBwnTR2ROvHPY53K#RNS?<-ih6r1bN`#9#s7WH%Z`lFYsUGBVhSw^MF zd#^Hc(c?~XLguHa_>gmRGp_H+r$o3}z>2c*QW3Lqr0 zqh~DqvK#l*RtrgR**SoLMN9;L;QYhla3@yg1U3Nn`ZsKDy|Zf2@|IdXN9moARvJ1# zklx8v_ZYNLF^p`>EQ&r^pOk_yoNg`j5QNMu*`H1{Kt(VKitNHI>c=<0c5)t0cKVg6 z`*5ZY1}<0Q6IMVCuQGB>go3+H(`N6TxX1M&21mnXi<{-AFK>8s=k)#o_2LbZka1}n zd|SCSgf0|1-OGZH7%;ydH);rt=|((U1ldP<9jkOssyC{hX25%GMbnMCb2QQ~pC+Lw z6u)e!1q*af5qLAIiw6jL*>zg(GajH1%Q!EQaxs7!rR9r-zg9)n8ZAg1n8O)2KXifx zWFHACr~kVCQYI|c@=J{Pk2nMfG6@M~i;kd5!VhG;(PeMED*%sap0M|CO?3j;gF0M6rqboQtM;?8v{yo5C!*B2`6sG0f|CgT8zBtFd}4D*ziI(1a<5QP_}M9S zt8aB1$wkMDZ8Nl(hbzhr48^ zyQYY%vmZNNBynO#R7#ZT4Gw?iXAZC!pq={*6nSQXUluBwY4xW9wiwg&G;Up*86vY%DW#)PaQtj&(5c1r1e+;}_{NGM*!kivcZ+engz$G^}+Q_Rf` z$W7-JK2%RLfG0C~^nwFd)aCcXmnL4YNb4S5)blXgYDNFRId#@!&%kk00O;Mp$xElH zDj2RX4!#8%F5!SXH>?fTDzFjiuI{;QJOSHWZcO~Qu?$G{7jUe3DILi&@hou3G&MF7 z^nxS`BB~@p%6XHBb8*frx?W4wT*j&jIft=Pt^;u%nyV-u^TIxpc%%RU=0%OAr{T#| z#U$sT1-qu0S_D=jrt+gCDo8`fhJ)}0C+rD8nx&ykL=b&}z2`rKgQ$*xYbdA$wo0=M wxi}iO!4;{EbO9!B*<{LEFckCs8Q1XhBTh^ZO$vp2A1rcU7XttQ0000004UuhHvj+t literal 0 HcmV?d00001 diff --git a/tutorials/polkadot-sdk/parachains/.pages b/tutorials/polkadot-sdk/parachains/.pages index 920bb7dd9..d8ee84754 100644 --- a/tutorials/polkadot-sdk/parachains/.pages +++ b/tutorials/polkadot-sdk/parachains/.pages @@ -3,4 +3,5 @@ nav: - index.md - local-chain - connect-to-relay-chain + - deploy-to-relay-chain - build-custom-pallet \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages index a2d468201..80c6bbd03 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/.pages @@ -1,6 +1,5 @@ -title: Connect to a Relay Chain +title: Connect to a Local Relay Chain nav: - index.md - - 'Prepare Relay Chain': prepare-relay-chain.md - - 'Prepare Parachain': prepare-parachain.md - - 'Acquire a TestNet Slot': acquire-a-testnet-slot.md + - 'Prepare A Local Relay Chain': prepare-relay-chain.md + - 'Prepare Local Parachain': prepare-parachain.md \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md index 623d77613..105370c44 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain.md @@ -40,7 +40,7 @@ To build the parachain template, follow these steps: 2. Change the directory to the cloned repository ```bash - cd polkadot-sdk-solochain-template + cd polkadot-sdk-parachain-template ``` 3. Build the parachain template collator @@ -108,28 +108,22 @@ To modify the default chain specification, follow these steps: 1. Generate the plain text chain specification for the parachain template node by running the following command ```bash - ./target/release/parachain-template-node build-spec \ - --disable-default-bootnode > plain-parachain-chainspec.json + chain-spec-builder create --relay-chain paseo \ + --para-id 4508 \ + -r \ + default ``` 2. Open the plain text chain specification for the parachain template node in a text editor -3. Set the `para_id` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `para_id` field to `2000`: - - ```json - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:4' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:6:6' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:13:15' - ``` - -4. Set the `parachainId` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `parachainId` field to `2000` +3. Set the `parachainId` to the parachain identifier that you previously reserved. For example, if your reserved identifier is `2000`, set the `parachainId` field to `2000` ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:2' --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:6:15' ``` -5. If you complete this tutorial simultaneously as anyone on the same local network, an additional step is needed to prevent accidentally peering with their nodes. Find the following line and add characters to make your `protocolId` unique +4. If you complete this tutorial simultaneously as anyone on the same local network, an additional step is needed to prevent accidentally peering with their nodes. Find the following line and add characters to make your `protocolId` unique ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:1:2' @@ -137,21 +131,14 @@ To modify the default chain specification, follow these steps: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-2.json:13:15' ``` -6. Save your changes and close the plain text chain specification file +5. Save your changes and close the plain text chain specification file -7. Generate a raw chain specification file from the modified chain specification file by running the following command +6. Generate a raw chain specification file from the modified chain specification file by running the following command ```bash - ./target/release/parachain-template-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json + chain-spec-builder convert-to-raw plain-parachain-chainspec.json ``` - After running the command, you will see the following output: - - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html' - ## Prepare the Parachain Collator With the local relay chain running and the raw chain specification for the parachain template updated, you can start the parachain collator node and export information about its runtime and genesis state. @@ -163,8 +150,8 @@ To prepare the parachain collator to be registered: The relay chain needs the parachain-specific runtime validation logic to validate parachain blocks. You can export the Wasm runtime for a parachain collator node by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-wasm \ - --chain raw-parachain-chainspec.json para-2000-wasm + polkadot-omni-node export-genesis-wasm \ + --chain raw-parachain-chainspec.json para-2000-wasm ``` 2. Generate a parachain genesis state @@ -172,13 +159,13 @@ To prepare the parachain collator to be registered: To register a parachain, the relay chain needs to know the genesis state of the parachain. You can export the entire genesis state—hex-encoded—to a file by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-state \ - --chain raw-parachain-chainspec.json para-2000-genesis-state + polkadot-omni-node export-genesis-state \ + --chain raw-parachain-chainspec.json para-2000-state ``` After running the command, you will see the following output: - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html' + --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-3.html' !!!note You should note that the runtime and state you export must be for the genesis block. You can't connect a parachain with any previous state to a relay chain. All parachains must start from block 0 on the relay chain. See [Convert a Solo Chain](https://docs.substrate.io/reference/how-to-guides/parachains/convert-a-solo-chain/){target=\_blank} for details on how the parachain template was created and how to convert the chain logic—not its history or state migrations—to a parachain. @@ -186,7 +173,7 @@ To prepare the parachain collator to be registered: 3. Start a collator node with a command similar to the following ```bash - ./target/release/parachain-template-node \ + polkadot-omni-node \ --charlie \ --collator \ --force-authoring \ @@ -206,7 +193,7 @@ To prepare the parachain collator to be registered: After running the command, you will see the following output: - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-5.html' + --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/prepare-parachain-4.html' ## Register With the Local Relay Chain @@ -273,7 +260,7 @@ To reset the blockchain state, follow these steps: 2. Purge the parachain collator state by running the following command ```bash - ./target/release/parachain-template-node purge-chain \ + polkadot-omni-node purge-chain \ --chain raw-parachain-chainspec.json ``` diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md index f4aaaa4cf..d5477897f 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md +++ b/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain.md @@ -100,8 +100,7 @@ To start the validator nodes, follow these steps: 1. Generate the plain text chain specification file: ```bash - ./target/release/polkadot build-spec \ - --chain rococo-local-testnet > /tmp/plain-local-chainspec.json + chain-spec-builder create -r default ``` !!! note @@ -109,11 +108,9 @@ To start the validator nodes, follow these steps: 2. Convert the plain text chain specification file to the raw format: - ```bash - ./target/release/polkadot build-spec \ - --chain plain-local-chainspec.json \ - --raw > /tmp/raw-local-chainspec.json - ``` + ```bash + chain-spec-builder convert-to-raw plain-parachain-chainspec.json + ```` 2. Start the first validator using the `alice` account by running the following command: @@ -165,4 +162,4 @@ To start the validator nodes, follow these steps: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/prepare-relay-chain-2.html' -Once the relay chain nodes are running, you can proceed to the next tutorial to [set up a test parachain node and connect it](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain) to the relay chain. +Once the relay chain nodes are running, you can proceed to the next tutorial to [set up a test parachain node and connect it](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain) to the relay chain. \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages new file mode 100644 index 000000000..b477c5370 --- /dev/null +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/.pages @@ -0,0 +1,4 @@ +title: Deploy to a Relay Chain +nav: + - index.md + - 'Deploy on Paseo TestNet': deploy-on-paseo.md \ No newline at end of file diff --git a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md similarity index 59% rename from tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md rename to tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md index 3e2d229ac..456b960a7 100644 --- a/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot.md +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/deploy-on-paseo.md @@ -1,9 +1,9 @@ --- -title: Acquire a TestNet Slot -description: This guide walks you through the journey of securing a TestNet slot on Paseo for your parachain, detailing each step to a successful registration. +title: Deploy on Paseo TestNet +description: This guide walks you through the journey of deploying your Polkadot SDK blockchain on Paseo, detailing each step to a successful TestNet deployment. --- -# Acquire a TestNet Slot +# Deploy on Paseo ## Introduction @@ -14,18 +14,22 @@ This tutorial demonstrates deploying a parachain on a public test network like t Before you start, you need to have the following prerequisites: - You know how to generate and modify chain specification files as described in the [Generate Chain Specs](/develop/parachains/deployment/generate-chain-specs){target=\_blank} section +- You have installed the [`polkadot-omni-node`](https://github.com/paritytech/polkadot-sdk/blob/master/cumulus/polkadot-omni-node/README.md){target=\_blank} and [`chain-spec-builder`](https://crates.io/crates/staging-chain-spec-builder){target=\_blank} binaries - You know how to generate and store keys as described in the [Spin Your Nodes](/tutorials/polkadot-sdk/parachains/local-chain/spin-your-nodes){target=\_blank} tutorial - You have completed the [Prepare a Local Relay Chain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-relay-chain/){target=\_blank} and the [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain/){target=\_blank} tutorials on your local computer ## Get Started with an Account and Tokens -To perform any action on Paseo, you need PAS tokens, which can be requested from the [Polkadot Faucet](https://faucet.polkadot.io/){target=\_blank}. Also, to store the tokens, you must have access to a Substrate-compatible digital currency wallet. Development keys and accounts should never hold assets of actual value and should not be used for production. Many options are available for holding digital currency—including hardware wallets and browser-based applications—and some are more reputable than others. You should do your own research before selecting one. +To perform any action on Paseo, you need PAS tokens, which can be requested from the [Polkadot Faucet](https://faucet.polkadot.io/){target=\_blank}. To store the tokens, you must have access to a Substrate-compatible wallet. Go to the [Wallets and Extensions](https://wiki.polkadot.network/docs/wallets-and-extensions){target=\_blank} page on the Polkadot Wiki to view different options for a wallet, or use the [Polkadot.js browser extension](https://polkadot.js.org/extension/){target=\_blank}, which is suitable for development purposes. -However, you can use the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface to get you started for testing purposes. +!!!warning + Development keys and accounts should never hold assets of actual value and should not be used for production. + +The [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface can be used to get you started for testing purposes. To prepare an account, follow these steps: -1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface and connect to the Paseo network +1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/){target=\_blank} interface and connect to the Paseo network. Alternatively use this link to connect directly to Paseo: [Polkadot.js Apps: Paseo](https://polkadot.js.org/apps/?rpc=wss://paseo.dotters.network#/explorer){target=\_blank} ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.webp) @@ -47,7 +51,7 @@ To prepare an account, follow these steps: ## Reserve a Parachain Identifier -You must reserve a parachain identifier before registering a parathread on Paseo. The steps are similar to the ones you followed in [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain){target=_\blank} to reserve an identifier on the local relay chain. However, for the public TestNet, you'll be assigned the next available identifier. +You must reserve a parachain identifier (ID) before registering your parachain on Paseo. The steps are similar to the ones you followed in [Prepare a Local Parachain](/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/prepare-parachain){target=_\blank} to reserve an identifier on the local relay chain. However, for the public TestNet, you'll be assigned the next available identifier. To reserve a parachain identifier, follow these steps: @@ -57,7 +61,7 @@ To reserve a parachain identifier, follow these steps: ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-5.webp) -2. Register a parathread +2. Register a ParaId 1. Select the **Parathreads** tab 2. Click on the **+ ParaId** button @@ -73,29 +77,26 @@ To reserve a parachain identifier, follow these steps: ![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-8.webp) -## Modify the Chain Specification File +## Generate the Chain Specification The files required to register a parachain must specify the correct relay chain to connect to and the parachain identifier you have been assigned. To make these changes, you must build and modify the chain specification file for your parachain. In this tutorial, the relay chain is `paseo`, and the parachain identifier is `4508`. To modify the chain specification: -1. Generate the plain text chain specification for the parachain template node by running the following command: +1. Generate the plain chain specification for the parachain template node by running the following command. You should find your runtime's Wasm file inside `target/release/wbuild`: ```bash - ./target/release/parachain-template-node build-spec \ - --disable-default-bootnode > plain-parachain-chainspec.json + chain-spec-builder create --relay-chain paseo \ + --para-id 4508 \ + -r \ + default ``` +!!!info + Be sure to use the `*.compact.compressed.wasm` version of your file when generating your chain specification. 2. Open the plain text chain specification for the parachain template node in a text editor -3. Set `relay_chain` to `paseo` and `para_id` to the identifier you've been assigned. For example, if your reserved identifier is 4508, set the `para_id` field to `4508`: - - ```json - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:1:4' - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:23:25' - ``` - -4. Set the `parachainId` to the parachain identifier that you previously reserved: +3. Set the `parachainId` to the parachain identifier that you previously reserved: ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json::2' @@ -103,7 +104,7 @@ To modify the chain specification: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:22:25' ``` -5. Add the public key for your account to the session keys section. Each configured session key will require a running collator: +4. Add the public key for your account to the session keys section. Each configured session key will require a running collator: ```json --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json::2' @@ -111,20 +112,15 @@ To modify the chain specification: --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-1.json:11:25' ``` -6. Save your changes and close the plain text chain specification file +5. Save your changes and close the plain text chain specification file -7. Generate a raw chain specification file from the modified chain specification file: +6. Convert the modified plain chain specification file to a raw chain specification file: ```bash - ./target/release/parachain-template-node build-spec \ - --chain plain-parachain-chainspec.json \ - --disable-default-bootnode \ - --raw > raw-parachain-chainspec.json - ``` - - After running the command, you will see the following output: + chain-spec-builder convert-to-raw plain-parachain-chainspec.json + ```` - --8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-2.html' + You should now see your chain specification containing SCALE-encoded hex values versus plain text. ## Export Required Files @@ -133,29 +129,56 @@ To prepare the parachain collator to be registered on Paseo, follow these steps: 1. Export the Wasm runtime for the parachain by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-wasm \ - --chain raw-parachain-chainspec.json para-4508-wasm + polkadot-omni-node export-genesis-wasm \ + --chain raw-parachain-chainspec.json para-wasm ``` 2. Export the genesis state for the parachain by running a command similar to the following: ```bash - ./target/release/parachain-template-node export-genesis-state \ - --chain raw-parachain-chainspec.json para-4508-state + polkadot-omni-node export-genesis-state \ + --chain raw-parachain-chainspec.json para-state ``` +## Register a Parathread + +Once you have the genesis state and runtime, you can now register these with your parachain ID. + +1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads){target=\_blank} tab, and select **+ Parathread** + +2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-wasm` in the "code" field and `para-state` in the "initial state" field: + +![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-9.webp) + +3. Confirm your details and **+ Submit** button, where there should be a new Parathread with your parachain ID and an active **Deregister** button: + +![](/images/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/acquire-a-testnet-slot-10.webp) + +Your parachain's runtime logic and genesis are now part of the relay chain. The next step is to ensure you are able to run a collator to produce blocks for your parachain. + ## Start the Collator Node +Before starting a collator, generate a node key. A node key is responsible for communicating with other nodes over Libp2p: + +```bash +polkadot-omni-node key generate-node-key \ + --base-path /tmp/parachain/pubs-demo \ + --chain raw-parachain-chainspec.json +``` + +After running the command, you should see the following output, indicating the base path now has a suitable node key: + +--8<-- 'code/tutorials/polkadot-sdk/parachains/connect-to-relay-chain/acquire-a-testnet-slot/deploy-on-paseo-3.html' + You must have the ports for the collator publicly accessible and discoverable to enable parachain nodes to peer with Paseo validator nodes to produce blocks. You can specify the ports with the `--port` command-line option. For example, you can start the collator with a command similar to the following: ```bash -./target/release/parachain-template-node --collator \ +polkadot-omni-node --collator \ --chain raw-parachain-chainspec.json \ --base-path /tmp/parachain/pubs-demo \ --port 50333 \ --rpc-port 8855 \ -- \ - --execution wasm \ --chain paseo \ --port 50343 \ --rpc-port 9988 @@ -163,11 +186,13 @@ You must have the ports for the collator publicly accessible and discoverable to In this example, the first `--port` setting specifies the port for the collator node and the second `--port` specifies the embedded relay chain node port. The first `--rpc-port` setting specifies the port you can connect to the collator. The second `--rpc-port` specifies the port for connecting to the embedded relay chain. -## Obtain Coretime +## Producing Blocks With your parachain collator operational, the next step is acquiring coretime. This is essential for ensuring your parachain's security through the relay chain. [Agile Coretime](https://wiki.polkadot.network/docs/learn-agile-coretime){target=\_blank} enhances Polkadot's resource management, offering developers greater economic adaptability. Once you have configured your parachain, you can follow two paths: - Bulk coretime is purchased via the Broker pallet on the respective coretime system parachain. You can purchase bulk coretime on the coretime chain and assign the purchased core to the registered `ParaID` - On-demand coretime is ordered via the `OnDemandAssignment` pallet, which is located on the respective relay chain +Once coretime is correctly assigned to your parachain, whether bulk or on-demand, blocks should be produced (provided your collator is running). + For more information on coretime, refer to the [Coretime](/polkadot-protocol/architecture/system-chains/coretime/){target=\_blank} documentation. diff --git a/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md new file mode 100644 index 000000000..d58493cec --- /dev/null +++ b/tutorials/polkadot-sdk/parachains/deploy-to-relay-chain/index.md @@ -0,0 +1,25 @@ +--- +title: Deploy on a Relay Chain +description: Learn how to deploy on a live relay chain including, how to acquire Coretime, manage / setup collators, and what artifacts are needed to deploy your parachain. +hide: + - feedback +template: index-page.html +--- + +# Deploy to a Relay Chain + +Deploying to a relay chain generally involves the following steps: + +1. Reserving your Parachain's ID +2. Uploading the genesis state and runtime +3. Ensuring you have collators ready to deploy (or at least one running locally to produce blocks) +4. Obtaining Coretime - Either Bulk (long term block production) or On Demand (ordering blocks as you need) + +Depending on the relay chain you are deploying on, the costs for registering the runtime and genesis state will vary. If you are registering on a TestNet like [Paseo](/develop/networks/#paseo), you will have to apply for a slot through a form or ask for enough PAS to register your runtime code: + +- [Paseo Parachain Onboarding Form](https://github.com/paseo-network/support/issues/new?assignees=al3mart%2Chbulgarini%2Ceduclerici-zondax&labels=onboard-para&projects=&template=onboard-parachain.yaml&title=%5BParachain+Onboarding+%7C+Slot+Request%5D+ParaId%3A+%3Cyour_paraId%3E){target=\_blank} +- [Paseo Support Matrix Chat Room](https://matrix.to/#/#paseo-testnet-support:parity.io){target=\_blank} + +## In This Section + +:::INSERT_IN_THIS_SECTION::: \ No newline at end of file